瀏覽代碼

apps.evozi.com as fallback mirror

Peter Kaplan 4 年之前
父節點
當前提交
ce7bfdcce4
共有 3 個文件被更改,包括 44 次插入6 次删除
  1. 9 5
      apkpure.py
  2. 8 1
      download.py
  3. 27 0
      evozi.py

+ 9 - 5
apkpure.py

@@ -9,6 +9,9 @@ import zipfile
 from selenium import webdriver
 
 
+class DownloadError(Exception):
+    pass
+
 def apk_from_xapk(xapk_data, app_id):
     """This is necessary because on apkpure.com uses a custom package format xapk for some apps."""
     with io.BytesIO(xapk_data) as stream:
@@ -17,8 +20,6 @@ def apk_from_xapk(xapk_data, app_id):
                 return f.read()
 
 def get(app_id):
-    dl_url = f"https://apkpure.com/_/{app_id}/download?from=details"
-
     options = webdriver.FirefoxOptions()
     options.add_argument("--headless")
 
@@ -35,17 +36,20 @@ def get(app_id):
         pass
 
     with webdriver.Firefox(options=options, firefox_profile=profile) as driver:
-        driver.get(dl_url)
+        driver.get(f"https://apkpure.com/_/{app_id}/download?from=details")
         dl_page = driver.page_source
     
         t = datetime.datetime.now()
         while True:
             p = Path('/tmp/tempapk/')
-            p = list(p.iterdir())
+            try:
+                p = list(p.iterdir())
+            except FileNotFoundError:
+                raise DownloadError
             if len(p) == 1:
                 break
             elif datetime.datetime.now()-t > datetime.timedelta(seconds=60):
-                raise RuntimeError('Download failed')
+                raise DownloadError
             time.sleep(1)
 
     with open(p[0], 'rb') as f:

+ 8 - 1
download.py

@@ -9,6 +9,7 @@ import requests
 import yaml
 
 import apkpure
+import evozi
 
 
 with open("apps.yml" ,'r') as f:
@@ -26,9 +27,15 @@ def download():
             r = requests.get(apk_url)
             r.raise_for_status()
             apk_data = r.content
+            print(f"Downloaded from {apk_url}")
 
         else:
-            apk_data = apkpure.get(app_id)
+            try:
+                apk_data = apkpure.get(app_id)
+                print(f"Downloaded from apkpure.com")
+            except apkpure.DownloadError:
+                apk_data = evozi.get(app_id)
+                print(f"Downloaded from apps.evozi.com")
 
         apk = APK(apk_data, raw=True)
         if not apk.valid_apk:

+ 27 - 0
evozi.py

@@ -0,0 +1,27 @@
+import datetime
+import re
+import time
+
+import requests
+from selenium import webdriver
+
+def get(app_id):
+    options = webdriver.FirefoxOptions()
+    options.add_argument("--headless")
+
+    with webdriver.Firefox(options=options) as driver:
+        driver.get(f"https://apps.evozi.com/apk-downloader/?id={app_id}")
+        driver.find_element_by_class_name("btn").click()
+
+        t = datetime.datetime.now()
+        while True:
+            try:
+                dl_url = "https:" + re.search(r'//storage.+?\.apk', driver.page_source).group()
+                break
+            except AttributeError:
+                pass
+            if datetime.datetime.now()-t > datetime.timedelta(seconds=10):
+                raise RuntimeError('Download failed')
+            time.sleep(1)
+
+    return requests.get(dl_url).content