register - telegram python bot install
Telegram Api-Creando un error de clave de autorización 404 (1)
Intento escribir un programa simple en python para usar telegram api, (no bot api, api de mensajería principal) Ahora he escrito este código
#!/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)
Para la carga útil de los datos postales utilicé el código fuente del telegrama web, el ID de autenticación 0, el ID del mensaje se genera utilizando el algoritmo en la web del telegrama, el siguiente es la longitud (14000000) como en el documento fuente y principal y luego el método y así Encendido, cuando ejecuto este código recibo received data: <Response [404]>
He utilizado tanto el transporte tcp como http con esto y tcp uno no me da nada como respuesta del servidor, no sé dónde estoy equivocado en mi código me alegraría si alguien puede mostrar el error en mi código por cierto aquí está el volcado hexadecimal de mi solicitud generada:
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
Ya he leído esto y esto y muchos otros documentos, pero no puedo encontrar mi problema gracias de antemano
actualizar
utilicé este código como se sugirió
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()
y todavía no recibo respuesta hex de mi solicitud:
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
Código fijo
Finalmente lo conseguí trabajando con este código
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)
aquí hay datos de muestra de un simple handshake TCP con servidores Telegram:
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
Vamos a descomponerlo:
Estamos utilizando la versión abreviada de TCP, así que comenzamos con 0xEF
El formato para los mensajes de telegrama de texto sin formato es
auth_ke_id + msg_id + msg_len + msg
auth_key_id
siempre es0
para mensajes de texto sin formato, por lo tanto siempre comenzamos con0000000000000000
msg_id
debe ser aproximadamente igual aunixtime*2^32
( ver aquí ) También he visto que alguna variante de esto funciona bastante bien paramsg_id
en cualquier idioma en cualquier plataforma:whole_part_of(current_micro_second_time_stamp * 4294.967296)
El primer mensaje que comienza con la generación Auth_key es
reqPQ
que se define como:reqPQ#0x60469778 {:nonce, :int128}
por lo que es simplemente un encabezado TL + un entero aleatorio de 128 bits la longitud total siempre será 4 + 16 = 20 codificado como little-endian que seríamsg_len = 14000000
digamos que tenemos un entero aleatorio de 128 bits = 55555555555555555555555555555555, entonces nuestro mensaje reqPQ sería 7897466055555555555555555555555555555555, que es simplemente TL-type
60469778
o 78974660 en little-endian seguido de su elección aleatoria de nonce de 128 bits.Antes de enviar el paquete, recuerde nuevamente que el modo abreviado TCP requiere que incluya la longitud total del paquete frente a los otros bytes justo después del 0xEA inicial. La longitud de este paquete se calcula de la siguiente manera
let len = total_length / 4
a) Si
len < 127
thenlen_header = len as byte
b) Si
len >=127
thenlen_header = 0x7f + to_3_byte_little_endian(len)
finalmente tenemos:
EF0A000000000000000000F011DB3B2AA956140000007897466055555555555555555555555555555555
o
EF0A
0000000000000000
00F011DB3B2AA956
14000000
78974660
55555555555555555555555555555555
comparado con el tuyo:
0000000000000000
6C28224A94A9C956
14000000
78974660
68EDEAECD1372139BBB0394B6FD775D3
Yo diría que intente usar el modo aberrado a TCP incluyendo el bit de inicio 0xEF
y vuelva a verificar su cómputo de msg_id
aclamaciones.