diff --git a/ArknightsUID/arknightsuid_login/__init__.py b/ArknightsUID/arknightsuid_login/__init__.py index e0206d8..1e398e3 100644 --- a/ArknightsUID/arknightsuid_login/__init__.py +++ b/ArknightsUID/arknightsuid_login/__init__.py @@ -38,8 +38,8 @@ async def get_resp_msg(bot: Bot, ev: Event): logger.info(code.text) login.token_by_phone_code(code.text) # login.post_account_info_hg() - login.user_oauth2_v2_grant() - login.generate_cred_by_code() + await login.user_oauth2_v2_grant() + await login.generate_cred_by_code() uid = login.ark_uid skd_uid = login.skland_userId diff --git a/ArknightsUID/arknightsuid_login/login.py b/ArknightsUID/arknightsuid_login/login.py index 5d37a95..4d992e7 100644 --- a/ArknightsUID/arknightsuid_login/login.py +++ b/ArknightsUID/arknightsuid_login/login.py @@ -137,7 +137,13 @@ class SklandLogin: self.token = data.token self.get_ark_uid() - def user_oauth2_v2_grant(self): + async def user_oauth2_v2_grant(self): + self.client.headers["platform"] = "3" + self.client.headers["vName"] = "1.0.0" + self.client.headers["origin"] = "https://zonai.skland.com/" + self.client.headers["referer"] = "https://zonai.skland.com/" + self.client.headers["dId"] = await get_d_id() + self.client.headers["timestamp"] = str(int(datetime.now().timestamp())) response = self.client.post( ARK_USER_OAUTH2_V2_GRANT, json={"appCode": "4ca99fa6b56cc2ba", "token": self.token, "type": 0}, @@ -173,13 +179,13 @@ class SklandLogin: result_data = response.json() self.ark_uid: str = result_data["data"]["uid"] - def generate_cred_by_code(self): + async def generate_cred_by_code(self): self.client.headers["platform"] = "3" self.client.headers["vName"] = "1.0.0" self.client.headers["origin"] = "https://zonai.skland.com/" self.client.headers["referer"] = "https://zonai.skland.com/" + self.client.headers["dId"] = await get_d_id() self.client.headers["timestamp"] = str(int(datetime.now().timestamp())) - self.client.headers["dId"] = get_d_id() response = self.client.post( GENERATE_CRED_BY_CODE, json={"code": self.code, "kind": 1}, diff --git a/ArknightsUID/utils/crypto.py b/ArknightsUID/utils/crypto.py index 4a71bf7..0e05b0c 100644 --- a/ArknightsUID/utils/crypto.py +++ b/ArknightsUID/utils/crypto.py @@ -1,4 +1,6 @@ -# https://gitee.com/FancyCabbage/skyland-auto-sign/blob/master/SecuritySm.py +# ID: 1 +# 来自https://gitee.com/FancyCabbage/skyland-auto-sign/blob/master/SecuritySm.py +# 协议:MIT(https://gitee.com/FancyCabbage/skyland-auto-sign/blob/master/LICENSE) import base64 import gzip import hashlib @@ -8,13 +10,13 @@ import json import time import uuid -import httpx from cryptography.hazmat.decrepit.ciphers.algorithms import TripleDES from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.ciphers.algorithms import AES from cryptography.hazmat.primitives.ciphers.base import Cipher from cryptography.hazmat.primitives.ciphers.modes import CBC, ECB +from httpx import AsyncClient # 查询dId请求头 devices_info_url = "https://fp-it.portal101.cn/deviceprofile/v4" @@ -130,7 +132,7 @@ def get_tn(o: dict): for i in sorted_keys: v = o[i] - if isinstance(v, (int, float)): + if isinstance(v, int | float): v = str(v * 10000) elif isinstance(v, dict): v = get_tn(v) @@ -147,7 +149,7 @@ def get_smid(): return v + smsk_web + "0" -def get_d_id() -> str: +async def get_d_id() -> str: # storageName = '.thumbcache_' + md5(SM_CONFIG['organization']) // 用于从本地存储获得值 # uid = uuid() # priId=md5(uid)[0:16] @@ -190,21 +192,22 @@ def get_d_id() -> str: des_result = _AES(GZIP(_DES(des_target)), priId.encode("utf-8")) - response = httpx.post( - devices_info_url, - json={ - "appId": "default", - "compress": 2, - "data": des_result, - "encode": 5, - "ep": ep, - "organization": SM_CONFIG["organization"], - "os": "web", # 固定值 - }, - ) - - resp = response.json() + async with AsyncClient() as client: + response = await client.post( + devices_info_url, + json={ + "appId": "default", + "compress": 2, + "data": des_result, + "encode": 5, + "ep": ep, + "organization": SM_CONFIG["organization"], + "os": "web", # 固定值 + }, + ) + response.raise_for_status() + resp = response.json() if resp["code"] != 1100: - raise Exception("did计算失败,请联系作者") + raise Exception("通过本地计算 did 失败,请联系机器人所有者调整 did 获取方式!") # 开头必须是B return "B" + resp["detail"]["deviceId"]