Skip to content

Commit 4b745bd

Browse files
authored
更新 duya.py
1 parent e0ca4c8 commit 4b745bd

1 file changed

Lines changed: 82 additions & 100 deletions

File tree

duya.py

Lines changed: 82 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -2,128 +2,110 @@
22
import random
33
import string
44
import json
5-
import base64
6-
import time
5+
import base64 # 用于可能的 Base64 解码
6+
77

88
def generate_email():
9-
"""生成随机邮箱"""
10-
user = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
11-
domains = ['gmail.com', 'qq.com', '163.com', 'outlook.com']
12-
return f"{user}@{random.choice(domains)}"
9+
chars = string.ascii_lowercase + string.digits
10+
domains = ['gmail.com', '163.com', '126.com', 'qq.com', 'outlook.com', 'hotmail.com']
11+
name = ''.join(random.choice(chars) for _ in range(10))
12+
return f"{name}@{random.choice(domains)}"
13+
1314

14-
def generate_password():
15-
"""生成随机密码"""
15+
def generate_password(length=10):
1616
chars = string.ascii_letters + string.digits
17-
return ''.join(random.choices(chars, k=10))
17+
return ''.join(random.choice(chars) for _ in range(length))
18+
1819

1920
def get_subscription():
20-
"""获取订阅主函数"""
21-
BASE_URL = 'https://api.duya.pro'
22-
endpoints = {
23-
'register': '/v1/auth/register',
24-
'login': '/v1/auth/login',
25-
'subscribe': '/v1/public/user/subscribe'
26-
}
27-
28-
user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1"
21+
register_url = 'https://api.duya.pro/v1/auth/register'
22+
login_url = 'https://api.duya.pro/v1/auth/login'
23+
subscription_url = 'https://api.duya.pro/v1/public/user/subscribe'
2924

25+
email = generate_email()
26+
password = generate_password()
27+
user_agent = "Mozilla/5.0"
28+
headers_base = {
29+
'Content-Type': 'application/json',
30+
'Origin': 'https://duya.pro',
31+
'User-Agent': user_agent
32+
}
33+
3034
try:
31-
# 生成账号
32-
email = generate_email()
33-
password = generate_password()
34-
print(f"📧 邮箱: {email}")
35-
print(f"🔑 密码: {password}")
36-
37-
# 1. 注册
38-
reg_url = BASE_URL + endpoints['register']
39-
reg_data = json.dumps({'email': email, 'password': password})
40-
reg_headers = {
41-
'Content-Type': 'application/json',
42-
'Origin': 'https://duya.pro',
43-
'Referer': 'https://duya.pro/register',
44-
'User-Agent': user_agent
45-
}
46-
47-
reg_res = requests.post(reg_url, headers=reg_headers, data=reg_data, timeout=15)
48-
reg_json = reg_res.json()
49-
50-
if not reg_json.get('success'):
51-
return f"❌ 注册失败: {reg_json.get('message', '未知错误')}"
52-
53-
print("✅ 注册成功")
54-
55-
# 2. 登录
56-
time.sleep(1) # 防请求过快
57-
login_url = BASE_URL + endpoints['login']
35+
print(f"[+] 生成的随机邮箱: {email}")
36+
print(f"[+] 生成的随机密码: {password}")
37+
38+
# 1. 注册账号
39+
register_data = json.dumps({'email': email, 'password': password})
40+
register_headers = headers_base.copy()
41+
register_headers.update({'Referer': 'https://duya.pro/register'})
42+
register_response = requests.post(
43+
register_url,
44+
headers=register_headers,
45+
data=register_data
46+
)
47+
register_result = register_response.json()
48+
token = register_result.get('data', {}).get('token')
49+
if not token:
50+
raise Exception('注册失败或未返回 token')
51+
print(f"[+] 注册成功,Token: {token}")
52+
53+
# 2. 登录账号(某些 API 可能不需要这步,视情况调整)
5854
login_data = json.dumps({'email': email, 'password': password})
59-
login_headers = {
60-
'Content-Type': 'application/json',
61-
'Origin': 'https://duya.pro',
62-
'Referer': 'https://duya.pro/login',
63-
'User-Agent': user_agent
64-
}
65-
66-
login_res = requests.post(login_url, headers=login_headers, data=login_data, timeout=15)
67-
login_json = login_res.json()
68-
token = login_json.get('data', {}).get('token')
69-
55+
login_headers = headers_base.copy()
56+
login_headers.update({'Referer': 'https://duya.pro/login'})
57+
login_response = requests.post(
58+
login_url,
59+
headers=login_headers,
60+
data=login_data
61+
)
62+
login_result = login_response.json()
63+
token = login_result.get('data', {}).get('token')
7064
if not token:
71-
return "❌ 登录失败: 未获取到token"
72-
73-
print("✅ 登录成功")
74-
75-
# 3. 获取订阅token
76-
time.sleep(1)
77-
sub_url = BASE_URL + endpoints['subscribe']
78-
sub_headers = {
65+
raise Exception('登录失败或未返回 token')
66+
print(f"[+] 登录成功,Token: {token}")
67+
68+
# 3. 获取订阅 token
69+
subscribe_headers = {
7970
'Authorization': token,
8071
'User-Agent': user_agent,
8172
'Origin': 'https://duya.pro',
8273
'Referer': 'https://duya.pro/dashboard'
8374
}
84-
85-
sub_res = requests.get(sub_url, headers=sub_headers, timeout=15)
86-
sub_json = sub_res.json()
87-
88-
# 检查订阅列表
89-
sub_list = sub_json.get('data', {}).get('list', [])
75+
subscribe_response = requests.get(
76+
subscription_url,
77+
headers=subscribe_headers
78+
)
79+
subscribe_result = subscribe_response.json()
80+
sub_list = subscribe_result.get('data', {}).get('list', [])
9081
if not sub_list:
91-
return "❌ 未获取到订阅列表"
92-
93-
# 获取第一个订阅token
82+
raise Exception('未获取到订阅列表')
9483
sub_token = sub_list[0].get('token')
9584
if not sub_token:
96-
return "❌ 未找到订阅token"
97-
98-
print(f"🔗 订阅Token: {sub_token}")
99-
100-
# 4. 下载订阅内容
101-
final_url = f"{BASE_URL}/api/subscribe?token={sub_token}"
102-
content_res = requests.get(final_url, headers={'User-Agent': user_agent}, timeout=15)
103-
content = content_res.text
85+
raise Exception('未找到订阅 token')
86+
print(f"[+] 订阅 Token: {sub_token}")
87+
88+
# 4. 获取订阅内容
89+
final_url = f"https://api.duya.pro/api/subscribe?token={sub_token}&user_agent={requests.utils.quote(user_agent)}"
90+
content_response = requests.get(final_url, headers={'User-Agent': user_agent})
91+
content = content_response.text
10492

105-
# 尝试Base64解码
93+
# 尝试解码 Base64(如果是 Base64 格式)
10694
try:
107-
decoded = base64.b64decode(content).decode('utf-8')
108-
return "✅ 订阅获取成功!\n\n" + decoded
95+
decoded_content = base64.b64decode(content).decode('utf-8')
96+
print("\n[+] 解码后的订阅内容:")
97+
print(decoded_content)
98+
return decoded_content
10999
except:
110-
return "✅ 订阅获取成功!\n\n" + content
111-
100+
print("\n[+] 原始订阅内容(非 Base64):")
101+
print(content)
102+
return content
112103
except Exception as e:
113-
return f"⚠️ 发生错误: {str(e)}"
104+
print(f"[-] 发生错误: {str(e)}")
105+
return None
106+
114107

115108
if __name__ == "__main__":
116-
print("="*50)
117-
print("🚀 开始获取订阅配置")
118-
print("="*50)
119-
109+
print("===== 开始获取订阅 =====")
120110
result = get_subscription()
121-
122-
print("\n" + "="*50)
123-
print("✨ 运行结果")
124-
print("="*50)
125-
print(result)
126-
print("="*50)
127-
128-
# 手机端友好提示
129-
print("\n💡 提示:长按屏幕可复制订阅内容")
111+
print("\n===== 运行结束 =====")

0 commit comments

Comments
 (0)