如何制作一个 Telegram 机器人

本文介绍如何使用 Python 语言,编写简单的 Telegram Bot 。此处以 Ubuntu 为例。

准备

获取一个 Telegram Bot

首先在 Botfather 那里注册一个 bot,获得 token

开启 API (可选)

官网登录自己的帐号,申请 Development API ,获得

安装 proxychains

根据网络情况可能需要使用 proxychains

使用 python-telegram-bot

python-telegram-bot 使用的是官方提供的 Bot API。

安装

1
pip install --user python-telegram-bot

例程

将自己的 token 替换程序中的 TOKEN

echo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Simple Bot to reply to Telegram messages.
This is built on the API wrapper, see echobot2.py to see the same example built
on the telegram.ext bot framework.
This program is dedicated to the public domain under the CC0 license.
"""
import logging
import telegram
from telegram.error import NetworkError, Unauthorized
from time import sleep


update_id = None


def main():
"""Run the bot."""
global update_id
# Telegram Bot Authorization Token
bot = telegram.Bot('TOKEN')

# get the first pending update_id, this is so we can skip over it in case
# we get an "Unauthorized" exception.
try:
update_id = bot.get_updates()[0].update_id
except IndexError:
update_id = None

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

while True:
try:
echo(bot)
except NetworkError:
sleep(1)
except Unauthorized:
# The user has removed or blocked the bot.
update_id += 1


def echo(bot):
"""Echo the message the user sent."""
global update_id
# Request updates after the last update_id
for update in bot.get_updates(offset=update_id, timeout=10):
update_id = update.update_id + 1

if update.message: # your bot can receive updates without messages
# Reply to the message
update.message.reply_text(update.message.text)


if __name__ == '__main__':
main()

运行

1
proxychains python3 echo.py

使用 Pyrogram

Pyrogram 文档简洁,易用,使用的是 Telegram MTProto API ,性能上更佳,功能上更多,而且可以用不同程序同时运行同一个机器人。

安装

1
pip install --user pyrogram[fast]

例程

将自己之前得到的 api idapi hash 在例程中进行相应替换,并替换 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 为自己的 token

echo2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"""This simple echo bot replies to every private text message.
It uses the @on_message decorator to register a MessageHandler and applies two filters on it:
Filters.text and Filters.private to make sure it will reply to private text messages only.
"""

from pyrogram import Client, Filters

app = Client(
"123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11",
api_id=12345,
api_hash="0123456789abcdef0123456789abcdef"
)


@app.on_message(Filters.text & Filters.private)
def echo(client, message):
message.reply(message.text)

app.run() # Automatically start() and idle()

运行

1
proxychains python3 echo2.py

定制

如果您不想自己编写机器人,您也可以进行定制一个机器人。