使用您的客户端窃听电报聊天

我曾经想将来自其中一个电报聊天的消息存储在磁盘上(无需启动普通客户端)。 我不会透露自己的动机,但是在我看来,这个机会是必要和有益的。


电报中有一些机器人。 在Habré上,有几篇关于机器人的文章,例如:“ 与网站聊天 ”。


僵尸程序允许您阅读和发送消息,不需要电话就可以注册僵尸程序,并且僵尸程序的数量可以是任意数量。 但是,僵尸程序的名称中包含“僵尸程序”一词,这可能会引起聊天主持人不必要的问题。


但是,正如他们所说,正确提出的问题只是答案的一半。


事实证明,除了“ Telegram bot API”外,还有“ Telegram client API”,即 用于创建自己的客户端的API。


客户端也可以发送和阅读消息,但只能来自已注册(绑定到电话)的用户,这对我来说是正确的(我已经在聊天中注册)。


电报网站提供了适用于不同平台的API列表: https : //telegram.org/apps#source-code


但是,最容易使用的库是python: 纯Python 3 MTProto API Telegram客户端库,称为“ telethon”


问题只在这里。 我不懂python。 好吧,有理由见到你。
根据Teleton手册,其安装非常简单。 只需在命令行上运行命令:


pip3 install telethon 

我在安装过程中遇到的陷阱:


  • pip3未安装(python安装程序)。

须藤apt-get -y install python3-pip


  • 该库仅适用于python版本> 3.5。 因此,您可能必须对其进行更新。

一切都已建立。 进一步滚动readme.txt。


接下来的一点是创建电报客户端...已经如何了? 好吧,是的,一切都很简单。 是的,首先您需要将自己注册为客户端的创建者。


我们转到电报网站: https//my.telegram.org
我们输入电话并在电报的本机客户端上等待确认码。 它很长(12个字符),输入不便。


我们转到“ API ”项。 我们搜索“ Telegram API”,然后转到“创建应用程序”( https://my.telegram.org/apps )。


填写应用程序标题短名称字段,单击“创建应用程序”,并记住两个变量: api_idapi_hash


现在该做一个客户了。


 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-您可以插入任何名称。 系统将要求您输入电话并发送确认码。 此后,客户端将无需呼叫电话即可工作(直到您更改session_name)。 session_name.session文件将出现在程序旁边。


如果没有错误,则表明客户端已准备就绪。 直到现在,它什么也不显示。 让我们尝试获取有用的信息。


了解一些关于您自己的信息:


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

结果以以下形式给出:


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

我们可以发送自己的消息:


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

你可以和一张照片


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

当其他人看到我时:


 client.download_profile_photo('me') 

我们看看我们订阅了哪些聊天:


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

我们读取了所有聊天消息“ chat_name”(小心,可能有很多消息)


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

查看所有聊天用户


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

沉迷于?
现在,实际上,我们正在做所有我们为此而开始的工作。


我们需要一个程序来监视特定频道中的新消息。


为了防止客户端完成工作,请在client.start()之后插入以下行:


 client.run_until_disconnected() 

此构造(在client.start()之前插入)仅显示新消息:


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

让我们弄清楚。


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

创建一个事件,当出现新消息时触发


  print(event.message) 

以这种形式显示一条消息:


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

为此,我们需要一个字段:“ message ='hello telegram'”:


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

收到了该消息,但不清楚来自谁,因为 每条消息只有用户ID。 要匹配ID和用户名,请下载所有聊天用户并将其以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 

现在我们可以找出谁发送了消息:


 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=open('messages_from_chat', 'a') 

并编写消息:


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

仅此而已! 我所需要的,程序就完成了。 该实用程序当然是潮湿的,但它可以执行其任务。


Python并不像绘制的那么复杂,特别是因为Internet上各种库的描述已经完整。 要编写更多实用程序并习惯它,可以将其用作脚本语言而不是bash。


该实用程序的全文:
 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() 

图书馆的完整描述

Source: https://habr.com/ru/post/zh-CN425151/


All Articles