def encode_register( seq: int, session_id: bytes, ksid: bytes, uin: int, tgt: bytes, d2: bytes, d2key: bytes, status: Union[int, OnlineStatus], reg_push_reason: Union[str, RegPushReason], ) -> Packet: """Build status service register packet. Called in ``com.tencent.mobileqq.msf.core.push.e.a``. command name: ``StatSvc.register`` Note: Source: com.tencent.mobileqq.msf.core.push.e.a Args: seq (int): Packet sequence. session_id (bytes): Session ID. ksid (bytes): KSID of client. uin (int): User QQ number. tgt (bytes): Siginfo tgt. d2 (bytes): Siginfo d2. d2key (bytes): Siginfo d2 key. status (Union[int, OnlineStatus]): Online status. reg_push_reason (Union[str, RegPushReason]): Reg push reason. battery_status (Optional[int], optional): Battery capacity. Defaults to None. is_power_connected (bool, optional): Is power connected to phone. Defaults to False. Returns: Packet: Register packet. """ COMMAND_NAME = "StatSvc.register" SUB_APP_ID = APK_INFO.sub_app_id svc = _encode_svc_request(uin, status, reg_push_reason) payload = SvcReqRegister.to_bytes(0, svc) req_packet = RequestPacketVersion3( servant_name="PushService", func_name="SvcReqRegister", data=types.MAP({types.STRING("SvcReqRegister"): types.BYTES(payload)}), ).encode() sso_packet = CSsoBodyPacket.build( seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, body=req_packet, extra_data=tgt, ) packet = CSsoDataPacket.build(uin, 1, sso_packet, key=d2key, extra_data=d2) return packet
def encode_heartbeat(seq: int, session_id: bytes, ksid: bytes, uin: int) -> Packet: """Build heartbeat alive packet. Called in `com.tencent.mobileqq.msf.core.C26002ac.A`. command name: `Heartbeat.Alive` Note: Source: oicq.wlogin_sdk.request.n Args: seq (int): Packet sequence. session_id (bytes): Session ID. ksid (bytes): KSID of client. uin (int): User QQ number. Returns: Packet: Login packet. """ COMMAND_NAME = "Heartbeat.Alive" SUB_APP_ID = APK_INFO.sub_app_id sso_packet = CSsoBodyPacket.build(seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, bytes()) packet = CSsoDataPacket.build(uin, 0, sso_packet, key=None) return packet
def encode_force_offline_response( seq: int, session_id: bytes, ksid: bytes, uin: int, tgt: bytes, d2: bytes, d2key: bytes, req_uin: int, seq_no: int, ) -> Packet: """Build status service msf offline response packet. Called in ``com.tencent.mobileqq.msf.core.af.a``. command name: ``StatSvc.RspMSFForceOffline`` Note: Source: com.tencent.mobileqq.msf.core.af.a Args: seq (int): Packet sequence. session_id (bytes): Session ID. ksid (bytes): KSID of client. uin (int): User QQ number. tgt (bytes): Siginfo tgt. d2 (bytes): Siginfo d2. d2key (bytes): Siginfo d2 key. req_uin (int): Request offline uin. seq_no (int): Request sequence number. Returns: Packet: msf force offline response packet. """ COMMAND_NAME = "StatSvc.RspMSFForceOffline" SUB_APP_ID = APK_INFO.sub_app_id resp = ResponseMSFForceOffline(uin=req_uin, seq_no=seq_no, c=bytes(1)) payload = ResponseMSFForceOffline.to_bytes(0, resp) resp_packet = RequestPacketVersion3( servant_name="StatSvc", func_name="RspMSFForceOffline", data=types.MAP( {types.STRING("RspMSFForceOffline"): types.BYTES(payload)} ), ).encode() sso_packet = CSsoBodyPacket.build( seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, body=resp_packet, extra_data=tgt, ) packet = CSsoDataPacket.build(uin, 1, sso_packet, key=d2key, extra_data=d2) return packet
def encode_login_request20( seq: int, key: bytes, session_id: bytes, ksid: bytes, uin: int, t104: bytes, g: bytes, ) -> Packet: """Build device lock login request packet. Called in ``oicq.wlogin_sdk.request.WtloginHelper.GetStWithoutPasswd``. command id: ``0x810 = 2064`` sub command id: ``20`` command name: ``wtlogin.login`` Note: Source: oicq.wlogin_sdk.request.p Args: seq (int): Packet sequence. key (bytes): 16 bits key used to decode the response. session_id (bytes): Session ID. ksid (bytes): KSID of client. uin (int): User QQ number. t104 (bytes): T104 response data. g (bytes): md5 of (guid + dpwd + t402). Returns: Packet: Login packet. """ COMMAND_ID = 2064 SUB_COMMAND_ID = 20 COMMAND_NAME = "wtlogin.login" SUB_APP_ID = APK_INFO.sub_app_id BITMAP = APK_INFO.bitmap SUB_SIGMAP = APK_INFO.sub_sigmap LOCAL_ID = 2052 # oicq.wlogin_sdk.request.t.v data = Packet.build( struct.pack(">HH", SUB_COMMAND_ID, 4), # packet num TlvEncoder.t8(LOCAL_ID), TlvEncoder.t104(t104), TlvEncoder.t116(BITMAP, SUB_SIGMAP), TlvEncoder.t401(g), ) oicq_packet = OICQRequest.build_encoded(uin, COMMAND_ID, ECDH.encrypt(data, key), ECDH.id) sso_packet = CSsoBodyPacket.build( seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, oicq_packet, ) # encrypted by 16-byte zero. Reference: ``CSSOData::serialize`` packet = CSsoDataPacket.build(uin, 2, sso_packet, key=bytes(16)) return packet
def encode_login_request2_captcha( seq: int, key: bytes, session_id: bytes, ksid: bytes, uin: int, captcha: str, sign: bytes, t104: bytes, ) -> Packet: """Build submit captcha request packet. Called in ``oicq.wlogin_sdk.request.WtloginHelper.CheckPictureAndGetSt``. command id: ``0x810 = 2064`` sub command id: ``2`` command name: ``wtlogin.login`` Note: Source: oicq.wlogin_sdk.request.n Args: seq (int): Packet sequence. key (bytes): 16 bits key used to decode the response. session_id (bytes): Session ID. ksid (bytes): KSID of client. uin (int): User QQ number. captcha (str): Captcha image result. sign (bytes): Signature of the captcha. t104 (bytes): TLV 104 data. Returns: Packet: Login packet. """ COMMAND_ID = 2064 SUB_COMMAND_ID = 2 COMMAND_NAME = "wtlogin.login" SUB_APP_ID = APK_INFO.sub_app_id BITMAP = APK_INFO.bitmap SUB_SIGMAP = APK_INFO.sub_sigmap LOCAL_ID = 2052 # oicq.wlogin_sdk.request.t.v data = Packet.build( struct.pack(">HH", SUB_COMMAND_ID, 4), # packet num TlvEncoder.t2(captcha.encode(), sign), TlvEncoder.t8(LOCAL_ID), TlvEncoder.t104(t104), TlvEncoder.t116(BITMAP, SUB_SIGMAP), ) oicq_packet = OICQRequest.build_encoded(uin, COMMAND_ID, ECDH.encrypt(data, key), ECDH.id) sso_packet = CSsoBodyPacket.build( seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, oicq_packet, ) # encrypted by 16-byte zero. Reference: ``CSSOData::serialize`` packet = CSsoDataPacket.build(uin, 2, sso_packet, key=bytes(16)) return packet
def encode_login_request9( seq: int, key: bytes, session_id: bytes, ksid: bytes, uin: int, password_md5: bytes, ) -> Packet: """Build main login request packet. Called in ``oicq.wlogin_sdk.request.WtloginHelper.GetStWithPasswd``. command id: ``0x810 = 2064`` sub command id: ``9`` command name: ``wtlogin.login`` Note: Source: oicq.wlogin_sdk.request.k Args: seq (int): Packet sequence. key (bytes): 16 bits key used to decode the response. session_id (bytes): Session ID. ksid (bytes): KSID of client. uin (int): User QQ number. password_md5 (bytes): User QQ password md5 hash. Returns: Packet: Login packet. """ COMMAND_ID = 2064 SUB_COMMAND_ID = 9 COMMAND_NAME = "wtlogin.login" APK_ID = APK_INFO.apk_id APK_VERSION = APK_INFO.version APK_SIGN = APK_INFO.apk_sign APK_BUILD_TIME = APK_INFO.build_time APP_ID = APK_INFO.app_id SUB_APP_ID = APK_INFO.sub_app_id APP_CLIENT_VERSION = 0 SDK_VERSION = APK_INFO.sdk_version SSO_VERSION = APK_INFO.sso_version BITMAP = APK_INFO.bitmap MAIN_SIGMAP = APK_INFO.main_sigmap SUB_SIGMAP = APK_INFO.sub_sigmap GUID_SRC = 1 GUID_CHANGE = 0 GUID_FLAG = 0 GUID_FLAG |= GUID_SRC << 24 & 0xFF000000 GUID_FLAG |= GUID_CHANGE << 8 & 0xFF00 CAN_WEB_VERIFY = 130 # oicq.wlogin_sdk.request.k.K LOCAL_ID = 2052 # oicq.wlogin_sdk.request.t.v IP_BYTES: bytes = ipaddress.ip_address(DEVICE.ip_address).packed NETWORK_TYPE = (DEVICE.apn == "wifi") + 1 data = Packet.build( struct.pack(">HH", SUB_COMMAND_ID, 23), # packet num TlvEncoder.t18(APP_ID, APP_CLIENT_VERSION, uin), TlvEncoder.t1(uin, int(time.time()), IP_BYTES), TlvEncoder.t106( SSO_VERSION, APP_ID, SUB_APP_ID, APP_CLIENT_VERSION, uin, 0, password_md5, DEVICE.guid, DEVICE.tgtgt, ), TlvEncoder.t116(BITMAP, SUB_SIGMAP), TlvEncoder.t100(SSO_VERSION, APP_ID, SUB_APP_ID, APP_CLIENT_VERSION, MAIN_SIGMAP), TlvEncoder.t107(), # TlvEncoder.t108(KSID), # null when first time login # TlvEncoder.t104(), TlvEncoder.t142(APK_ID), TlvEncoder.t144( DEVICE.imei.encode(), DEVICE.bootloader, DEVICE.proc_version, DEVICE.version.codename, DEVICE.version.incremental, DEVICE.fingerprint, DEVICE.boot_id, DEVICE.android_id, DEVICE.baseband, DEVICE.version.incremental, DEVICE.os_type.encode(), DEVICE.version.release.encode(), NETWORK_TYPE, DEVICE.sim.encode(), DEVICE.apn.encode(), False, True, False, GUID_FLAG, DEVICE.model.encode(), DEVICE.guid, DEVICE.brand.encode(), DEVICE.tgtgt, ), TlvEncoder.t145(DEVICE.guid), TlvEncoder.t147(APP_ID, APK_VERSION.encode(), APK_SIGN), # TlvEncoder.t166(1), # TlvEncoder.t16a(), TlvEncoder.t154(seq), TlvEncoder.t141(DEVICE.sim.encode(), NETWORK_TYPE, DEVICE.apn.encode()), TlvEncoder.t8(LOCAL_ID), TlvEncoder.t511([ "tenpay.com", "openmobile.qq.com", "docs.qq.com", "connect.qq.com", "qzone.qq.com", "vip.qq.com", "gamecenter.qq.com", "qun.qq.com", "game.qq.com", "qqweb.qq.com", "office.qq.com", "ti.qq.com", "mail.qq.com", "mma.qq.com", ]), # com.tencent.mobileqq.msf.core.auth.l # TlvEncoder.t172(), # TlvEncoder.t185(1), # when sms login, is_password_login == 3 # TlvEncoder.t400(), # null when first time login TlvEncoder.t187(DEVICE.mac_address.encode()), TlvEncoder.t188(DEVICE.android_id.encode()), TlvEncoder.t194(DEVICE.imsi_md5) if DEVICE.imsi_md5 else b"", TlvEncoder.t191(CAN_WEB_VERIFY), # TlvEncoder.t201(), TlvEncoder.t202(DEVICE.wifi_bssid.encode(), DEVICE.wifi_ssid.encode()), TlvEncoder.t177(APK_BUILD_TIME, SDK_VERSION), TlvEncoder.t516(), TlvEncoder.t521(), TlvEncoder.t525(TlvEncoder.t536([])), # TlvEncoder.t318() # not login in by qr ) oicq_packet = OICQRequest.build_encoded(uin, COMMAND_ID, ECDH.encrypt(data, key), ECDH.id) sso_packet = CSsoBodyPacket.build( seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, oicq_packet, ) # encrypted by 16-byte zero. Reference: ``CSSOData::serialize`` packet = CSsoDataPacket.build(uin, 2, sso_packet, key=bytes(16)) return packet
def encode_login_request8( seq: int, key: bytes, session_id: bytes, ksid: bytes, uin: int, t104: bytes, t174: bytes, ) -> Packet: """Build sms request packet. Called in ``oicq.wlogin_sdk.request.WtloginHelper.RefreshSMSData``. command id: ``0x810 = 2064`` sub command id: ``8`` command name: ``wtlogin.login`` Note: Source: oicq.wlogin_sdk.request.r Args: seq (int): Packet sequence. key (bytes): 16 bits key used to decode the response. session_id (bytes): Session ID. ksid (bytes): KSID of client. uin (int): User QQ number. t104 (bytes): TLV 104 data. t174 (bytes): TLV 174 data. Returns: Packet: Login packet. """ COMMAND_ID = 2064 SUB_COMMAND_ID = 8 COMMAND_NAME = "wtlogin.login" SMS_APP_ID = 9 SUB_APP_ID = APK_INFO.sub_app_id BITMAP = APK_INFO.bitmap SUB_SIGMAP = APK_INFO.sub_sigmap GUID_SRC = 1 GUID_CHANGE = 0 GUID_FLAG = 0 GUID_FLAG |= GUID_SRC << 24 & 0xFF000000 GUID_FLAG |= GUID_CHANGE << 8 & 0xFF00 LOCAL_ID = 2052 # oicq.wlogin_sdk.request.t.v data = Packet.build( struct.pack(">HH", SUB_COMMAND_ID, 6), # packet num TlvEncoder.t8(LOCAL_ID), TlvEncoder.t104(t104), TlvEncoder.t116(BITMAP, SUB_SIGMAP), TlvEncoder.t174(t174), TlvEncoder.t17a(SMS_APP_ID), TlvEncoder.t197(), ) oicq_packet = OICQRequest.build_encoded(uin, COMMAND_ID, ECDH.encrypt(data, key), ECDH.id) sso_packet = CSsoBodyPacket.build( seq, SUB_APP_ID, COMMAND_NAME, DEVICE.imei, session_id, ksid, oicq_packet, ) # encrypted by 16-byte zero. Reference: ``CSSOData::serialize`` packet = CSsoDataPacket.build(uin, 2, sso_packet, key=bytes(16)) return packet