From 01935b8b4c99d2ca84cbabb453e96b326b928163 Mon Sep 17 00:00:00 2001 From: Decrabbit Date: Thu, 15 Aug 2024 18:34:07 +0800 Subject: [PATCH 1/3] Fix a bug --- lagrange/client/client.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lagrange/client/client.py b/lagrange/client/client.py index 16ed223..5b48c73 100644 --- a/lagrange/client/client.py +++ b/lagrange/client/client.py @@ -374,7 +374,9 @@ async def get_friend_list(self): next = GetFriendListRsp.decode( ( await self.send_oidb_svc( - 0xFD4, 1, PBGetFriendListRequest().encode() + 0xFD4, + 1, + PBGetFriendListRequest(next_uin=nextuin_cache.pop()).encode(), ) ).data ) @@ -393,7 +395,7 @@ async def get_friend_list(self): ) ) if next.next: - nextuin_cache.append(next) + nextuin_cache.append(next.next) return rsp From a370703aa6ee326dfa80c2365824bc26291ab1bf Mon Sep 17 00:00:00 2001 From: Decrabbit Date: Wed, 21 Aug 2024 00:40:07 +0800 Subject: [PATCH 2/3] add get_pskey(maybe) --- lagrange/client/client.py | 32 +++++++++++++++++++++++++++++++- lagrange/pb/service/comm.py | 15 +++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lagrange/client/client.py b/lagrange/client/client.py index 17997d0..7ba4b59 100644 --- a/lagrange/client/client.py +++ b/lagrange/client/client.py @@ -16,7 +16,12 @@ from lagrange.info import AppInfo, DeviceInfo, SigInfo from lagrange.pb.message.msg_push import MsgPushBody from lagrange.pb.message.send import SendMsgRsp -from lagrange.pb.service.comm import SendGrpBotHD, SendNudge +from lagrange.pb.service.comm import ( + GetClientKeyRsp, + GetCookieRsp, + SendGrpBotHD, + SendNudge, +) from lagrange.pb.service.friend import ( GetFriendListRsp, GetFriendListUin, @@ -52,6 +57,7 @@ from lagrange.pb.service.oidb import OidbRequest, OidbResponse from lagrange.pb.highway.comm import IndexNode from lagrange.utils.binary.protobuf import proto_decode, proto_encode +from lagrange.utils.httpcat import HttpCat from lagrange.utils.log import log from lagrange.utils.operator import timestamp @@ -593,3 +599,27 @@ async def get_group_last_seq(self, grp_id: int) -> int: if not rsp.body.args.seq: raise AssertionError("No message found") return rsp.body.args.seq + + async def get_cookies(self, domains: list[str]) -> List[str]: + """pskey""" + return [ + i.value.decode() + for i in GetCookieRsp.decode( + ( + await self.send_oidb_svc( + 0x102A, + 0, + proto_encode({1: domains}), # type: ignore + ) + ).data + ).urls + ] + + async def get_skey(self): + ck = GetClientKeyRsp.decode( + (await self.send_oidb_svc(0x102A, 1, proto_encode({}))).data + ).client_key + jump = "https%3A%2F%2Fh5.qzone.qq.com%2Fqqnt%2Fqzoneinpcqq%2Ffriend%3Frefresh%3D0%26clientuin%3D0%26darkMode%3D0&keyindex=19&random=2599" + url = f"https://ssl.ptlogin2.qq.com/jump?ptlang=1033&clientuin={self.uin}&clientkey={ck}&u1={jump}" + resp = await HttpCat.request("GET", url) + return resp.cookies diff --git a/lagrange/pb/service/comm.py b/lagrange/pb/service/comm.py index 00da058..85be29b 100644 --- a/lagrange/pb/service/comm.py +++ b/lagrange/pb/service/comm.py @@ -21,3 +21,18 @@ class SendGrpBotHD(ProtoStruct): IDD: int = proto_field(7, default=0) grp_id: int = proto_field(8, default=None) grp_type: int = proto_field(9, default=0) # 0guild 1grp 2C2C(need grp_id==None) + + +class Propertys(ProtoStruct): + key: str = proto_field(1) + value: bytes = proto_field(2) + + +class GetCookieRsp(ProtoStruct): + urls: list[Propertys] = proto_field(1) + + +class GetClientKeyRsp(ProtoStruct): + f2: int = proto_field(2) + client_key: str = proto_field(3) + expiration: int = proto_field(4) From e8b76210b889191251a1b759834ee9520c2c85d9 Mon Sep 17 00:00:00 2001 From: Decrabbit Date: Wed, 21 Aug 2024 01:43:25 +0800 Subject: [PATCH 3/3] add csrf_token --- lagrange/client/client.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/lagrange/client/client.py b/lagrange/client/client.py index 7ba4b59..9ace844 100644 --- a/lagrange/client/client.py +++ b/lagrange/client/client.py @@ -600,6 +600,18 @@ async def get_group_last_seq(self, grp_id: int) -> int: raise AssertionError("No message found") return rsp.body.args.seq + async def _get_client_key(self) -> str: + return GetClientKeyRsp.decode( + (await self.send_oidb_svc(0x102A, 1, proto_encode({}))).data + ).client_key + + def _gtk_1(self, skey_or_pskey: str): + _hash = 5381 + _len = len(skey_or_pskey) + for i in range(_len): + _hash += (_hash << 5) + ord(skey_or_pskey[i]) + return _hash & 2147483647 + async def get_cookies(self, domains: list[str]) -> List[str]: """pskey""" return [ @@ -615,11 +627,12 @@ async def get_cookies(self, domains: list[str]) -> List[str]: ).urls ] - async def get_skey(self): - ck = GetClientKeyRsp.decode( - (await self.send_oidb_svc(0x102A, 1, proto_encode({}))).data - ).client_key + async def get_skey(self) -> str: jump = "https%3A%2F%2Fh5.qzone.qq.com%2Fqqnt%2Fqzoneinpcqq%2Ffriend%3Frefresh%3D0%26clientuin%3D0%26darkMode%3D0&keyindex=19&random=2599" - url = f"https://ssl.ptlogin2.qq.com/jump?ptlang=1033&clientuin={self.uin}&clientkey={ck}&u1={jump}" - resp = await HttpCat.request("GET", url) - return resp.cookies + url = f"https://ssl.ptlogin2.qq.com/jump?ptlang=1033&clientuin={self.uin}&clientkey={await self._get_client_key()}&u1={jump}" + resp = await HttpCat.request("GET", url, follow_redirect=False) + return resp.cookies["skey"] + + async def get_csrf_token(self) -> int: + skey = await self.get_skey() + return self._gtk_1(skey)