土豆不好吃

[Telegram bot 系列]3: 使用MTProto协议

文章目录[显示]

活久见,这一系列竟然又更新了🤦‍♀️

之前在开发Bot的时候,我们一直使用的是Bot API,也就是官方提供的那个接口。

Bot API本质上是一个中转的接口,背后它会代替我们与Telegram服务器通信。其实对于Bot而言也可以直接绕过这一步的哦。

比较知名的Python MTProto中,有一个叫Telethon。

我的YouTube Download就是用Telethon实现的,但是经常莫名其妙的就卡住,搞了很久也不知道为什么,一直在怀疑是不是任务数量太多导致处理不过来。我甚至还另外搞了一个bot来重启container。再加上我太菜了搞不懂异步,同步使用起来又很麻烦,因此也不太喜欢这个库。

昨天发现一个pyrogram,感觉这个用起来更像pytelegrambotapi,并且type hints也很完善!

使用方法

from pyrogram import Client, filters

app = Client("ytdl", api_id, api_hash, bot_token=token)


@app.on_message(filters.command(["start"]))
def start_handler(client: "Client", message: "types.Message"):
    chat_id = message.chat.id
    logging.info("Welcome to youtube-dl bot!")
    client.send_chat_action(chat_id, "typing")
    client.send_message(message.chat.id, "Wrapper for youtube-dl.")


if __name__ == '__main__':
    app.run()

使用起来是不是很像pytelegrambotapi,并且加上type hints之后,使用起来就更方便了!

比如说我可以这样使用type hints

bot_msg: typing.Union["types.Message", "typing.Any"] = message.reply_text("Processing", quote=True)

当我想要编辑bot发送的消息时,打个.就全都有啦!

异步

pyrogram其实是原生支持异步的,可是由于我太菜了,一直搞不清楚应该什么时候await,因此用的很少

from pyrogram import Client, filters

app = Client("my_account")


@app.on_message(filters.private)
async def hello(client, message):
    await message.reply_text(f"Hello {message.from_user.mention}")


app.run()

设置worker数量

初始化Client对象时,有一个额外的参数叫workers,默认是CPU数量+4、32中较小值,也可以自己量力而行手动指定一个。

文档

https://docs.pyrogram.org/

参考 - YouTube Download

https://github.com/tgbot-collection/ytdlbot

在考虑要不要把这个bot做成分布式的,用Celery去做分发,然后加上VIP机制……流量快要吃不消了


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/tgbot3.html
退出移动版