11import time
22import json
3+ from urllib import parse
34
45from .httpcat import HttpCat
56from .log import log
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" ,
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