Una vez quise tener mensajes de uno de los chats de telegramas almacenados en mi disco (sin iniciar un cliente normal). No revelaré mis motivos, pero esta oportunidad me pareció necesaria y útil.
Hay bots en el telegrama para esto. En Habré hay algunos artículos dedicados a los bots, por ejemplo: " Asistente de chat para el sitio ".
El bot le permite leer y enviar mensajes, no necesita un teléfono para registrar un bot, y la cantidad de bots puede ser cualquiera. Pero el nombre del bot incluye la palabra "bot", que puede causar preguntas innecesarias del anfitrión del chat.
Pero, como dicen, una pregunta correcta es la mitad de la respuesta.
Resulta que además de la "API de bot de Telegram", también existe la "API de cliente de Telegram", es decir API para crear tus propios clientes.
El cliente también puede enviar y leer mensajes, pero solo de un usuario registrado (vinculado al teléfono), lo cual me conviene (ya estoy registrado en el chat).
El sitio web de Telegram tiene una lista de API para diferentes plataformas: https://telegram.org/apps#source-code
Sin embargo, la biblioteca más fácil de usar fue python: la biblioteca cliente de Telegram API Pure Python 3 MTProto llamada "telethon"
Solo aquí está el problema. No se python. Bueno, hay motivos para conocerte.
Según el manual de Teleton, su instalación es muy sencilla. Simplemente ejecute el comando en la línea de comando:
pip3 install telethon
Errores que encontré durante la instalación:
- pip3 no está instalado (instalador para python).
sudo apt-get -y instalar python3-pip
- La biblioteca solo funciona en versiones de Python> 3.5. Entonces puede que tenga que actualizarlo.
Todo ha sido establecido. Desplácese más readme.txt.
El siguiente punto es la creación de un cliente de telegramas ... ¿Cómo, ya? Bueno, sí, todo es simple. Es cierto, primero debes registrarte como el creador del cliente.
Vamos al sitio web de Telegram: https://my.telegram.org
Ingresamos al teléfono y esperamos el código de confirmación en el cliente nativo del telegrama. Es bastante largo (12 caracteres) e inconveniente para la entrada.
Vamos al elemento " API ". Buscamos la "API de Telegram" y vamos a "Crear una aplicación" ( https://my.telegram.org/apps ).
Complete los campos Título de la aplicación y Nombre corto , haga clic en "Crear aplicación" y recuerde dos variables: api_id y api_hash .
Es hora de hacer un cliente.
from telethon import TelegramClient, sync # api_id api_hash api_id = 12345 api_hash = '0123456789abcdef0123456789abcdef' client = TelegramClient('session_name', api_id, api_hash) client.start()
session_name: puede insertar cualquier nombre. Se le pedirá que ingrese el teléfono y se le enviará un código de confirmación. Después de eso, el cliente funcionará sin llamar al teléfono (hasta que cambie el nombre de sesión). El archivo session_name.session aparecerá junto a su programa.
Si no hay errores, el cliente está listo. Solo que ahora no muestra nada. Intentemos obtener información útil.
Aprende un poco sobre ti:
print(client.get_me().stringify())
el resultado se da en la forma:
User( photo=None, last_name='Pupkin', first_name='Vasya', id=123456789, phone='79041234567', .... - - ... )
Podemos enviar un mensaje de nosotros mismos:
client.send_message('username', 'Hello! Talking to you from Telethon')
Puedes y una foto
client.send_file('username', '/home/myself/Pictures/holidays.jpg')
Como otros me ven:
client.download_profile_photo('me')
Vemos a qué chats estamos suscritos:
print all chats name for dialog in client.iter_dialogs(): print(dialog.title)
leemos todos los mensajes de chat "chat_name" (cuidadosamente, puede haber muchos mensajes)
messages = client.get_entity('chat_name') print(messages)
ver todos los usuarios de chat
participants = client.get_participants('chat_name') print(participants)
¿Permitido?
Ahora, de hecho, estamos haciendo lo que todos comenzamos para ...
Necesitamos un programa que monitoree nuevos mensajes en un canal específico.
Para evitar que el cliente termine el trabajo, después de client.start () insertamos la línea:
client.run_until_disconnected()
Esta construcción (insertada antes de client.start ()) muestra solo mensajes nuevos:
@client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) print(event.message.to_dict()['message'])
Vamos a resolverlo.
@client.on(events.NewMessage(chats=('chat_name')))
crea un evento que se activa cuando aparece un nuevo mensaje
print(event.message)
muestra un mensaje en este formulario:
Message(edit_date=None, views=None, reply_markup=None, fwd_from=None, id=187, entities=[], post=False, mentioned=False, via_bot_id=None, media_unread=False, out=True, media=None, date=datetime.datetime(2018, 10, 1, 9, 26, 21, tzinfo=datetime.timezone.utc), to_id=PeerChannel(channel_id=123456789), reply_to_msg_id=None, from_id=123456789, silent=False, grouped_id=None, post_author=None, message='hello telegram')
De todo esto necesitamos un campo: "mensaje = 'hola telegrama'":
print(event.message.to_dict()['message'])
El mensaje fue recibido, pero de quién es, no está claro, porque solo ID de usuario por mensaje. Para hacer coincidir la ID y el nombre de usuario, descargue todos los usuarios de chat y póngalos en el diccionario (hash) en la forma d [id] = "first_name last_name"
participants = client.get_participants(group) users={} for partic in client.iter_participants(group): lastname="" if partic.last_name: lastname=partic.last_name users[partic.id]=partic.first_name+" "+lastname
Ahora podemos averiguar quién envió el mensaje:
s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id)
En principio, puede obtener el nombre de usuario directamente desde el telegrama, pero si hay pocos usuarios, es más fácil con un diccionario.
Obtenemos la fecha de envío del mensaje:
mess_date=event.message.to_dict()['date']
Todo, todos los datos que tenemos. Queda por escribirlos en un archivo.
Para hacer esto, primero abra el archivo para escribir:
f=open('messages_from_chat', 'a')
Y escribe el mensaje:
f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush()
Eso es todo! Todo lo que necesitaba, el programa lo hace. La utilidad, por supuesto, está húmeda, pero realiza su tarea.
Python no fue tan complicado como está pintado , especialmente porque la descripción de varias bibliotecas en Internet está completa. Para escribir un par de utilidades más y acostumbrarse, puede usarlo como un lenguaje de script en lugar de bash.
El texto completo de la utilidad: from telethon import TelegramClient, sync, events api_id = 12345 api_hash = '0123456789abcdef0123456789abcdef' client = TelegramClient('session_name', api_id, api_hash) @client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) user_mess=event.message.to_dict()['message'] s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id) mess_date=event.message.to_dict()['date'] f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush() client.start() group='group_name' participants = client.get_participants(group) users={} for partic in client.iter_participants(group): lastname="" if partic.last_name: lastname=partic.last_name users[partic.id]=partic.first_name+" "+lastname f=open('messages_from_chat', 'a') client.run_until_disconnected() f.close()
Descripción completa de la biblioteca .