取消序列化从telegram.org服务器

时间:2016-09-05 16:03:10

标签: python api telegram

我无法反序列化msg_container对象。问题似乎是我理解flags字段在message中的位置,因为它对我没有意义。我的假设来自阅读此页面:https://core.telegram.org/mtproto/TL

这是我所看到的,我希望有人可以澄清。

电报服务器的响应如下:

    ('server_answer: ', '\xdc\xf8\xf1s\x02\x00\x00\x00\x018\xcb\x8cCu\xcdW\x01\x00\x00\x00\x1c\x00\x00\x00\x08\t\xc2\x9e\x00t\xbe?Cu\xcdW\x82\x0e:\x11\xe0\xda\xed\x05\xd7\xbezI4\x05Tf\x01\xdc\xcb\x8cCu\xcdW\x02\x00\x00\x00\x14\x00\x00\x00Y\xb4\xd6b\x15\xc4\xb5\x1c\x01\x00\x00\x00\x00t\xbe?Cu\xcdW')

 0 | DC F8 F1 73 02 00 00 00
 8 | 01 38 CB 8C 43 75 CD 57
16 | 01 00 00 00 1C 00 00 00
24 | 08 09 C2 9E 00 74 BE 3F
32 | 43 75 CD 57 82 0E 3A 11
40 | E0 DA ED 05 D7 BE 7A 49
48 | 34 05 54 66 01 DC CB 8C
56 | 43 75 CD 57 02 00 00 00
64 | 14 00 00 00 59 B4 D6 62
72 | 15 C4 B5 1C 01 00 00 00
80 | 00 74 BE 3F 43 75 CD 57

表示MessageContainer对象,如下所示:

msg_container#73f1f8dc messages:vector<message> = MessageContainer;

(注意:73f1f8dc是返回的前四个字节,以小端顺序排列)

由于msg_containervector messages,下一个整数是message计数,即00 00 00 02,因此此处有两条消息矢量。

message看起来像这样:

message#c09be45f flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int = Message;
messageService#9e19a1f6 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer reply_to_msg_id:flags.3?int date:int action:MessageAction = Message;

所以我假设接下来的四个字节将是第一个消息中的第一个参数,即flags字段。但是这四个字节的值是8c cb 38 01,它是2362128385L作为无符号整数,这对于简单的位掩码来说是可疑的。另外,如果我使用此值从字节流的其余部分反序列化可选参数,则它们没有意义,并最终因类型不匹配而失败。我已经尝试将flags字段作为有符号整数,并且结果类似。

我对电报服务器如何用msg_container对象做出反应的理解不正确?

1 个答案:

答案 0 :(得分:1)

这是一种用于处理容器中打包的消息的简单方法:

Container_type_header
Content_count
[messages]

每封邮件的打包方式如下:

msgs_id
seq_no
mgs_len
msg_body

给出您的样本数据:

DCF8F173 --> container_type_header
02000000 --> message_count_in_container

0138CB8C4375CD57 --> msg_id of first message
01000000 --> seq_no of first message
1C000000 --> length of first message; 1C == 28 bytes
0809C29E0074BE3F4375CD57820E3A11E0DAED05D7BE7A4934055466 --> 28 byte msg_body

01DCCB8C4375CD57 --> msg_id of second message
02000000 --> seq_number of second message
14000000 --> lenght of second message; 14 == 20 bytes
59B4D66215C4B51C010000000074BE3F4375CD57 --> 20 byte msg_body

解码后的第一条消息给出:

0809C29E0074BE3F4375CD57820E3A11E0DAED05D7BE7A4934055466

New_Session_Created{first_msg_id: 6326841983218119680,  server_salt: 7373524212041563863, unique_id: 427238195566612098}

解码后的第二条消息给出:

0x59B4D66215C4B51C010000000074BE3F4375CD57 

Msgs_Ack{msg_ids: [6326841983218119680]}