Skip to content

Commit a75aace

Browse files
authored
feat(client): get image rkey (#32)
* feat:get image rkey * after test
1 parent f62fa98 commit a75aace

File tree

1 file changed

+43
-98
lines changed

1 file changed

+43
-98
lines changed

lagrange/client/client.py

Lines changed: 43 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,7 @@ def __init__(
8383
app_info: AppInfo,
8484
device_info: DeviceInfo,
8585
sig_info: SigInfo,
86-
sign_provider: Optional[
87-
Callable[[str, int, bytes], Coroutine[None, None, dict]]
88-
] = None,
86+
sign_provider: Optional[Callable[[str, int, bytes], Coroutine[None, None, dict]]] = None,
8987
use_ipv6=True,
9088
):
9189
super().__init__(uin, app_info, device_info, sig_info, sign_provider, use_ipv6)
@@ -125,9 +123,7 @@ async def easy_login(self) -> bool:
125123
else:
126124
raise AssertionError("siginfo not found, you must login first")
127125

128-
async def login(
129-
self, password: str = "", qrcode_path: Optional[str] = None
130-
) -> bool:
126+
async def login(self, password: str = "", qrcode_path: Optional[str] = None) -> bool:
131127
try:
132128
if self._sig.temp_pwd:
133129
rsp = await self.easy_login()
@@ -145,9 +141,7 @@ async def login(
145141
return await self.register()
146142
elif rsp.captcha_verify:
147143
log.root.warning("captcha verification required")
148-
self.submit_login_captcha(
149-
ticket=input("ticket?->"), rand_str=input("rand_str?->")
150-
)
144+
self.submit_login_captcha(ticket=input("ticket?->"), rand_str=input("rand_str?->"))
151145
else:
152146
log.root.error(f"Unhandled exception raised: {rsp.name}")
153147
else: # QrcodeLogin
@@ -169,23 +163,17 @@ async def login(
169163
return await self.register()
170164
return False
171165

172-
async def send_oidb_svc(
173-
self, cmd: int, sub_cmd: int, buf: bytes, is_uid=False
174-
) -> OidbResponse:
166+
async def send_oidb_svc(self, cmd: int, sub_cmd: int, buf: bytes, is_uid=False) -> OidbResponse:
175167
rsp = OidbResponse.decode(
176168
(
177169
await self.send_uni_packet(
178170
f"OidbSvcTrpcTcp.0x{cmd:0>2X}_{sub_cmd}",
179-
OidbRequest(
180-
cmd=cmd, sub_cmd=sub_cmd, data=bytes(buf), is_uid=is_uid
181-
).encode(),
171+
OidbRequest(cmd=cmd, sub_cmd=sub_cmd, data=bytes(buf), is_uid=is_uid).encode(),
182172
)
183173
).data
184174
)
185175
if rsp.ret_code:
186-
log.network.error(
187-
f"OidbSvc(0x{cmd:X}_{sub_cmd}) return an error: ({rsp.ret_code}){rsp.err_msg}"
188-
)
176+
log.network.error(f"OidbSvc(0x{cmd:X}_{sub_cmd}) return an error: ({rsp.ret_code}){rsp.err_msg}")
189177
return rsp
190178

191179
async def push_handler(self, sso: SSOPacket):
@@ -219,32 +207,24 @@ async def _send_msg_raw(self, pb: dict, *, grp_id=0, uid="") -> SendMsgRsp:
219207
return SendMsgRsp.decode(packet.data)
220208

221209
async def send_grp_msg(self, msg_chain: list[Element], grp_id: int) -> int:
222-
result = await self._send_msg_raw(
223-
{1: build_message(msg_chain).encode()}, grp_id=grp_id
224-
)
210+
result = await self._send_msg_raw({1: build_message(msg_chain).encode()}, grp_id=grp_id)
225211
if result.ret_code:
226212
raise AssertionError(result.ret_code, result.err_msg)
227213
return result.seq
228214

229215
async def send_friend_msg(self, msg_chain: list[Element], uid: str) -> int:
230-
result = await self._send_msg_raw(
231-
{1: build_message(msg_chain).encode()}, uid=uid
232-
)
216+
result = await self._send_msg_raw({1: build_message(msg_chain).encode()}, uid=uid)
233217
if result.ret_code:
234218
raise AssertionError(result.ret_code, result.err_msg)
235219
return result.seq
236220

237-
async def upload_grp_image(
238-
self, image: BinaryIO, grp_id: int, is_emoji=False
239-
) -> Image:
221+
async def upload_grp_image(self, image: BinaryIO, grp_id: int, is_emoji=False) -> Image:
240222
img = await self._highway.upload_image(image, gid=grp_id)
241223
if is_emoji:
242224
img.is_emoji = True
243225
return img
244226

245-
async def upload_friend_image(
246-
self, image: BinaryIO, uid: str, is_emoji=False
247-
) -> Image:
227+
async def upload_friend_image(self, image: BinaryIO, uid: str, is_emoji=False) -> Image:
248228
img = await self._highway.upload_image(image, uid=uid)
249229
if is_emoji:
250230
img.is_emoji = True
@@ -265,9 +245,7 @@ async def down_grp_audio(self, audio: Audio, grp_id: int) -> BytesIO:
265245
async def down_friend_audio(self, audio: Audio) -> BytesIO:
266246
return await self._highway.download_audio(audio, uid=self.uid)
267247

268-
async def fetch_image_url(
269-
self, bus_type: Literal[10, 20], node: "IndexNode", gid: int = 0, uid: str = ""
270-
):
248+
async def fetch_image_url(self, bus_type: Literal[10, 20], node: "IndexNode", gid: int = 0, uid: str = ""):
271249
if bus_type == 10:
272250
return await self._get_pri_img_url(uid, node)
273251
elif bus_type == 20:
@@ -300,16 +278,10 @@ async def get_grp_list(self) -> GetGrpListResponse:
300278

301279
async def get_grp_member_info(self, grp_id: int, uid: str) -> GetGrpMemberInfoRsp:
302280
return GetGrpMemberInfoRsp.decode(
303-
(
304-
await self.send_oidb_svc(
305-
0xFE7, 4, PBGetGrpMemberInfoReq.build(grp_id, uid=uid).encode()
306-
)
307-
).data
281+
(await self.send_oidb_svc(0xFE7, 4, PBGetGrpMemberInfoReq.build(grp_id, uid=uid).encode())).data
308282
)
309283

310-
async def get_grp_members(
311-
self, grp_id: int, next_key: Optional[str] = None
312-
) -> GetGrpMemberInfoRsp:
284+
async def get_grp_members(self, grp_id: int, next_key: Optional[str] = None) -> GetGrpMemberInfoRsp:
313285
"""
314286
500 members per request,
315287
get next page: fill 'next_key' from GetGrpMemberInfoRsp.next_key
@@ -324,9 +296,7 @@ async def get_grp_members(
324296
).data
325297
)
326298

327-
async def get_grp_msg(
328-
self, grp_id: int, start: int, end: int = 0, filter_deleted_msg=True
329-
) -> list[GroupMessage]:
299+
async def get_grp_msg(self, grp_id: int, start: int, end: int = 0, filter_deleted_msg=True) -> list[GroupMessage]:
330300
if not end:
331301
end = start
332302
payload = GetGrpMsgRsp.decode(
@@ -339,16 +309,10 @@ async def get_grp_msg(
339309
).body
340310

341311
assert (
342-
payload.grp_id == grp_id
343-
and payload.start_seq == start
344-
and payload.end_seq == end
312+
payload.grp_id == grp_id and payload.start_seq == start and payload.end_seq == end
345313
), "return args not matched"
346314

347-
rsp = list(
348-
await asyncio.gather(
349-
*[parse_grp_msg(self, MsgPushBody.decode(i)) for i in payload.elems]
350-
)
351-
)
315+
rsp = list(await asyncio.gather(*[parse_grp_msg(self, MsgPushBody.decode(i)) for i in payload.elems]))
352316
if filter_deleted_msg:
353317
return [*filter(lambda msg: msg.rand != -1, rsp)]
354318
return rsp
@@ -419,11 +383,7 @@ async def recall_grp_msg(self, grp_id: int, seq: int):
419383
raise AssertionError(result)
420384

421385
async def rename_grp_name(self, grp_id: int, name: str) -> int: # not test
422-
return (
423-
await self.send_oidb_svc(
424-
0x89A, 15, PBGroupRenameRequest.build(grp_id, name).encode()
425-
)
426-
).ret_code
386+
return (await self.send_oidb_svc(0x89A, 15, PBGroupRenameRequest.build(grp_id, name).encode())).ret_code
427387

428388
async def rename_grp_member(self, grp_id: int, target_uid: str, name: str): # fixme
429389
rsp = await self.send_oidb_svc(
@@ -436,11 +396,7 @@ async def rename_grp_member(self, grp_id: int, target_uid: str, name: str): # f
436396
raise AssertionError(rsp.ret_code, rsp.err_msg)
437397

438398
async def leave_grp(self, grp_id: int) -> int: # not test
439-
return (
440-
await self.send_oidb_svc(
441-
0x1097, 1, PBLeaveGroupRequest.build(grp_id).encode()
442-
)
443-
).ret_code
399+
return (await self.send_oidb_svc(0x1097, 1, PBLeaveGroupRequest.build(grp_id).encode())).ret_code
444400

445401
async def kick_grp_member(self, grp_id: int, uin: int, permanent=False):
446402
rsp = await self.send_oidb_svc(
@@ -452,9 +408,7 @@ async def kick_grp_member(self, grp_id: int, uin: int, permanent=False):
452408
if rsp.ret_code:
453409
raise AssertionError(rsp.ret_code, str(rsp.err_msg))
454410

455-
async def send_grp_reaction(
456-
self, grp_id: int, msg_seq: int, content: Union[str, int], is_cancel=False
457-
) -> None:
411+
async def send_grp_reaction(self, grp_id: int, msg_seq: int, content: Union[str, int], is_cancel=False) -> None:
458412
if isinstance(content, str):
459413
assert len(content) == 1, "content must be a emoji"
460414
rsp = await self.send_oidb_svc(
@@ -512,35 +466,25 @@ async def set_mute_grp(self, grp_id: int, enable: bool):
512466
# raise AssertionError(rsp.ret_code, rsp.err_msg)
513467

514468
async def set_mute_member(self, grp_id: int, uin: int, duration: int):
515-
rsp = await self.send_oidb_svc(
516-
0x570, 8, struct.pack(">IBHII", grp_id, 0x20, 1, uin, duration)
517-
)
469+
rsp = await self.send_oidb_svc(0x570, 8, struct.pack(">IBHII", grp_id, 0x20, 1, uin, duration))
518470
if rsp.ret_code:
519471
raise AssertionError(rsp.ret_code, rsp.err_msg)
520472

521473
async def fetch_grp_request(self, count=20) -> FetchGroupResponse:
522474
rsp = FetchGroupResponse.decode(
523-
(
524-
await self.send_oidb_svc(
525-
0x10C0, 1, PBFetchGroupRequest(count=count).encode()
526-
)
527-
).data
475+
(await self.send_oidb_svc(0x10C0, 1, PBFetchGroupRequest(count=count).encode())).data
528476
)
529477
return rsp
530478

531-
async def set_grp_request(
532-
self, grp_id: int, grp_req_seq: int, ev_type: int, action: int, reason=""
533-
):
479+
async def set_grp_request(self, grp_id: int, grp_req_seq: int, ev_type: int, action: int, reason=""):
534480
"""
535481
grp_req_seq: from fetch_grp_request
536482
action: 1 for accept; 2 for reject; 3 for ignore
537483
"""
538484
rsp = await self.send_oidb_svc(
539485
0x10C8,
540486
1,
541-
PBHandleGroupRequest.build(
542-
action, grp_req_seq, ev_type, grp_id, reason
543-
).encode(),
487+
PBHandleGroupRequest.build(action, grp_req_seq, ev_type, grp_id, reason).encode(),
544488
)
545489
if rsp.ret_code:
546490
raise AssertionError(rsp.ret_code, rsp.err_msg)
@@ -551,34 +495,22 @@ async def get_user_info(self, uid: str) -> UserInfo: ...
551495
@overload
552496
async def get_user_info(self, uid: list[str]) -> list[UserInfo]: ...
553497

554-
async def get_user_info(
555-
self, uid: Union[str, list[str]]
556-
) -> Union[UserInfo, list[UserInfo]]:
498+
async def get_user_info(self, uid: Union[str, list[str]]) -> Union[UserInfo, list[UserInfo]]:
557499
if isinstance(uid, str):
558500
uid = [uid]
559-
rsp = GetInfoFromUidRsp.decode(
560-
(
561-
await self.send_oidb_svc(
562-
0xFE1, 8, PBGetInfoFromUidReq(uid=uid).encode()
563-
)
564-
).data
565-
)
501+
rsp = GetInfoFromUidRsp.decode((await self.send_oidb_svc(0xFE1, 8, PBGetInfoFromUidReq(uid=uid).encode())).data)
566502
if not rsp.body:
567503
raise AssertionError("Empty response")
568504
elif len(rsp.body) == 1:
569505
return UserInfo.from_pb(rsp.body[0])
570506
else:
571507
return [UserInfo.from_pb(body) for body in rsp.body]
572508

573-
async def set_grp_bot_hd(
574-
self, grp_id: int, bot_id: int, data_1: str = "", data_2: str = ""
575-
):
509+
async def set_grp_bot_hd(self, grp_id: int, bot_id: int, data_1: str = "", data_2: str = ""):
576510
await self.send_oidb_svc(
577511
0x112E,
578512
1,
579-
SendGrpBotHD(
580-
grp_id=grp_id, bot_id=bot_id, B_id=data_1, B_data=data_2
581-
).encode(),
513+
SendGrpBotHD(grp_id=grp_id, bot_id=bot_id, B_id=data_1, B_data=data_2).encode(),
582514
)
583515

584516
async def set_c2c_bot_hd(self, bot_id: int, data_1: str = "", data_2: str = ""):
@@ -603,9 +535,7 @@ async def get_group_last_seq(self, grp_id: int) -> int:
603535
return rsp.body.args.seq
604536

605537
async def _get_client_key(self) -> str:
606-
return GetClientKeyRsp.decode(
607-
(await self.send_oidb_svc(0x102A, 1, proto_encode({}))).data
608-
).client_key
538+
return GetClientKeyRsp.decode((await self.send_oidb_svc(0x102A, 1, proto_encode({}))).data).client_key
609539

610540
def _gtk_1(self, skey_or_pskey: str):
611541
_hash = 5381
@@ -644,3 +574,18 @@ async def get_skey(self) -> str:
644574
async def get_csrf_token(self) -> int:
645575
skey = await self.get_skey()
646576
return self._gtk_1(skey)
577+
578+
async def get_rkey(self) -> tuple[str, str]:
579+
"""
580+
Returns:
581+
rkey:
582+
Tuple[str, str]: first is private,second is group
583+
"""
584+
body = {
585+
1: {1: {1: 1, 2: 202}, 2: {101: 2, 102: 1, 200: 0}, 3: {1: 2}},
586+
4: {1: [10, 20, 2]},
587+
}
588+
rsp = await self.send_oidb_svc(0x9067, 202, proto_encode(body), True)
589+
a = proto_decode(rsp.data).proto
590+
temp = a[4][1] # type: ignore
591+
return temp[0][1].decode(), temp[1][1].decode() # type: ignore

0 commit comments

Comments
 (0)