diff --git a/get_version.py b/get_version.py new file mode 100644 index 0000000..abb73b3 --- /dev/null +++ b/get_version.py @@ -0,0 +1,190 @@ +import requests +import re +import json +import time +from lxml import etree + +GLOBAL_HEADER = { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" +} + +# 定义需要检测的版本号范围 +min_version = [4, 17, 0] +max_version = [4, 20, 0] + +# 定义请求延时时间(秒) +GLOBAL_REQUEST_DELAY = 0.5 + + +def get_js_url(): + """请求百度网盘下载页,获取存在下载链接的js文件""" + r = requests.get( + "https://pan.baidu.com/download", + headers=GLOBAL_HEADER, + ) + e = etree.HTML(r.text, parser=None) + url = "" + + # 获取包含链接的js文件 + for i in e.xpath("//script/@src"): + if re.search("https:\\/\\/.*chunk-common.*\\.js", i): + url = i + # print(url) + return url + + +def append_json(json_file_name: str, add): + """为Json添加并且去重""" + file = None + with open(json_file_name, "r") as f: + file = json.load(f) + # print("file=", file) + + u_file = [] + for i in file: + if i not in u_file: + u_file.append(i) + + u_file.append(add) + + # print("ufile=", u_file) + + with open(json_file_name, "w") as f: + f.write(json.dumps(u_file, sort_keys=True, indent=4)) + return + + +def parse_url_from_json(): + l = "" + with open("url.json", "r") as f: + l = json.load(f) + return l + + +def parse_url_from_js(): + """从js文件中提取下载的链接并且去重,写入文件""" + url = get_js_url() + d_url = "" + r = requests.get( + url, + headers=GLOBAL_HEADER, + ) + # 过滤链接 + d_url = re.findall( + '(?:link|url(?:_[0-9])?):"https://[a-zA-Z/\\.]*?/netdisk/[a-zA-Z10-9/\\._-]*?(?=")', + r.text, + ) + + # 清理 + for i in range(len(d_url)): + d_url[i] = re.sub('(link|url(?:_[0-9])?):"', "", d_url[i]) + + # 去重 + u_url = [] + for i in d_url: + if i not in u_url: + u_url.append(i) + + with open("url.json", "w") as f: + f.write(json.dumps(u_url, sort_keys=True, indent=4)) + + return + + +def make_info_json(urls: list): + """保存为Json文件""" + # print("urls:", urls) + l_url = urls[-3:] + # print(l_url) + j = [] + for i in l_url: + j.append( + { + "version": re.findall("(?<=/)((?:[0-9]{1,2}(?:\\.)?){1,3})(?=/)", i)[0], + "arch": re.findall("(amd64|arm64|x86_64)", i)[0], + "pak": re.findall("(rpm|deb)", i)[0], + "url": i, + }, + ) + # print(j) + with open("info.json", "w") as f: + f.write(json.dumps(j, sort_keys=True, indent=4)) + return + + +def make_url_temple(): + l = "" + with open("url.json", "r") as f: + l = json.load(f) + url = "" + for i in l: + if re.search("amd64", i) != None and re.search("deb", i) != None: + url = i + break + # print(url) + url = re.sub("amd64", "arm64", url) + url = re.sub("(?<=[_/])((?:[0-9]{1,2}(?:\\.)?){1,3})(?=[_/])", "{0}", url) + # print(url) + return url + + +def check_version(version): + """检测指定版本号是否可用""" + url = make_url_temple().format(".".join(str(v) for v in version)) + print("Getting {0}".format(url)) + response = requests.get( + url, + headers=GLOBAL_HEADER, + ) + if response.status_code == 200: + return True + else: + return False + + +def find_latest_version(min_version, max_version): + """寻找最新版本号""" + for i in range(max_version[0], min_version[0] - 1, -1): + for j in range(20, -1, -1): + if j > max_version[1] and i == max_version[0]: + continue + for k in range(20, -1, -1): + if k > max_version[2] and j == max_version[1] and i == max_version[0]: + continue + version = [i, j, k] + # 检测指定版本号是否可用 + if check_version(version): + print( + "version {0} is available".format( + ".".join(str(v) for v in version) + ) + ) + time.sleep(GLOBAL_REQUEST_DELAY) + # 判断是否为最新版本 + if ( + version[0] > min_version[0] + or version[1] > min_version[1] + or version[2] > min_version[2] + ): + append_json( + "url.json", + make_url_temple().format(".".join(str(v) for v in version)), + ) + return version + else: + print( + "version {0} is not available".format( + ".".join(str(v) for v in version) + ) + ) + time.sleep(GLOBAL_REQUEST_DELAY) + # 找不到可用版本号,返回None + return None + + +if __name__ == "__main__": + parse_url_from_js() + find_latest_version(min_version, max_version) + urls = parse_url_from_json() + make_info_json(urls) + pass diff --git a/info.json b/info.json new file mode 100644 index 0000000..fa20d6c --- /dev/null +++ b/info.json @@ -0,0 +1,20 @@ +[ + { + "arch": "x86_64", + "pak": "rpm", + "url": "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.11.5/baidunetdisk-4.11.5.x86_64.rpm", + "version": "4.11.5" + }, + { + "arch": "amd64", + "pak": "deb", + "url": "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.11.5/baidunetdisk_4.11.5_amd64.deb", + "version": "4.11.5" + }, + { + "arch": "arm64", + "pak": "deb", + "url": "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.17.7/baidunetdisk_4.17.7_arm64.deb", + "version": "4.17.7" + } +] \ No newline at end of file diff --git a/url.json b/url.json new file mode 100644 index 0000000..39a6446 --- /dev/null +++ b/url.json @@ -0,0 +1,9 @@ +[ + "https://issuepcdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.19.0.18.exe", + "https://issuepcdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_6.9.10.1.exe", + "https://issuepcdn.baidupcs.com/issue/netdisk/MACguanjia/BaiduNetdisk_mac_4.11.0.dmg", + "https://issuepcdn.baidupcs.com/issue/netdisk/MACguanjia/BaiduNetdisk_mac_4.11.0_arm64.dmg", + "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.11.5/baidunetdisk-4.11.5.x86_64.rpm", + "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.11.5/baidunetdisk_4.11.5_amd64.deb", + "https://issuepcdn.baidupcs.com/issue/netdisk/LinuxGuanjia/4.17.7/baidunetdisk_4.17.7_arm64.deb" +] \ No newline at end of file