|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | # @Time : 2022/3/31 9:34 |
3 | 3 | # @Author : Melon |
4 | | -# @Site : |
5 | | -# @Note : |
| 4 | +# @Site : |
| 5 | +# @Note : |
6 | 6 | # @File : init_zjy.py |
7 | 7 | # @Software: PyCharm |
8 | 8 | import logging |
9 | 9 | import time |
10 | 10 |
|
11 | 11 | import requests |
| 12 | +from ZJYMain.oauth_login import oauth_login |
12 | 13 |
|
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 | +) |
14 | 17 | logger = logging.getLogger(__name__) |
15 | 18 |
|
16 | | -BASE_URL = 'https://sso.icve.com.cn/prod-api' |
| 19 | +BASE_URL = "https://sso.icve.com.cn/prod-api" |
17 | 20 |
|
18 | 21 | # 登录 |
19 | | -LOGIN_SYSTEM_URL = BASE_URL + '/data/userLoginV2' |
| 22 | +LOGIN_SYSTEM_URL = BASE_URL + "/data/userLoginV2" |
20 | 23 | # 获取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" |
22 | 25 |
|
23 | 26 | 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" |
25 | 28 | } |
26 | 29 |
|
27 | 30 | session = requests.session() |
28 | 31 |
|
29 | 32 |
|
30 | 33 | 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} |
36 | 35 | if img_code: |
37 | | - data['imgCode'] = img_code |
| 36 | + data["imgCode"] = img_code |
38 | 37 | post = session.post(url=LOGIN_SYSTEM_URL, json=data, headers=HEADERS) |
39 | 38 | post_json = post.json() |
40 | | - if post.ok and post_json['code'] == 200: |
| 39 | + if post.ok and post_json["code"] == 200: |
41 | 40 | 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) |
44 | 43 | token_json = post.json() |
45 | | - access_token = token_json['data']['access_token'] |
| 44 | + access_token = token_json["data"]["access_token"] |
46 | 45 | session.access_token = access_token |
47 | | - session.headers['Authorization'] = f'Bearer {access_token}' |
| 46 | + session.headers["Authorization"] = f"Bearer {access_token}" |
48 | 47 | return session |
49 | 48 | else: |
50 | 49 | logger.info(f"登录失败: {username} msg: {post_json['msg']}") |
51 | 50 | input("程序结束,如遇错误请重新运行,多次重复错误请提交Github...") |
52 | 51 |
|
| 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