update_firefox_version.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env python
  2. # SPDX-License-Identifier: AGPL-3.0-or-later
  3. """Fetch firefox useragent signatures
  4. Output file: :origin:`searx/data/useragents.json` (:origin:`CI Update data ...
  5. <.github/workflows/data-update.yml>`).
  6. """
  7. # pylint: disable=use-dict-literal
  8. import json
  9. import re
  10. from urllib.parse import urlparse, urljoin
  11. from packaging.version import parse
  12. import requests
  13. from lxml import html
  14. from searx.data import data_dir
  15. DATA_FILE = data_dir / 'useragents.json'
  16. URL = 'https://ftp.mozilla.org/pub/firefox/releases/'
  17. RELEASE_PATH = '/pub/firefox/releases/'
  18. NORMAL_REGEX = re.compile(r'^[0-9]+\.[0-9](\.[0-9])?$')
  19. # BETA_REGEX = re.compile(r'.*[0-9]b([0-9\-a-z]+)$')
  20. # ESR_REGEX = re.compile(r'^[0-9]+\.[0-9](\.[0-9])?esr$')
  21. #
  22. useragents = {
  23. # fmt: off
  24. "versions": (),
  25. "os": ('Windows NT 10.0; Win64; x64',
  26. 'X11; Linux x86_64'),
  27. "ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}",
  28. # fmt: on
  29. }
  30. def fetch_firefox_versions():
  31. resp = requests.get(URL, timeout=2.0)
  32. if resp.status_code != 200:
  33. # pylint: disable=broad-exception-raised
  34. raise Exception("Error fetching firefox versions, HTTP code " + resp.status_code) # type: ignore
  35. dom = html.fromstring(resp.text)
  36. versions = []
  37. for link in dom.xpath('//a/@href'):
  38. url = urlparse(urljoin(URL, link))
  39. path = url.path
  40. if path.startswith(RELEASE_PATH):
  41. version = path[len(RELEASE_PATH) : -1]
  42. if NORMAL_REGEX.match(version):
  43. versions.append(parse(version))
  44. list.sort(versions, reverse=True)
  45. return versions
  46. def fetch_firefox_last_versions():
  47. versions = fetch_firefox_versions()
  48. result = []
  49. major_last = versions[0].major
  50. major_list = (major_last, major_last - 1)
  51. for version in versions:
  52. major_current = version.major
  53. minor_current = version.minor
  54. if major_current in major_list:
  55. user_agent_version = f'{major_current}.{minor_current}'
  56. if user_agent_version not in result:
  57. result.append(user_agent_version)
  58. return result
  59. if __name__ == '__main__':
  60. useragents["versions"] = fetch_firefox_last_versions()
  61. with DATA_FILE.open('w', encoding='utf-8') as f:
  62. json.dump(useragents, f, indent=4, sort_keys=True, ensure_ascii=False)