download.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/env python3
  2. import json
  3. import os
  4. import re
  5. from androguard.core.bytecodes.apk import APK, get_apkid
  6. import requests
  7. import yaml
  8. import apkpure
  9. import evozi
  10. with open("apps.yml" ,'r') as f:
  11. apps = yaml.safe_load(f)
  12. def download():
  13. for app_id, app in apps.items():
  14. print(app_id)
  15. if "download" in app:
  16. r = requests.get(app["download"])
  17. r.raise_for_status()
  18. match = re.search(r"^.*(https?://.+?\.apk).*$", r.text)
  19. apk_url = match.groups()[0]
  20. r = requests.get(apk_url)
  21. r.raise_for_status()
  22. apk_data = r.content
  23. print(f"Downloaded from {apk_url}")
  24. else:
  25. try:
  26. apk_data = apkpure.get(app_id)
  27. print(f"Downloaded from apkpure.com")
  28. except apkpure.DownloadError:
  29. apk_data = evozi.get(app_id)
  30. print(f"Downloaded from apps.evozi.com")
  31. apk = APK(apk_data, raw=True)
  32. if not apk.valid_apk:
  33. raise RuntimeError("No valid apk downloaded!")
  34. # check certificate fingerprint
  35. if "fingerprint" in app:
  36. certs = apk.get_certificates()
  37. if len(certs) != 1:
  38. raise RuntimeError("There should be exactly one certificate in apk.")
  39. fingerprint = certs[0].sha256_fingerprint.lower().replace(' ','')
  40. if fingerprint != app["fingerprint"]:
  41. raise RuntimeError("Certificate fingerprint doesn't match.")
  42. else:
  43. print("Skipping certificate fingerprint check.")
  44. # save apk
  45. version = apk.get_androidversion_name()
  46. code = apk.get_androidversion_code()
  47. os.makedirs("fdroid/repo", exist_ok=True)
  48. path = f"fdroid/repo/{app_id}_{code}_{version}.apk"
  49. with open(path, "wb") as f:
  50. f.write(apk_data)
  51. print(f"Done. Saved to {path}.")
  52. # write metadata yaml
  53. if "metadata" in app:
  54. os.makedirs("fdroid/metadata", exist_ok=True)
  55. with open(f"fdroid/metadata/{app_id}.yml", 'w') as f:
  56. yaml.dump(app["metadata"], f)
  57. print(f"Metadata written to fdroid/metadata/{app_id}.yml.")
  58. if __name__ == "__main__":
  59. download()