我正在尝试用 python 编写一个简单的程序来使用电报 api,(不是 bot api,主消息 api)现在我已经编写了这段代码

#!/usr/bin/env python

import socket
import random
import time
import struct
import requests

def swap64(i):
        return struct.unpack("<L", struct.pack(">L", i))[0]


MESSAGE = '0000000000000000'+format(swap32(int(time.time()*1000%1000)<<21|random.randint(0,1048575)<<3|4),'x')+format(swap32(int(time.time())),'x')+'140000007897466068edeaecd1372139bbb0394b6fd775d3'

res = requests.post(url='http://149.154.167.40',
                    data=bytes.fromhex(MESSAGE),
                    headers={'connection': 'keep-alive'})


print("received data:", res)

对于post数据的有效载荷,我使用了telegram web的源代码,0 auth id,message id是使用telegram web中的算法生成的,接下来是长度(14000000)就像在源和main doc中一样,然后是方法等等,
当我运行这段代码时,我得到了 received data: <Response [404]> 我已经使用了 tcp 和 http 传输,tcp 一个没有给我任何来自服务器的答案,我不知道我的代码哪里错了
如果有人可以在我的代码中显示错误,我会很高兴
顺便说一句,这里是我生成的请求的十六进制转储:
0000   34 08 04 17 7a ec 48 5d 60 84 ba ed 08 00 45 00
0010   00 50 c6 07 40 00 40 06 76 28 c0 a8 01 0d 95 9a
0020   a7 28 c9 62 00 50 0d 1a 3b df 41 5a 40 7f 50 18
0030   72 10 ca 39 00 00 00 00 00 00 00 00 00 00 6c 28
0040   22 4a 94 a9 c9 56 14 00 00 00 78 97 46 60 68 ed
0050   ea ec d1 37 21 39 bb b0 39 4b 6f d7 75 d3

我已经阅读了 thisthis 以及许多其他文档,但无法找出我的问题
提前致谢

更新

我按照建议使用了此代码
TCP_IP = '149.154.167.40'
TCP_PORT = 80

MESSAGE = 'ef0000000000000000'+"{0:0{1}x}".format(int(time.time()*4294.967296*1000),16)+'140000007897466068edeaecd1372139bbb0394b6fd775d3'

BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(bytes.fromhex(MESSAGE))
data = s.recv(BUFFER_SIZE)
s.close()

我仍然没有得到回应
我的请求的十六进制转储:
0000   34 08 04 17 7a ec 48 5d 60 84 ba ed 08 00 45 00
0010   00 51 e1 44 40 00 40 06 5a ea c0 a8 01 0d 95 9a
0020   a7 28 df 8c 00 50 e4 0d 12 46 e2 98 bf a3 50 18
0030   72 10 af 66 00 00 ef 00 00 00 00 00 00 00 00 00
0040   16 37 dc e1 28 39 23 14 00 00 00 78 97 46 60 68
0050   ed ea ec d1 37 21 39 bb b0 39 4b 6f d7 75 d3

固定码

终于可以使用此代码
import socket
import random
import time
import struct
import requests

def swap32(i):
        return struct.unpack("<L", struct.pack(">L", i))[0]

TCP_IP = '149.154.167.40'
TCP_PORT = 80
z = int(time.time()*4294.967296*1000000)
z = format(z,'x')
q = bytearray.fromhex(z)
e = q[::-1].hex()
MESSAGE = 'ef0a0000000000000000'+e+'140000007897466068edeaecd1372139bbb0394b6fd775d3'

BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(bytes.fromhex(MESSAGE))
data = s.recv(BUFFER_SIZE)
s.close()

print(data)

最佳答案

这是来自与 Telegram 服务器的简单 TCP 握手的示例数据:

Connect:Success:0
Connected to 149.154.167.40:443

    raw_data: 000000000000000000F011DB3B2AA9561400000078974660A9729A4F5B51F18F7943F9C0D61B1315
 auth_key_id: 0000000000000000  0
  message_id: 56A92A3BDB11F000  6244568794892726272
 data_length: 00000014  20
message_data: 78974660A9729A4F5B51F18F7943F9C0D61B1315
message_type: 60469778

>> EF0A000000000000000000F011DB3B2AA9561400000078974660A9729A4F5B51F18F7943F9C0D61B1315
Send:Success:42
Receive:Success:85
<< 15000000000000000001CC0CC93D2AA9564000000063241605A9729A4F5B51F18F7943F9C0D61B1315B4445B94718B3C6DD4136466FAC62DCD082311272BE9FF8F9700000015C4B51C01000000216BE86C022BB4C3

    raw_data: 000000000000000001CC0CC93D2AA9564000000063241605A9729A4F5B51F18F7943F9C0D61B1315B4445B94718B3C6DD4136466FAC62DCD082311272BE9FF8F9700000015C4B51C01000000216BE86C022BB4C3
 auth_key_id: 0000000000000000  0
  message_id: 56A92A3DC90CCC01  6244568803180334081
 data_length: 00000040  64
message_data: 63241605A9729A4F5B51F18F7943F9C0D61B1315B4445B94718B3C6DD4136466FAC62DCD082311272BE9FF8F9700000015C4B51C01000000216BE86C022BB4C3
message_type: 05162463


     classid: resPQ#05162463
       nonce: A9729A4F5B51F18F7943F9C0D61B1315
server_nonce: B4445B94718B3C6DD4136466FAC62DCD
          pq: 2311272BE9FF8F97  2526843935494475671
       count: 00000001  1
fingerprints: C3B42B026CE86B21  14101943622620965665

让我们分解一下:
  • 我们使用的是 TCP 删节版,所以我们从 0xEF
  • 开始
  • 纯文本 Telegram 消息的格式为 auth_ke_id + msg_id + msg_len + msg
  • auth_key_id 对于纯文本消息总是 0 因此我们总是从 0000000000000000
  • 开始
  • msg_id 必须近似等于 unixtime*2^32 ( see here ) 我还看到,它的一些变体对于任何平台上任何语言的 msg_id 都非常有效:whole_part_of(current_micro_second_time_stamp * 4294.967296)
  • 生成 Auth_key 的第一条消息是 reqPQ,它被定义为: reqPQ#0x60469778 {:nonce, :int128} 所以它只是一个 TL-header + 一个 128 位随机整数,总长度总是 4 + 16 = 20 编码为小端将是 msg_len = 14000000
  • 说我们有一个 128 位随机整数= 55555555555555555555555555555555,那么我们的 reqPQ 消息将是 789746605555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555559
  • 在您发送数据包之前,再次记忆一下 TCP 删节模式要求您在初始 0xEA 之后的其他字节前面包含总数据包长度。该数据包长度计算如下

    让 len = total_length/4

    a) 如果 60469778 那么 len < 127
    b) 如果 len_header = len as byte 那么 len >=127

  • 最后我们有:
    EF0A000000000000000000F011DB3B2AA956140000007897466055555555555555555555555555555555
    

    或者
    EF0A
    0000000000000000
    00F011DB3B2AA956
    14000000
    78974660
    55555555555555555555555555555555
    

    与你的相比:
    0000000000000000
    6C28224A94A9C956
    14000000
    78974660
    68EDEAECD1372139BBB0394B6FD775D3
    

    我会说,尝试通过包含 len_header = 0x7f + to_3_byte_little_endian(len) 起始位并重新检查您的 0xEF 计算来尝试使用 TCP-abriged 模式

    干杯。

    关于python - Telegram Api - 创建授权 key 404 错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35536268/

    10-12 19:38