Lauschen Sie einem Telegramm-Chat mit Ihrem Client

Ich wollte einmal Nachrichten von einem der Telegramm-Chats auf meiner Festplatte speichern (ohne einen normalen Client zu starten). Ich werde meine Motive nicht preisgeben, aber diese Gelegenheit erschien mir notwendig und nützlich.


Dafür gibt es Bots im Telegramm. Auf Habré gibt es mehrere Artikel, die Bots gewidmet sind, zum Beispiel: " Chat-Assistent der Site ".


Mit dem Bot können Sie Nachrichten lesen und senden, Sie benötigen kein Telefon, um einen Bot zu registrieren, und die Anzahl der Bots kann beliebig sein. Der Name des Bots enthält jedoch das Wort "Bot", was zu unnötigen Fragen des Chat-Hosts führen kann.


Aber wie sie sagen, ist eine richtig gestellte Frage die halbe Antwort.


Es stellt sich heraus, dass es zusätzlich zur "Telegramm-Bot-API" auch die "Telegramm-Client-API" gibt, d.h. API zum Erstellen eigener Clients.


Der Client kann auch Nachrichten senden und lesen, jedoch nur von einem registrierten (an das Telefon gebundenen) Benutzer, was nur zu mir passt (ich bin bereits im Chat registriert).


Die Telegramm-Website enthält eine Liste von APIs für verschiedene Plattformen: https://telegram.org/apps#source-code


Die am einfachsten zu verwendende Bibliothek stellte sich jedoch als Python heraus: Pure Python 3 MTProto API-Telegramm-Clientbibliothek mit dem Namen "telethon"


Nur hier liegt das Problem. Ich kenne Python nicht. Es gibt Grund, Sie kennenzulernen.
Laut Teleton-Handbuch ist die Installation sehr einfach. Führen Sie einfach den Befehl in der Befehlszeile aus:


pip3 install telethon 

Fallstricke, die ich während der Installation kennengelernt habe:


  • pip3 ist nicht installiert (Installationsprogramm für Python).

sudo apt-get -y installiere python3-pip


  • Die Bibliothek funktioniert nur mit Python-Versionen> 3.5. Möglicherweise müssen Sie es aktualisieren.

Alles wurde eingerichtet. Scrollen Sie weiter in readme.txt.


Der nächste Punkt ist die Erstellung eines Telegrammclients ... Wie schon? Ja, alles ist einfach. Richtig, zuerst müssen Sie sich als Schöpfer des Kunden registrieren.


Wir gehen zur Telegramm-Website: https://my.telegram.org
Wir geben das Telefon ein und warten auf den Bestätigungscode auf dem nativen Client des Telegramms. Es ist ziemlich lang (12 Zeichen) und für die Eingabe unpraktisch.


Wir gehen zum Punkt " API ". Wir suchen nach der "Telegramm-API" und gehen zu "Erstellen einer Anwendung" ( https://my.telegram.org/apps ).


Füllen Sie die Felder App-Titel und Kurzname aus , klicken Sie auf „Anwendung erstellen“ und merken Sie sich zwei Variablen: api_id und api_hash .


Es ist Zeit, einen Kunden zu machen.


 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() 

Sitzungsname - Sie können einen beliebigen Namen einfügen. Sie werden aufgefordert, das Telefon einzugeben, und es wird ein Bestätigungscode gesendet. Danach arbeitet der Client, ohne das Telefon anzurufen (bis Sie den Sitzungsnamen ändern). Die Datei session_name.session wird neben Ihrem Programm angezeigt .


Wenn keine Fehler vorliegen, ist der Client bereit. Erst jetzt wird nichts angezeigt. Versuchen wir, nützliche Informationen zu erhalten.


Lerne ein wenig über dich selbst:


 print(client.get_me().stringify()) 

Das Ergebnis wird in folgender Form angegeben:


 User( photo=None, last_name='Pupkin', first_name='Vasya', id=123456789, phone='79041234567', .... - - ... ) 

Wir können eine Nachricht von uns selbst senden:


 client.send_message('username', 'Hello! Talking to you from Telethon') 

Sie können und ein Bild


 client.send_file('username', '/home/myself/Pictures/holidays.jpg') 

Wie andere mich sehen:


 client.download_profile_photo('me') 

Wir schauen uns an, welche Chats wir abonniert haben:


 print all chats name for dialog in client.iter_dialogs(): print(dialog.title) 

Wir lesen alle Chat-Nachrichten "Chat-Name" (sorgfältig kann es viele Nachrichten geben)


 messages = client.get_entity('chat_name') print(messages) 

Alle Chat-Benutzer anzeigen


 participants = client.get_participants('chat_name') print(participants) 

Gönnen Sie sich?
Tatsächlich tun wir jetzt das, wofür wir alle damit begonnen haben ...


Wir brauchen ein Programm, das neue Nachrichten in einem bestimmten Kanal überwacht.


Um zu verhindern, dass der Client die Arbeit beendet, fügen wir nach client.start () die folgende Zeile ein:


 client.run_until_disconnected() 

Dieses Konstrukt (eingefügt vor client.start ()) zeigt nur neue Nachrichten an:


 @client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) print(event.message.to_dict()['message']) 

Lass es uns herausfinden.


 @client.on(events.NewMessage(chats=('chat_name'))) 

Erstellt ein Ereignis, das ausgelöst wird, wenn eine neue Nachricht angezeigt wird


  print(event.message) 

zeigt eine Nachricht in dieser Form an:


 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') 

Von all dem brauchen wir ein Feld: "message = 'Hallo Telegramm'":


  print(event.message.to_dict()['message']) 

Die Nachricht wurde empfangen, aber von wem es ist, ist nicht klar, weil Nur Benutzer-ID pro Nachricht. Um die ID und den Benutzernamen abzugleichen, laden Sie alle Chat-Benutzer herunter und fügen Sie sie in der Form d [id] = "Vorname Nachname" in das Wörterbuch (Hash) ein.


 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 

Jetzt können wir herausfinden, wer die Nachricht gesendet hat:


 s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id) 

Grundsätzlich können Sie den Benutzernamen direkt aus dem Telegramm abrufen. Wenn jedoch nur wenige Benutzer vorhanden sind, ist dies mit einem Wörterbuch einfacher.


Das Versanddatum erhalten wir aus der Nachricht:


 mess_date=event.message.to_dict()['date'] 

Alles, alle Daten, die wir haben. Es bleibt, sie in eine Datei zu schreiben.
Öffnen Sie dazu zunächst die Datei zum Schreiben:


 f=open('messages_from_chat', 'a') 

Und schreibe die Nachricht:


 f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush() 

Das ist alles! Alles was ich brauchte, macht das Programm. Das Dienstprogramm ist natürlich feucht, aber es erfüllt seine Aufgabe.


Python war nicht so kompliziert wie es gemalt ist , zumal die Beschreibung verschiedener Bibliotheken im Internet vollständig ist. Um ein paar weitere Dienstprogramme zu schreiben und sich daran zu gewöhnen, können Sie es als Skriptsprache anstelle von Bash verwenden.


Der gesamte Text des Dienstprogramms:
 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() 

Vollständige Beschreibung der Bibliothek .

Source: https://habr.com/ru/post/de425151/


All Articles