-
Notifications
You must be signed in to change notification settings - Fork 3
/
chrome_downloader.py
100 lines (79 loc) · 3.2 KB
/
chrome_downloader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import sys
import os
import requests
import zipfile
class Downloader:
def __init__(self, os_type="Linux_x64"):
self.position_lookup_url = "https://omahaproxy.appspot.com/deps.json"
self.download_url = "https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o"
self.os = os_type
self.base = "chrome"
if not os.path.exists(self.base):
os.makedirs(self.base)
def get_position(self, version):
url = self.position_lookup_url + f"?version={version}"
payload={}
headers = {}
r = requests.request("GET", url, headers=headers, data=payload)
try:
return r.json()["chromium_base_position"]
except:
return None
def download(self, url, name):
r = requests.request("GET", url)
try:
r.raise_for_status()
with open(name, "wb") as f:
for chunk in r:
f.write(chunk)
return True
except:
return False
def unzip_and_rename(self, file_path, name):
os.system(f"cd {self.base} && unzip {file_path} > /dev/null")
source = "chrome-linux"
os.rename(os.path.join(self.base, source), os.path.join(self.base, name))
def driver_unzip_and_rename(self, file_path, name):
os.system(f"cd {self.base} && unzip {file_path} > /dev/null")
source = "chromedriver_linux64"
driver = "chromedriver"
os.system(f"cd {self.base} && mv {source}/{driver} {name} && rmdir {source}")
def download_binary(self, version):
prefix = "Linux_x64"
postfix = "chrome-linux.zip"
driver = "chromedriver_linux64.zip"
print(f"[+] start download chrome binary")
print(f"[+] get position - {version}")
position = self.get_position(version)
if position is None:
print(f"[-] fail to get position {version}")
return None
print(f"[+] find position - {position}")
base_url = f"{self.download_url}/{prefix}%2F"
download_flag = False
found = 0
for i in range(100):
url = f"{base_url}{int(position)+i}%2F{postfix}?alt=media"
name = f"{version}_{int(position)+i}"
zip_name = f"{name}.zip"
if self.download(url, os.path.join(self.base, zip_name)):
download_flag = True
found = int(position)+i
break
if download_flag:
print(f"[+] download success - {os.path.join(self.base, zip_name)}")
else:
print(f"[-] download fail")
return None
self.unzip_and_rename(zip_name, name)
driver_url = f"{base_url}{found}%2F{driver}?alt=media"
driver_name = f"{name}_driver.zip"
self.download(driver_url, os.path.join(self.base, driver_name))
print(f"[+] download success - {os.path.join(self.base, driver)}")
self.driver_unzip_and_rename(driver_name, name)
print(f"[+] chrome is ready - {os.path.join(self.base, name)}")
def main(argv):
downloader = Downloader(os_type="Linux_x64")
downloader.download_binary(argv[1])
if __name__ == "__main__":
main(sys.argv)