Skip to content

Commit 0e7378a

Browse files
kelvinBenkelvinBen
authored andcommitted
1. 添加ghproxy代理支持
2. 添加重试次数 3. 添加超时时间
1 parent 37833f9 commit 0e7378a

File tree

1 file changed

+81
-54
lines changed

1 file changed

+81
-54
lines changed

app.py

Lines changed: 81 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,56 @@
1010
import platform
1111
import getopt
1212
import config
13-
1413
from contextlib import closing
14+
from requests.adapters import HTTPAdapter
1515

16+
proxy_flag = False
1617
proxies = {}
1718
headers = {
1819
"Content-Type": "application/json"
1920
}
21+
ghproxy = "https://ghproxy.com/"
22+
session = requests.session()
23+
session.proxies = proxies
24+
session.mount("http://", HTTPAdapter(max_retries=5))
25+
session.mount("https://", HTTPAdapter(max_retries=5))
2026

21-
def __set_proxy__(proxy):
22-
if proxy or config.proxy:
23-
# 配置 requests 代理
24-
proxies["http"] = proxy
25-
proxies["https"] = proxy
26-
# 配置git代理
27-
os.system("git config --global http.https://github.com.proxy %s" % (proxy))
28-
os.system("git config --global https.https://github.com.proxy %s" % (proxy))
27+
def __set__flag__(flag):
28+
global proxy_flag
29+
proxy_flag = flag
2930

31+
def __set_proxy__(proxy):
32+
if not(proxy or config.proxy):
33+
return
3034

35+
if proxy == ghproxy or config.proxy == ghproxy:
36+
__set__flag__(True)
37+
return
38+
39+
# 配置 requests 代理
40+
proxies["http"] = proxy
41+
proxies["https"] = proxy
42+
# 配置git临时代理
43+
os.system("git config --global http.https://github.com.proxy %s" % (proxy))
44+
os.system("git config --global https.https://github.com.proxy %s" % (proxy))
45+
46+
def __requsets__(url, headers=None, stream=False):
47+
try:
48+
if stream:
49+
headers["Content-Type"] = "application/octet-stream"
50+
51+
resp=session.get(url, headers=headers,stream=True, timeout=(10,20))
52+
if resp.status_code == requests.codes.ok:
53+
return resp
54+
except requests.exceptions.ConnectTimeout as e:
55+
print("链接github.com超时,请使用-p参数或者在config.py中配置代理后重试!!!")
56+
exit()
57+
finally:
58+
resp.close()
59+
3160
def start(out_path, proxy, token) -> None:
32-
__set_proxy__(proxy) # 启动代理
61+
__set_proxy__(proxy)
62+
3363
if token or config.github_token:
3464
headers["Authorization"] = ("token %s") % (token)
3565

@@ -45,7 +75,7 @@ def start(out_path, proxy, token) -> None:
4575
dir_path = os.path.join(out_path, dir_name)
4676

4777
if not os.path.exists(dir_path):
48-
os.makedirs(dir_path) # 创建分类目录
78+
os.makedirs(dir_path)
4979

5080
tools_list = json_obj["tools_list"]
5181
for tools_name, tools_json_obj in tools_list.items():
@@ -65,6 +95,8 @@ def clone_source_code(tools_path, dir_path, tools_url) -> None:
6595
'''
6696
if not os.path.exists(tools_path): # 使用clone拉取主分支代码
6797
git_url = tools_url + ".git"
98+
if proxy_flag:
99+
git_url = ghproxy + tools_url + ".git"
68100
os.chdir(dir_path)
69101
os.system(("git clone %s") % git_url)
70102
else: # 更新代码到最新版本
@@ -90,33 +122,31 @@ def download_code_or_binary(tools_path, tools_url, platforms, tools_type) -> Non
90122
api_url = tools_url.replace("www", "")
91123
api_url = tools_url.replace("github.com", "api.github.com/repos") + "/releases/latest"
92124

93-
with closing(requests.get(url=api_url, proxies=proxies)) as resp:
94-
if not (resp.status_code == requests.codes.ok):
95-
return
96-
97-
repos_json_obj = resp.json()
98-
try:
99-
tools_vesion = str(repos_json_obj["tag_name"])
100-
assets_list = repos_json_obj["assets"]
101-
zipball_url = repos_json_obj["zipball_url"] # 源代码
102-
except KeyError as e:
103-
# 未发布正式版本就忽略
104-
return
105-
106-
# 文件不存在,创建并下载
107-
if not os.path.exists(tools_path):
108-
os.makedirs(tools_path)
109-
tools_name = ""
110-
tools_download_url = zipball_url
111-
if tools_type == "binary":
112-
for assets in assets_list:
113-
browser_download_url = assets["browser_download_url"]
114-
if file_name in browser_download_url:
115-
tools_name = assets["name"]
116-
tools_download_url = browser_download_url
117-
118-
# TODO 是否需要更新二进制文件?期待反馈
119-
download_tools(tools_download_url, tools_path, tools_name, tools_vesion)
125+
resp = __requsets__(api_url,headers)
126+
repos_json_obj = resp.json()
127+
128+
try:
129+
tools_vesion = str(repos_json_obj["tag_name"])
130+
assets_list = repos_json_obj["assets"]
131+
zipball_url = repos_json_obj["zipball_url"] # 源代码
132+
except KeyError as e:
133+
# 未发布正式版本就忽略
134+
return
135+
136+
# 文件不存在,创建并下载
137+
if not os.path.exists(tools_path):
138+
os.makedirs(tools_path)
139+
tools_name = ""
140+
tools_download_url = zipball_url
141+
if tools_type == "binary":
142+
for assets in assets_list:
143+
browser_download_url = assets["browser_download_url"]
144+
if file_name in browser_download_url:
145+
tools_name = assets["name"]
146+
tools_download_url = browser_download_url
147+
148+
# TODO 是否需要更新二进制文件?期待反馈
149+
download_tools(tools_download_url, tools_path, tools_name, tools_vesion)
120150

121151
def download_tools(tools_download_url, tools_path, tools_name, tools_vesion) -> None:
122152
new_file_name = tools_name + "_" + tools_vesion
@@ -130,22 +160,19 @@ def download_tools(tools_download_url, tools_path, tools_name, tools_vesion) ->
130160
if os.path.exists(tools_file_path):
131161
return
132162

133-
with closing(requests.get(tools_download_url, proxies=proxies, stream=True)) as resp:
134-
current_download_size = 0 # 已下载大小
135-
chunk_size = 1024 * 1024 * 5 # 单次5MB大小的下载
136-
content_length = int(resp.headers["content-length"])
137-
try:
138-
if resp.status_code == requests.codes.ok:
139-
print('文件: {} 正在下载中, 总大小为: {size:.2f} MB'.format(tools_name, size = content_length / 1024 / 1024))
140-
with open(file=tools_file_path,mode="wb",encoding="utf8") as f:
141-
for data in resp.iter_content(chunk_size=chunk_size):
142-
current_download_size += len(data)
143-
f.write(data)
144-
print('\r' + '下载进度: %s%.2f%%' % ('=' * int(current_download_size * 50 / content_length), float(current_download_size / content_length * 100)), end=' ')
145-
except Exception as e:
146-
pass
147-
finally:
148-
resp.close()
163+
resp = __requsets__(tools_download_url, headers, True)
164+
current_download_size = 0 # 已下载大小
165+
chunk_size = 1024 * 1024 * 5 # 单次5MB大小的下载
166+
content_length = int(resp.headers["content-length"])
167+
try:
168+
print('文件: {} 正在下载中, 总大小为: {size:.2f} MB'.format(tools_name, size = content_length / 1024 / 1024))
169+
with open(file=tools_file_path,mode="wb",encoding="utf8") as f:
170+
for data in resp.iter_content(chunk_size=chunk_size):
171+
current_download_size += len(data)
172+
f.write(data)
173+
print('\r' + '下载进度: %s%.2f%%' % ('=' * int(current_download_size * 50 / content_length), float(current_download_size / content_length * 100)), end=' ')
174+
except Exception as e:
175+
pass
149176

150177
def get_cpu_type():
151178
sys_platform = sys.platform

0 commit comments

Comments
 (0)