Skip to content

Commit bd2adae

Browse files
committed
fix(sign): support new version signer
1 parent e52d9e2 commit bd2adae

3 files changed

Lines changed: 64 additions & 29 deletions

File tree

lagrange/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ def __init__(
3030
):
3131
self.im = InfoManager(uin, device_info_path, signinfo_path)
3232
self.uin = uin
33-
self.sign = sign_provider(sign_url) if sign_url else None
33+
self._sign_url = sign_url
34+
self.sign = None
3435
self.events = {}
3536
self.log = log
3637
self._protocol = protocol
@@ -58,6 +59,13 @@ async def run(self):
5859
log.root.info(f"AppInfo: platform={app_info.os}, ver={app_info.build_version}({app_info.sub_app_id})")
5960

6061
with self.im as im:
62+
if self._sign_url:
63+
self.sign = sign_provider(
64+
self._sign_url,
65+
self.uin,
66+
im.device.guid,
67+
app_info.qua,
68+
)
6169
self.client = Client(
6270
self.uin,
6371
app_info,

lagrange/info/app.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class AppInfo(JsonSerializer):
4949
main_sigmap: int
5050
sub_sigmap: int
5151
nt_login_type: int
52+
qua: str
5253

5354
@property
5455
def build_version(self) -> int:
@@ -83,60 +84,57 @@ class AppInfoDict(TypedDict):
8384
os="Linux",
8485
kernel="Linux",
8586
vendor_os="linux",
86-
current_version="3.2.10-25765",
87-
# build_version=25765,
87+
current_version="3.2.26-46494",
8888
misc_bitmap=32764,
8989
pt_version="2.0.0",
9090
pt_os_version=19,
9191
package_name="com.tencent.qq",
9292
wtlogin_sdk="nt.wtlogin.0.0.1",
93-
# package_sign="V1_LNX_NQ_3.1.2-13107_RDM_B",
9493
app_id=1600001615,
95-
sub_app_id=537234773,
94+
sub_app_id=537345891,
9695
app_id_qrcode=13697054,
97-
app_client_version=13172,
96+
app_client_version=46494,
9897
main_sigmap=169742560,
9998
sub_sigmap=0,
10099
nt_login_type=1,
100+
qua="V1_LNX_NQ_3.2.26_46494_GW_B",
101101
),
102102
"macos": AppInfo(
103103
os="Mac",
104104
kernel="Darwin",
105105
vendor_os="mac",
106-
current_version="6.9.20-17153",
107-
# build_version=17153,
108-
misc_bitmap=32764,
106+
current_version="6.9.23-20139",
107+
misc_bitmap=12058620,
109108
pt_version="2.0.0",
110109
pt_os_version=23,
111110
package_name="com.tencent.qq",
112111
wtlogin_sdk="nt.wtlogin.0.0.1",
113-
# package_sign="V1_MAC_NQ_6.9.20-17153_RDM_B",
114112
app_id=1600001602,
115-
sub_app_id=537162356,
113+
sub_app_id=537200848,
116114
app_id_qrcode=537162356,
117115
app_client_version=13172,
118-
main_sigmap=169742560,
116+
main_sigmap=169732560,
119117
sub_sigmap=0,
120118
nt_login_type=5,
119+
qua="",
121120
),
122121
"windows": AppInfo(
123122
os="Windows",
124123
kernel="Windows_NT",
125124
vendor_os="win32",
126-
current_version="9.9.2-15962",
127-
# build_version=15962,
125+
current_version="9.9.19-35184",
128126
pt_version="2.0.0",
129-
misc_bitmap=32764,
127+
misc_bitmap=12058620,
130128
pt_os_version=23,
131129
package_name="com.tencent.qq",
132130
wtlogin_sdk="nt.wtlogin.0.0.1",
133-
# package_sign="V1_WIN_NQ_9.9.2-15962_RDM_B",
134131
app_id=1600001604,
135-
sub_app_id=537138217,
132+
sub_app_id=537291048,
136133
app_id_qrcode=537138217,
137-
app_client_version=13172,
138-
main_sigmap=169742560,
134+
app_client_version=35184,
135+
main_sigmap=169732560,
139136
sub_sigmap=0,
140-
nt_login_type=5
137+
nt_login_type=5,
138+
qua="",
141139
)
142140
}

lagrange/utils/sign.py

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22
import json
3+
from urllib import parse
34

45
from .httpcat import HttpCat
56
from .log import log
@@ -13,14 +14,18 @@
1314
"MessageSvc.PbSendMsg",
1415
"wtlogin.trans_emp",
1516
"wtlogin.login",
16-
# "trpc.login.ecdh.EcdhService.SsoKeyExchange",
17+
"wtlogin.exchange_emp",
18+
"trpc.login.ecdh.EcdhService.SsoKeyExchange",
1719
"trpc.login.ecdh.EcdhService.SsoNTLoginPasswordLogin",
1820
"trpc.login.ecdh.EcdhService.SsoNTLoginEasyLogin",
1921
"trpc.login.ecdh.EcdhService.SsoNTLoginPasswordLoginNewDevice",
2022
"trpc.login.ecdh.EcdhService.SsoNTLoginEasyLoginUnusualDevice",
2123
"trpc.login.ecdh.EcdhService.SsoNTLoginPasswordLoginUnusualDevice",
24+
"trpc.login.ecdh.EcdhService.SsoNTLoginRefreshTicket",
25+
"trpc.login.ecdh.EcdhService.SsoNTLoginRefreshA2",
2226
"OidbSvcTrpcTcp.0x11ec_1",
2327
"OidbSvcTrpcTcp.0x758_1",
28+
"OidbSvcTrpcTcp.0x7c1_1",
2429
"OidbSvcTrpcTcp.0x7c2_5",
2530
"OidbSvcTrpcTcp.0x10db_1",
2631
"OidbSvcTrpcTcp.0x8a1_7",
@@ -43,25 +48,38 @@
4348
"OidbSvcTrpcTcp.0xf55_1",
4449
"OidbSvcTrpcTcp.0xf67_1",
4550
"OidbSvcTrpcTcp.0xf67_5",
51+
"OidbSvcTrpcTcp.0x6d9_4",
4652
]
4753

4854

49-
def sign_provider(upstream_url: str):
55+
def sign_provider(upstream_url: str, uin: int, guid: str, qua: str):
56+
purl = parse.urlparse(upstream_url)
57+
token = purl.username or None
58+
url = parse.urlunparse(purl._replace(netloc=purl.hostname + (f":{purl.port}" if purl.port else "")))
59+
5060
async def get_sign(cmd: str, seq: int, buf: bytes) -> dict:
5161
if cmd not in SIGN_PKG_LIST:
5262
return {}
5363

54-
params = {"cmd": cmd, "seq": seq, "src": buf.hex()}
55-
body = json.dumps(params).encode("utf-8")
56-
headers = {
57-
"Content-Type": "application/json"
64+
params = {
65+
"uin": uin,
66+
"command": cmd,
67+
"seq": seq,
68+
"body": buf.hex().lower(),
69+
"guid": guid.lower(),
70+
"qua": qua,
5871
}
72+
body = json.dumps(params).encode("utf-8")
73+
headers = {"Content-Type": "application/json"}
74+
if token:
75+
headers["Authorization"] = f"Bearer {token}"
76+
5977
for _ in range(3):
6078
try:
6179
start_time = time.time()
62-
ret = await HttpCat.request("POST", upstream_url, body=body, header=headers)
80+
ret = await HttpCat.request("POST", url, body=body, header=headers)
6381
if ret.code != 200:
64-
raise ConnectionAbortedError(ret.code, ret.body)
82+
raise ConnectionError(ret.code, ret.body)
6583
_logger.debug(
6684
f"signed for [{cmd}:{seq}]({(time.time() - start_time) * 1000:.2f}ms)"
6785
)
@@ -72,6 +90,17 @@ async def get_sign(cmd: str, seq: int, buf: bytes) -> dict:
7290
else:
7391
raise ConnectionError("Max retries exceeded")
7492

75-
return ret.json()["value"]
93+
data = ret.json()
94+
code = data.get("code", 0)
95+
if code != 0:
96+
_logger.error(f"Sign server returned error: ({code}) {data.get('message')}")
97+
return {}
98+
99+
value = data["value"]
100+
return {
101+
"sign": value["sec_sign"],
102+
"token": value["sec_token"],
103+
"extra": value["sec_extra"],
104+
}
76105

77106
return get_sign

0 commit comments

Comments
 (0)