Telegram Api - 创建授权密钥 404 错误
Telegram Api - Creating an Authorization Key 404 error
我正在尝试在 python 中编写一个简单的程序来使用电报 api,(不是机器人 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数据的有效负载,我使用了电报网络的源代码,0 auth id,消息ID是使用电报网络中的算法生成的,接下来是长度(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
我已经阅读了 and 和许多其他文档,但无法找出我的问题
提前致谢
更新
我按照建议使用了此代码
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 开始
plain-text 电报消息的格式为 auth_ke_id + msg_id + msg_len + msg
auth_key_id
对于 plain-text 消息总是 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,编码为 little-endian 即 msg_len = 14000000
假设我们有一个 128 位随机整数= 5555555555555555555555555555555,那么我们的 reqPQ 消息将是 7897466055555555555555555555555555555555,这就是 TL-type [=70 in [=285=]4 或 66 ] 然后是您随机选择的 128 位随机数。
在发送数据包之前,再次回想一下 TCP-abridged 模式要求您在初始 0xEA 之后的其他字节前面包括总数据包长度。此数据包长度计算如下
让 len = total_length / 4
a) 如果 len < 127
那么 len_header = len as byte
b) 如果 len >=127
那么 len_header = 0x7f + to_3_byte_little_endian(len)
最后我们有:
EF0A000000000000000000F011DB3B2AA956140000007897466055555555555555555555555555555555
或
EF0A
0000000000000000
00F011DB3B2AA956
14000000
78974660
55555555555555555555555555555555
与你的相比:
0000000000000000
6C28224A94A9C956
14000000
78974660
68EDEAECD1372139BBB0394B6FD775D3
我会说,尝试使用 TCP-abriged 模式,包括 0xEF
起始位和 re-check 你的 msg_id
计算
干杯。
我正在尝试在 python 中编写一个简单的程序来使用电报 api,(不是机器人 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数据的有效负载,我使用了电报网络的源代码,0 auth id,消息ID是使用电报网络中的算法生成的,接下来是长度(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
我已经阅读了
更新
我按照建议使用了此代码
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 开始
plain-text 电报消息的格式为
auth_ke_id + msg_id + msg_len + msg
auth_key_id
对于 plain-text 消息总是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,编码为 little-endian 即msg_len = 14000000
假设我们有一个 128 位随机整数= 5555555555555555555555555555555,那么我们的 reqPQ 消息将是 7897466055555555555555555555555555555555,这就是 TL-type [=70 in [=285=]4 或 66 ] 然后是您随机选择的 128 位随机数。
在发送数据包之前,再次回想一下 TCP-abridged 模式要求您在初始 0xEA 之后的其他字节前面包括总数据包长度。此数据包长度计算如下
让 len = total_length / 4
a) 如果
len < 127
那么len_header = len as byte
b) 如果
len >=127
那么len_header = 0x7f + to_3_byte_little_endian(len)
最后我们有:
EF0A000000000000000000F011DB3B2AA956140000007897466055555555555555555555555555555555
或
EF0A
0000000000000000
00F011DB3B2AA956
14000000
78974660
55555555555555555555555555555555
与你的相比:
0000000000000000
6C28224A94A9C956
14000000
78974660
68EDEAECD1372139BBB0394B6FD775D3
我会说,尝试使用 TCP-abriged 模式,包括 0xEF
起始位和 re-check 你的 msg_id
计算
干杯。