-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGet_Miui_All.py
executable file
·208 lines (181 loc) · 9.3 KB
/
Get_Miui_All.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# -*- coding: utf-8 -*-
import re, sys, argparse, requests, itertools, multiprocessing
from functools import partial
from bs4 import BeautifulSoup
from functools import cmp_to_key
head = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36'}
class MIUI_ROM:
def __init__(self):
self.region_map={'国行版': 'CN', '俄罗斯版 (俄版) (RU)': 'RU', '全球版': 'Global', '印度尼西亚版 (印尼版) (ID)': 'ID', '印度版 (IN)': 'IN', '欧洲版 (欧版) (EEA)': 'EEA', '土耳其版 (TR)': 'TR', '台湾版 (台版) (TW)': 'TW', '日本版 (日版) (JP)': 'JP', '新加坡版': 'SG'}
self.model_link_table_dic=self.get_model_link_table()
def get_model_link_table(self):
link = 'https://xiaomirom.com/series/'
requests.packages.urllib3.disable_warnings()#屏蔽warning信息
response = requests.get(link, headers = head, verify = False)
if not response.status_code == 200:
raise RuntimeError(link+" "+"请求异常!")
soup=BeautifulSoup(response.content,'html.parser')
link_table = soup.find_all(name='dl',attrs={'class':'row series__dl'})[0].contents
model_link_table_dic = {}
model_name_pattern = re.compile(r"[(](.*)[)]")
for i in range(0,len(link_table),2):
model_name = re.findall(model_name_pattern,link_table[i].a.contents[0])[0]
a_tags = link_table[i+1].find_all(name='a')
model_region_link_dic = {}
for a in a_tags:
region = a.contents[0]
model_region_link_dic[self.region_map[region]]=a.attrs["href"]
model_link_table_dic[model_name] = model_region_link_dic
'''
the dictionary like this:
{
<model_name>:{
<region>:<link>
}
}
'''
return model_link_table_dic
def get_rom_link(self,model_version_link):
miui_rom_link ="https://bigota.d.miui.com/"
requests.packages.urllib3.disable_warnings()#屏蔽warning信息
response = requests.get(model_version_link, headers = head, verify = False)
if not response.status_code == 200:
raise RuntimeError(model_version_link+" "+"请求异常!")
soup = BeautifulSoup(response.content,'html.parser')
try:
rom_div = soup.find_all(name='div',attrs={'class':'content mb-5 rom-body'})[0].contents
except IndexError:
rom_div = soup.find_all(name='div',attrs={'class':'content mb-5 featured-body'})[0].contents
finally:
# rom_div.find_all
pattern = re.compile(r'<p>(.*?)<a(.*?)>下载</a></p>')
rom_link_dic={"recovery":{"stable":[],"beta":[]}, "fastboot":[]}
for tag in rom_div:
rom_name = re.findall(pattern,str(tag))
if not rom_name == []:
rom_name = rom_name[0][0][:-3]
rom_version = rom_name.split("_")[2]
rom_link = miui_rom_link+rom_version+"/"+rom_name
# print(rom_name.split(".")[-1])
if rom_name.split(".")[-1] == "zip":
if self.contain_english(rom_version):
rom_link_dic["recovery"]["stable"].append(rom_link)
else:
rom_link_dic["recovery"]["beta"].append(rom_link)
else:
rom_link_dic["fastboot"].append(rom_link)
return rom_link_dic
def query_link(self,model_name,region,rom_cleases,rom_version=None):
'''
该函数用于查询miui rom链接
参数解释:
model_name:机型代号,如:小米10的代号就是umi
region:机型地区,CN EEN IN 等等
rom_cleases:rom类型 recovery或fastboot
rom_version: 卡刷包(recovery)版本 beta 或 stable 注:线刷包无该选项
'''
if not model_name in self.model_link_table_dic.keys():
print("Already have:")
print(list(self.model_link_table_dic.keys()))
print()
print()
raise KeyError("This model type was not found")
if region in self.model_link_table_dic[model_name].keys():
rom_link_dic=self.get_rom_link(self.model_link_table_dic[model_name][region])
else:
print("Already have:")
print(list(self.model_link_table_dic[model_name].keys()))
print()
print()
raise KeyError("This region type was not found")
if rom_cleases in rom_link_dic.keys():
rom_link_list=rom_link_dic[rom_cleases]
else:
print("Already have:")
print(list(rom_link_dic.keys()))
print()
print()
raise KeyError("This rom classes was not found")
if rom_cleases == "recovery":
if rom_version in rom_link_dic[rom_cleases].keys():
rom_link_list=rom_link_dic[rom_cleases][rom_version]
else:
print("Already have:")
print(list(rom_link_dic[rom_cleases].keys()))
print()
print()
raise KeyError("This rom version was not found")
# rom_link_list.sort(key=lambda x: x.split("/")[3],reverse = True)
rom_link_list.sort(key=cmp_to_key(self.f),reverse = True)
return rom_link_list
def extendList(self, List, appendList = True, appendOther = False):
newList = []
for lists in List:
if isinstance(lists, list) and appendList:
newList.extend(lists)
elif appendOther:
newList.append(lists)
return(newList)
def query_link_new(self, device, region, cleases, version, lastest):
lists = self.query_link(device, region, cleases, version)
if lists:
if lastest == 'yes':
return([lists[0]])
else:
return(lists)
else:
return([])
def query_link_print(self, devices, region, cleases, version, lastest):
versionTemp = 'stable' if version == 'dev' else version
getLinks = []
pool = multiprocessing.Pool(multiprocessing.cpu_count())##创建进程池
func = partial(self.query_link_new, region = region, cleases = cleases, version = versionTemp, lastest = lastest)##固定不变的参数
lists = self.extendList(pool.map(func, devices.split(",")))##向进程池传入函数及其参数,让map执行
getLinks.extend(lists)
pool.close()##不再创建进程池
pool.join()##加入进程池
getNewLinks = []
##从稳定版中分离开发版
if version == 'dev':
for getLink in getLinks:
cuts = getLink.split('/')
if cuts and cuts[3].endswith('.DEV'): getNewLinks.append(getLink)
elif version == 'stable':
for getLink in getLinks:
cuts = getLink.split('/')
if cuts and not cuts[3].endswith('.DEV'): getNewLinks.append(getLink)
##非内测版处理
if version != 'beta': getLinks = getNewLinks
##替换//bigota.d.为//hugeota.d.
newLinkList = []
[newLinkList.append(link.replace('//bigota.d.', '//hugeota.d.')) for link in getLinks]
return(newLinkList)
def f(self,a,b):
return self.version_comparetor(a.split("/")[3],b.split("/")[3])
def version_comparetor(self,a, b):
if len(a)==0: return 0
if a.split(".")[0] == b.split(".")[0]:
return self.version_comparetor('.'.join(a.split(".")[1:]), '.'.join(b.split(".")[1:]))
if not self.contain_english(a.split(".")[0]):
if int(a.split(".")[0]) > int(b.split(".")[0]):
return 1
elif int(a.split(".")[0]) < int(b.split(".")[0]):
return -1
else:
if a.split(".")[0] > b.split(".")[0]:
return 1
elif a.split(".")[0] < b.split(".")[0]:
return -1
def contain_english(self,string):
return bool(re.search('[A-Z]', string))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description = '一键获取小米机型更新地址')
#type是要传入的参数的数据类型 help是该参数的提示信息
parser.add_argument('--device', '-d', type = str, required = True, help = '机型代号 格式:umi, 多个:umi,cmi,lmi')
parser.add_argument('--region', '-r', type = str, required = False, default = 'CN', help = '地区代号, 请输入地区代号')
parser.add_argument('--cleases', '-c', type = str, required = False, default = 'recovery', help = 'ROM包类型, 卡刷包(recovery)/线刷包(fastboot), 绝大部分开发版机型无线刷包')
parser.add_argument('--version', '-v', type = str, required = False, default = 'beta', help = 'ROM发版类型, 稳定版(stable)/开发版(dev)/内测版(beta)')
parser.add_argument('--lastest', '-l', type = str, required = False, default = 'no', help = '是否获取最新版, 是(yes)/否(no)')
args = parser.parse_args()
getLinks = MIUI_ROM().query_link_print(args.device, args.region, args.cleases, args.version, args.lastest)
[print(link) for link in getLinks]