Skip to content

Commit 389c3b4

Browse files
committed
[FEAT] oauth 登录方式
1 parent ef3ea3b commit 389c3b4

3 files changed

Lines changed: 1294 additions & 35 deletions

File tree

StartWork.py

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# -*- coding: utf-8 -*-
22
# @Time : 2022/3/31 9:30
33
# @Author : Melon
4-
# @Site :
5-
# @Note :
4+
# @Site :
5+
# @Note :
66
# @File : StartWork.py
77
# @Software: PyCharm
88
import logging
@@ -12,37 +12,43 @@
1212
import ZJYMain.look_video as mook_video
1313
from update import check_for_updates
1414

15-
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
15+
logging.basicConfig(
16+
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
17+
)
1618
logger = logging.getLogger(__name__)
1719

18-
APP_VERSION = 'dev' if 'TAG_NAME' in '${TAG_NAME}' else '${TAG_NAME}'
20+
APP_VERSION = "dev" if "TAG_NAME" in "${TAG_NAME}" else "${TAG_NAME}"
1921

20-
border = '*' * 80
22+
border = "*" * 80
2123
logger.info(border)
22-
logger.info(f'应用程序启动,版本: {APP_VERSION}')
23-
logger.info('开源支持: https://github.com/11273/zjy-work-answer')
24+
logger.info(f"应用程序启动,版本: {APP_VERSION}")
25+
logger.info("开源支持: https://github.com/11273/zjy-work-answer")
2426
logger.info(border)
2527

2628
check_for_updates(APP_VERSION)
2729

2830
# ****************************************** 配置 ******************************************
2931
time.sleep(1)
30-
# 账号
31-
username = input('请输入账号: ') # 账号
32-
password = input('请输入密码: ') # 密码
3332

34-
jump = int(input('是否有需要跳过的课程 1.是 or 2.否: ') or 2)
33+
jump = int(input("是否有需要跳过的课程 1.是 or 2.否: ") or 2)
3534
jump_content = None
3635
if jump == 1:
3736
print(
38-
'\t请输入跳过课程名(模糊匹配), 例如\n\t\t输入多个文本随机井号后面的: #设计#思想道德#技术\n\t\t输入单个将固定跳过一个课程: #思想')
39-
jump_content = input('请输入需要跳过的课程关键字(#电商): ') or ''
37+
"\t请输入跳过课程名(模糊匹配), 例如\n\t\t输入多个文本随机井号后面的: #设计#思想道德#技术\n\t\t输入单个将固定跳过一个课程: #思想"
38+
)
39+
jump_content = input("请输入需要跳过的课程关键字(#电商): ") or ""
4040
# ****************************************** 结束 ******************************************
4141

42-
if __name__ == '__main__':
42+
if __name__ == "__main__":
4343
try:
44-
session = mooc_init.login(username, password)
45-
mook_video.start(session, jump_content=jump_content)
44+
# 使用交互式登录
45+
session = mooc_init.login_interactive()
46+
47+
if session:
48+
mook_video.start(session, jump_content=jump_content)
49+
else:
50+
logger.error("❌ 登录失败,程序退出")
51+
input("程序结束,如遇错误请重新运行,多次重复错误请提交Github...")
4652
except Exception as e:
47-
logging.exception('运行异常', e)
53+
logging.exception("运行异常", e)
4854
input("程序结束,如遇错误请重新运行,多次重复错误请提交Github...")

ZJYMain/init_zjy.py

Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,123 @@
11
# -*- coding: utf-8 -*-
22
# @Time : 2022/3/31 9:34
33
# @Author : Melon
4-
# @Site :
5-
# @Note :
4+
# @Site :
5+
# @Note :
66
# @File : init_zjy.py
77
# @Software: PyCharm
88
import logging
99
import time
1010

1111
import requests
12+
from ZJYMain.oauth_login import oauth_login
1213

13-
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
14+
logging.basicConfig(
15+
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
16+
)
1417
logger = logging.getLogger(__name__)
1518

16-
BASE_URL = 'https://sso.icve.com.cn/prod-api'
19+
BASE_URL = "https://sso.icve.com.cn/prod-api"
1720

1821
# 登录
19-
LOGIN_SYSTEM_URL = BASE_URL + '/data/userLoginV2'
22+
LOGIN_SYSTEM_URL = BASE_URL + "/data/userLoginV2"
2023
# 获取access_token
21-
GET_TOKEN = 'https://zjy2.icve.com.cn/prod-api/auth/passLogin'
24+
GET_TOKEN = "https://zjy2.icve.com.cn/prod-api/auth/passLogin"
2225

2326
HEADERS = {
24-
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
27+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
2528
}
2629

2730
session = requests.session()
2831

2932

3033
def login(username, password, img_code=None): # 0.登录
31-
data = {
32-
"userName": username,
33-
"password": password,
34-
"type": 1
35-
}
34+
data = {"userName": username, "password": password, "type": 1}
3635
if img_code:
37-
data['imgCode'] = img_code
36+
data["imgCode"] = img_code
3837
post = session.post(url=LOGIN_SYSTEM_URL, json=data, headers=HEADERS)
3938
post_json = post.json()
40-
if post.ok and post_json['code'] == 200:
39+
if post.ok and post_json["code"] == 200:
4140
logger.info(f"登录成功: {username}")
42-
token = post_json['data']['token']
43-
post = session.get(url=GET_TOKEN, params={'token': token}, headers=HEADERS)
41+
token = post_json["data"]["token"]
42+
post = session.get(url=GET_TOKEN, params={"token": token}, headers=HEADERS)
4443
token_json = post.json()
45-
access_token = token_json['data']['access_token']
44+
access_token = token_json["data"]["access_token"]
4645
session.access_token = access_token
47-
session.headers['Authorization'] = f'Bearer {access_token}'
46+
session.headers["Authorization"] = f"Bearer {access_token}"
4847
return session
4948
else:
5049
logger.info(f"登录失败: {username} msg: {post_json['msg']}")
5150
input("程序结束,如遇错误请重新运行,多次重复错误请提交Github...")
5251

52+
53+
def login_with_oauth(timeout=300, preferred_port=None):
54+
"""
55+
使用OAuth方式登录
56+
57+
Args:
58+
timeout: 超时时间(秒)
59+
preferred_port: 首选端口,如果为None则随机选择
60+
61+
Returns:
62+
成功返回session对象,失败返回None
63+
"""
64+
logger.info("🔐 开始OAuth登录流程...")
65+
66+
# 获取OAuth token
67+
token = oauth_login(timeout, preferred_port)
68+
69+
if not token:
70+
logger.error("❌ OAuth登录失败")
71+
return None
72+
73+
# 使用token获取access_token
74+
try:
75+
post = session.get(url=GET_TOKEN, params={"token": token}, headers=HEADERS)
76+
token_json = post.json()
77+
78+
if post.ok and token_json.get("code") == 200:
79+
access_token = token_json["data"]["access_token"]
80+
session.access_token = access_token
81+
session.headers["Authorization"] = f"Bearer {access_token}"
82+
logger.info("✅ OAuth登录成功")
83+
return session
84+
else:
85+
logger.error(f"❌ 获取access_token失败: {token_json}")
86+
return None
87+
88+
except Exception as e:
89+
logger.error(f"❌ OAuth登录过程中发生异常: {e}")
90+
return None
91+
92+
93+
def login_interactive():
94+
"""
95+
交互式登录,支持用户选择登录方式
96+
97+
Returns:
98+
成功返回session对象,失败返回None
99+
"""
100+
logger.info("=" * 60)
101+
logger.info("🚀 ZJY助手登录服务")
102+
logger.info("=" * 60)
103+
logger.info("请选择登录方式:")
104+
logger.info("1. 用户名密码登录(传统方式)")
105+
logger.info("2. OAuth浏览器登录(推荐)")
106+
logger.info("=" * 60)
107+
108+
while True:
109+
choice = input("请输入选择 (1/2): ").strip()
110+
111+
if choice == "1":
112+
# 传统登录
113+
username = input("请输入用户名: ").strip()
114+
password = input("请输入密码: ").strip()
115+
return login(username, password)
116+
117+
elif choice == "2":
118+
# OAuth登录
119+
return login_with_oauth()
120+
121+
else:
122+
logger.warning("⚠️ 无效选择,请输入 1 或 2")
123+
continue

0 commit comments

Comments
 (0)