Je voulais une fois que les messages de l'une des conversations de télégramme soient stockés sur mon disque (sans démarrer un client ordinaire). Je ne dévoilerai pas mes motivations, mais cette opportunité m'a paru nécessaire et utile.
Il y a des robots dans le télégramme pour cela. Sur Habré il y a plusieurs articles consacrés aux bots, par exemple: " Chat-assistant du site ".
Le bot vous permet de lire et d'envoyer des messages, vous n'avez pas besoin d'un téléphone pour enregistrer un bot et le nombre de bots peut être n'importe lequel. Mais le nom du bot comprend le mot "bot", ce qui peut provoquer des questions inutiles de l'hôte de chat.
Mais, comme on dit, une question correctement posée est la moitié de la réponse.
Il s'avère qu'en plus de l '"API Telegram bot", il existe également l' "API client Telegram", c'est-à-dire API pour créer vos propres clients.
Le client peut également envoyer et lire des messages, mais uniquement à partir d'un utilisateur enregistré (lié au téléphone), ce qui me convient (je suis déjà inscrit dans le chat).
Le site Web du télégramme contient une liste d'API pour différentes plates-formes: https://telegram.org/apps#source-code
Cependant, la bibliothèque la plus simple à utiliser était python: la bibliothèque cliente Pure Python 3 MTProto API Telegram appelée "telethon"
Ce n'est que le problème. Je ne connais pas le python. Eh bien, il y a une raison de vous rencontrer.
Selon le manuel teleton, son installation est très simple. Exécutez simplement la commande sur la ligne de commande:
pip3 install telethon
Pièges que j'ai rencontrés lors de l'installation:
- pip3 n'est pas installé (programme d'installation pour python).
sudo apt-get -y install python3-pip
- La bibliothèque ne fonctionne que sur les versions python> 3.5. Vous devrez donc peut-être le mettre à jour.
Tout a été établi. Faites défiler readme.txt plus loin.
Le prochain point est la création d'un client télégramme ... Comment, déjà? Eh bien, oui, tout est simple. Certes, vous devez d'abord vous enregistrer en tant que créateur du client.
Nous allons sur le site Web du télégramme: https://my.telegram.org
Nous entrons dans le téléphone et attendons le code de confirmation sur le client natif du télégramme. Il est assez long (12 caractères) et peu pratique à saisir.
Nous passons à l'élément " API ". Nous recherchons l '"API Telegram" et allons dans "Créer une application" ( https://my.telegram.org/apps ).
Remplissez les champs Titre de l' appli et Nom abrégé , cliquez sur «Créer une application» et n'oubliez pas deux variables: api_id et api_hash .
Il est temps de se faire un client.
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()
nom_session - vous pouvez insérer n'importe quel nom. Il vous sera demandé d'entrer le téléphone et un code de confirmation vous sera envoyé. Après cela, le client fonctionnera sans appeler le téléphone (jusqu'à ce que vous changiez session_name). Le fichier session_name.session apparaîtra à côté de votre programme.
S'il n'y a pas d'erreur, le client est prêt. Seulement maintenant, il n'affiche rien. Essayons d'obtenir des informations utiles.
Apprenez un peu sur vous-même:
print(client.get_me().stringify())
le résultat est donné sous la forme:
User( photo=None, last_name='Pupkin', first_name='Vasya', id=123456789, phone='79041234567', .... - - ... )
Nous pouvons envoyer un message de nous-mêmes:
client.send_message('username', 'Hello! Talking to you from Telethon')
Vous pouvez et une photo
client.send_file('username', '/home/myself/Pictures/holidays.jpg')
Comme les autres me voient:
client.download_profile_photo('me')
Nous regardons à quels chats nous sommes abonnés:
print all chats name for dialog in client.iter_dialogs(): print(dialog.title)
nous lisons tous les messages de chat "chat_name" (attention, il peut y avoir beaucoup de messages)
messages = client.get_entity('chat_name') print(messages)
afficher tous les utilisateurs du chat
participants = client.get_participants('chat_name') print(participants)
Se faire plaisir?
Maintenant, en fait, nous faisons ce pour quoi nous avons tous commencé ...
Nous avons besoin d'un programme qui surveille les nouveaux messages dans un canal spécifique.
Pour empêcher le client de terminer le travail, après client.start () nous insérons la ligne:
client.run_until_disconnected()
Cette construction (insérée avant client.start ()) affiche uniquement les nouveaux messages:
@client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) print(event.message.to_dict()['message'])
Voyons cela.
@client.on(events.NewMessage(chats=('chat_name')))
crée un événement qui se déclenche lorsqu'un nouveau message apparaît
print(event.message)
affiche un message sous cette forme:
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 tout cela, nous avons besoin d'un champ: "message = 'bonjour télégramme'":
print(event.message.to_dict()['message'])
Le message a été reçu, mais de qui il provient, ce n'est pas clair, car seul ID utilisateur par message. Pour faire correspondre l'ID et le nom d'utilisateur, téléchargez tous les utilisateurs du chat et placez-les dans le dictionnaire (hachage) sous la forme 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
Nous pouvons maintenant découvrir qui a envoyé le message:
s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id)
En principe, vous pouvez obtenir le nom d'utilisateur directement à partir du télégramme, mais s'il y a peu d'utilisateurs, c'est plus facile avec un dictionnaire.
Nous obtenons la date d'envoi du message:
mess_date=event.message.to_dict()['date']
Tout, toutes les données que nous avons. Il reste à les écrire dans un fichier.
Pour ce faire, ouvrez d'abord le fichier en écriture:
f=open('messages_from_chat', 'a')
Et écrivez le message:
f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush()
C'est tout! Tout ce dont j'avais besoin, le programme le fait. L'utilité, bien sûr, est humide, mais elle remplit sa tâche.
Python n'était pas aussi compliqué qu'il est peint , d'autant plus que la description des différentes bibliothèques sur Internet est complète. Pour écrire quelques utilitaires supplémentaires et vous y habituer, vous pouvez l'utiliser comme langage de script au lieu de bash.
Le texte entier de l'utilitaire: 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()
Description complète de la bibliothèque .