123网盘解析下载python脚本
我的站长站
2023-06-06
共人阅读
介绍123网盘解析下载Python脚本是一种高效的数据获取方法,通过编写特定代码来自动化执行网盘文件的下载任务,节省时间并提升工作效率。
import requests
import re
import tkinter as tk
from io import BytesIO
from urllib.request import urlopen
import base64
import json
class Form1(tk.Tk):
def __init__(self):
super().__init__()
self.title("123Pan下载工具")
self.geometry("400x300")
self.label1 = tk.Label(self, text="请输入123盘的网址:")
self.label1.pack()
self.entry = tk.Entry(self, width=50)
self.entry.pack()
self.button1 = tk.Button(self, text="开始下载", command=self.download)
self.button1.pack()
self.label2 = tk.Label(self, text="提取下载链接:")
self.label2.pack()
self.label3 = tk.Label(self, text="")
self.label3.pack()
self.textbox = tk.Text(self, height=5, width=50)
self.textbox.pack()
self.button2 = tk.Button(self, text="清除输入", command=self.clear_input)
self.button2.pack()
def download(self):
url = self.entry.get()
share_id, share_Code = self.extract_id_and_code(url)
if share_id:
self.get_info(share_id, share_Code)
else:
tk.messagebox.showerror("错误", "没有找到123盘的网址!")
def extract_id_and_code(self, url):
share_id = re.search(r"(?<=/s/)[^./]+", url)
share_Code = re.search(r"提取码:(\w+)", url)
if share_id:
share_id = share_id.group(0)
if share_Code:
share_Code = share_Code.group(1)
if share_Code == "":
self.label3.config(text="")
else:
self.label3.config(text="提取码:" + share_Code)
return share_id, share_Code
return None, None
def get_info(self, share_id, share_Code):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.100"
}
request_url = f"https://www.123pan.com/b/api/share/get?limit=100&next=1&orderBy=share_id&orderDirection=desc&shareKey={share_id}&SharePwd={share_Code}&ParentFileId=0&Page=1"
response = requests.get(request_url, headers=headers)
if response.status_code == 200:
response_text = response.text
self.parse_get_info(response_text, share_id)
else:
tk.messagebox.showerror("错误", "获取用户信息失败")
def parse_get_info(self, response_text, share_id):
data = json.loads(response_text)
code = data["code"]
if code == 0:
info_list = data["data"]["InfoList"]
if info_list:
info = info_list[0]
if info["Type"] == 0:
file_id = info["FileId"]
size = info["Size"]
s3_key_flag = info["S3KeyFlag"]
etag = info["Etag"]
self.combined_data(share_id, file_id, size, s3_key_flag, etag)
else:
self.textbox.delete(1.0, tk.END)
self.textbox.insert(tk.END, "错误:软件目前不支持文件夹解析。")
else:
message = data["message"]
tk.messagebox.showerror("错误", f"错误代码 {code}//{message}")
def combined_data(self, share_id, file_id, size, s3_key_flag, etag):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.100",
"Content-Type": "application/json;charset=UTF-8"
}
url = "https://www.123pan.com/b/api/share/download/info"
data = {
"ShareKey": share_id,
"FileID": file_id,
"S3keyFlag": s3_key_flag,
"Size": size,
"Etag": etag
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
response_text = response.text
self.parse_download_url(response_text)
else:
tk.messagebox.showerror("错误", "获取下载链接失败")
def parse_download_url(self, response_text):
data = json.loads(response_text)
code = data["code"]
if code == 0:
download_url = data["data"]["DownloadURL"]
decoded_url = self.extract_download_url(download_url)
self.get_xz_url(decoded_url)
else:
message = data["message"]
tk.messagebox.showerror("错误", f"错误代码 {code}//{message}")
def extract_download_url(self, url):
params_match = re.search(r"params=([^&]+)", url)
if params_match:
params_value = params_match.group(1)
decoded_bytes = base64.b64decode(params_value)
decoded_string = decoded_bytes.decode("utf-8")
if "auto_redirect" not in decoded_string:
if "?" in decoded_string:
decoded_string += "&auto_redirect=0"
else:
decoded_string += "?auto_redirect=0"
return decoded_string
else:
tk.messagebox.showerror("错误", "提取DownloadURL失败")
def get_xz_url(self, request_url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.100"
}
response = requests.get(request_url, headers=headers)
if response.status_code == 200:
response_text = response.text
self.parse_xz_url(response_text)
else:
tk.messagebox.showerror("错误", "获取直链失败")
def parse_xz_url(self, response_text):
data = json.loads(response_text)
code = data["code"]
if code == 0:
redirect_url = data["data"]["redirect_url"]
self.textbox.delete(1.0, tk.END)
self.textbox.insert(tk.END, redirect_url)
else:
message = data["message"]
tk.messagebox.showerror("错误", f"错误代码 {code}//{message}")
def clear_input(self):
self.entry.delete(0, tk.END)
self.textbox.delete(1.0, tk.END)
if __name__ == "__main__":
form = Form1()
form.mainloop()