我曾经想将来自其中一个电报聊天的消息存储在磁盘上(无需启动普通客户端)。 我不会透露自己的动机,但是在我看来,这个机会是必要和有益的。
电报中有一些机器人。 在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
我在安装过程中遇到的陷阱:
须藤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_id和api_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()
图书馆的完整描述 。