22import random
33import string
44import json
5- import base64
6- import time
5+ import base64 # 用于可能的 Base64 解码
6+
77
88def 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
1920def 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
115108if __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