# Pyrogram Telegram Bot小纸条（一）

由于我希望使用MTProto协议来完成我以后的Telegram Bot，同时习惯了async的异步的一些便捷，所以我开始将我的基于python-telegram-bot的一些Bot改为Pyrogram。如果你想对整体的Telegram Bot以及相关的信息有一个了解，你可以去[我的另一篇Blog](https://blog.hdcola.one/python-telegram-bot)了解相关的信息。接下来我会整理一下Pyrogram书写一个Telegram Bot所需要完成的事宜。

## 准备认证

与直接使用Bot API的HTTPS接口服务不同，如果你想要使用MTProto协议来调用Bot API，你仍然需要一个基于Telegram account的API Key。在[官方文档的Bot认证中](https://docs.pyrogram.org/start/auth#bot-authorization)有一些说明。从实现的方面来说，如果你需要将一个MTProto客户端接入到Telegram网络中，哪么你必须使用一个account接入，然后再使用Bot Token在MTProto中与Telegram服务器通讯。

如果你还不能理解它的工作，你可以在GitHub上找到一个官方的名为[telegram-bot-api的项目](https://github.com/tdlib/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://core.telegram.org/api/obtaining_api_id)。正常为

- 登录[https://my.telegram.org](https://my.telegram.org)
- 在[https://my.telegram.org/apps](https://my.telegram.org/apps)中填写一个表单
- 你将会看到一个App configuration的信息，里面的**api_id**和**api_hash**就是通常所说的的API Key了

### Bot Token

Bot Token的获取是在Telegram中与[BotFather](https://core.telegram.org/bots#6-botfather)对话获取的。可以参考[官方的文档](https://core.telegram.org/bots#6-botfather)进行

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1659731910564/I1pMbh8te.png align="left")

最终你的每一个Bot都会有一个类似于`110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw`这样的字符串，它即是我们用于请求Bot API的Token了。

## Hello Telegram Bot World

### 安装Program

使用pip即可以安装

```
pip install -U pyrogram tgcrypto
```

如果你希望运行时能有更好的性能可能参考[官方的性能提升来安装TgCrypto](https://docs.pyrogram.org/topics/speedups)。

### 用户认证

用户认证就是使用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](https://docs.pyrogram.org/api/client)的所有信息，通过它你可以调用Telegram客户端的各种功能。第二个参数用于接收收到的[消息](https://docs.pyrogram.org/api/types/Message#pyrogram.types.Message)，通过Message你可以得到收到的消息的所有相关信息。这个Message非常重要，也是你使用最多的变量，有时你在pyrogram的文档中无法读出属性的含义，你也可以去[Telegram官方文档中的Message部分](https://core.telegram.org/bots/api#message)了解。

运行起来后，你向你的Bot发出问题消息，它都会一丝不改的回复给你：


![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1659791906299/PTwQvJpke.png align="left")

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