由于我希望使用MTProto协议来完成我以后的Telegram Bot,同时习惯了async的异步的一些便捷,所以我开始将我的基于python-telegram-bot的一些Bot改为Pyrogram。如果你想对整体的Telegram Bot以及相关的信息有一个了解,你可以去我的另一篇Blog了解相关的信息。接下来我会整理一下Pyrogram书写一个Telegram Bot所需要完成的事宜。
准备认证
与直接使用Bot API的HTTPS接口服务不同,如果你想要使用MTProto协议来调用Bot API,你仍然需要一个基于Telegram account的API Key。在官方文档的Bot认证中有一些说明。从实现的方面来说,如果你需要将一个MTProto客户端接入到Telegram网络中,哪么你必须使用一个account接入,然后再使用Bot Token在MTProto中与Telegram服务器通讯。
如果你还不能理解它的工作,你可以在GitHub上找到一个官方的名为telegram-bot-api的项目,它可以帮助你在你自己的服务器上架设一个HTTP服务器,它可以代表Telegram接受你的Telegram Bot请求。这个服务器与Telegram Server的通讯就使用的是MTProto,但是你可以再使用一个Bot Token通过telegram-bot-api server来与Telegram Server通讯。所以Pyrogram就是一个telegram-bot-api local server加Bot Client的合体。
所以为了使Pyrogram工作,你需要一个使用你自己帐号生成的API Key向Telegram通过MTProto进行认证连接。然后再使用Bot Token通过MTProto运行你自己的Bot。
API Key
有关API Key的获取,请参考Telegram官方Creating your Telegram Application。正常为
- 登录https://my.telegram.org
- 在https://my.telegram.org/apps中填写一个表单
- 你将会看到一个App configuration的信息,里面的api_id和api_hash就是通常所说的的API Key了
Bot Token
Bot Token的获取是在Telegram中与BotFather对话获取的。可以参考官方的文档进行
最终你的每一个Bot都会有一个类似于110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
这样的字符串,它即是我们用于请求Bot API的Token了。
Hello Telegram Bot World
安装Program
使用pip即可以安装
pip install -U pyrogram tgcrypto
如果你希望运行时能有更好的性能可能参考官方的性能提升来安装TgCrypto。
用户认证
用户认证就是使用API Key连接到Telegram Server。做这一步的只是为了能够使用MTProto。请使用你自己的API Key信息替换以下代码中的变量内容:
from pyrogram import Client
api_id = 12345
api_hash = "0123456789abcdef0123456789abcdef"
app = Client("my_account", api_id=api_id, api_hash=api_hash)
app.run()
运行这段代码后,你会在命令行提示符中被提示输入电话号码、验证码:
Enter phone number: +1-123-456-7890
Is "+1-123-456-7890" correct? (y/n): y
Enter phone code: 12345
Logged in successfully
如果你仔细观察,就会发现在当前目录中多了一个文件my_account.session
,这个文件一定要注意,它是通过认证后的凭证,每次运行时它会检查app name后缀为session的文件,使用它来去做认证,如果没有这个文件,就会有通过手机号进行登录获取session的过程了。所以在部署时,你有两个选择,一个选择是在服务器上输入验证信息,生成session文件。或是直接将一个session文件分发到服务器上去。
Bot认证
与用户认证基本一样,你只需要在API Key基础上加入bot_token参数即加入了Bot认证:
from pyrogram import Client
api_id = 12345
api_hash = "0123456789abcdef0123456789abcdef"
bot_token = "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"
app = Client(
"my_bot",
api_id=api_id, api_hash=api_hash,
bot_token=bot_token
)
app.run()
使用session文件认证
一旦你的认证通过得到session文件,你甚至可以删除api_id、api_hash和bot_token变量。通过指定名称的session文件,pyrogram会按你生成session文件时的API Key和Bot Token来连接进入Telegram网络。
from pyrogram import Client
app = Client("my_account")
app.run()
以后的所有代码中都不再会有api_id和api_hash以及bot_token,默认你已经通过了认证,得到了session文件。
echo bot
每次做测试,我都会写一个echo bot,用以确认你的代码是否工作正常。
from pyrogram import Client
from pyrogram.types import Message
app = Client("my_account")
@app.on_message()
async def echo(client: Client, message: Message):
await message.reply(message.text)
app.run()
这里要关心的是@app.on_message()
,它是pyrogram提供的一个修饰符,用于声明函数用于处理收到的任何消息。后面跟随的函数必须包含两个参数,第一个参数用于接收Client的所有信息,通过它你可以调用Telegram客户端的各种功能。第二个参数用于接收收到的消息,通过Message你可以得到收到的消息的所有相关信息。这个Message非常重要,也是你使用最多的变量,有时你在pyrogram的文档中无法读出属性的含义,你也可以去Telegram官方文档中的Message部分了解。
运行起来后,你向你的Bot发出问题消息,它都会一丝不改的回复给你:
好了,至此,你的第一个Bot,和Bot提供的第一个回声功能已经ok了,希望大家玩的开心。