Pyrogram Telegram Bot小纸条(一)

老房东老房东
1 min read

由于我希望使用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。正常为

Bot Token

Bot Token的获取是在Telegram中与BotFather对话获取的。可以参考官方的文档进行

image.png

最终你的每一个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发出问题消息,它都会一丝不改的回复给你:

image.png

好了,至此,你的第一个Bot,和Bot提供的第一个回声功能已经ok了,希望大家玩的开心。

2
Subscribe to my newsletter

Read articles from 老房东 directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

老房东
老房东