本章目录
第 1 章
机器人到底是什么
你可能以为机器人住在 Telegram 里。它不住在那儿——它是一段跑在你自己电脑上的程序,你关掉电脑,它就死了。
它跑在哪里
先纠正一个几乎人人都有的误解:机器人不是 Telegram 提供的功能,它是你自己的程序。
Telegram 只做两件事——帮你收消息,帮你发消息。中间"看到用户说了什么、决定回什么"的那部分,全是你写的代码,跑在你的电脑或服务器上。
所以从一开始就得接受这个事实:你写的这个东西,和你平时写的任何一个 Python 脚本没有本质区别。它需要一个进程一直开着,进程没了,机器人就"死"了。
这张图顺带解释了五件让新手困惑的事:
| 为什么需要 token | 第 2 步里,Telegram 得知道是"哪个机器人"在问。token 就是这个身份。 |
| 为什么程序得一直开着 | 第 2 步是你的程序主动去问的。程序不跑,就没人去问,消息就一直堆在 Telegram 那边。 |
| 为什么关电脑就不工作了 | 同上。这也是为什么后面要专门讲"部署"——把它挪到一台不关机的机器上。 |
| 为什么国内要挂代理 | 第 2、4 步都是你的程序去连 Telegram 的服务器,这条路在国内不通。 |
| 为什么回复有延迟 | 消息到了 Telegram 之后,得等你的程序下一次来问才拿得到。 |
两种收消息的方式,先只学一种
上面那张图画的是轮询——你的程序不停地问"有新消息吗"。还有另一种方式叫 Webhook:你把一个网址告诉 Telegram,有新消息它主动推给你。
网上教程经常一上来就并列讲这两种,然后新手就掉进坑里了——因为 Webhook 需要一个有公网 IP、配好 HTTPS 证书的服务器,光是搞定这个就能劝退一半人。
轮询 Polling
- +笔记本上就能跑,不用服务器
- +不用域名,不用 HTTPS 证书
- +改完代码重启就生效
- −回复慢那么零点几秒
- −程序得一直开着
Webhook
- +消息实时推过来
- +省资源,量大时更划算
- −要公网 IP 或域名
- −要 HTTPS 证书
- −本地调试麻烦得多
Token:一串又是身份证又是密码的东西
你去 Telegram 里找 @BotFather 说一句 /newbot,取个名字,它会给你一串这样的东西:
7284916350:AAHk9Lm2pQxV-fN3rTz8bWcY1sD4eG6hJ0
这串东西的特殊之处在于:它同时是账号和密码,没有第二重验证。谁拿到它,谁就完全控制了你的机器人——能读它收到的所有消息,能用它的名义发任何东西。
把 token 直接写在代码里,然后把代码传到 GitHub。GitHub 上有专门扫 Telegram token 的爬虫,通常几分钟内就会被捡走。
正确做法是放进环境变量或 .env 文件,并且把 .env 写进 .gitignore。第 2 章会手把手做一遍。
万一泄漏了也不用慌:找 BotFather 发 /revoke,旧 token 立刻作废,换一串新的。
它能做什么,不能做什么
这一节可能是整章最值钱的部分。新手浪费时间最多的地方,不是代码写不对,是花了两天去实现一件 Telegram 根本不允许的事。
先把边界记住,能省下大量白工:
| 你可能以为 | 实际上 | |
|---|---|---|
| 不行 | 能主动给任何人发消息 | 对方必须先跟你的机器人说过话(点过 Start)。所以"群发拉新"这条路从设计上就被堵死了。 |
| 默认不行 | 能看到群里所有消息 | 机器人默认开着隐私模式,在群里只收得到命令、@它的、和回复它的消息。要收全部,得去 BotFather 关掉 Privacy Mode。 |
| 不行 | 能拿到用户手机号 | 除非用户自己点按钮主动分享。你连他的用户名都不一定拿得到——有些人没设。 |
| 不行 | 能知道消息有没有被看到 | 没有已读回执。用户读没读,你永远不知道。 |
| 不行 | 能把人拉进群 | 只能生成邀请链接让人自己点。真要"拉",得对方先跟你的 bot 有过交互。 |
| 可以 | 在群里踢人、禁言、删消息 | 但前提是你把它设成了群管理员,而且给了对应权限。 |
| 可以 | 收钱 | Telegram Stars 或第三方支付通道都支持。这是后面单独一章的内容。 |
| 不行 | 它挂了 Telegram 会帮你重启 | 不会。进程是你的,死活你自己管——这也是"部署"那一章要解决的问题。 |
发消息有频率上限。大致是全局每秒 30 条,同一个群每分钟 20 条。超了 Telegram 会直接拒绝,而不是排队——群一大就开始丢消息,通常是新手上线后遇到的第一个"玄学 bug"。后面有一整章讲怎么对付它。
一个最小的机器人,长这样
现在你已经知道它怎么工作了,来看看代码有多少。下面这段是一个完整可运行的机器人——用户发 /start,它回一句话。一共 18 行。
import asynciofrom aiogram import Bot, Dispatcher, Routerfrom aiogram.filters import Commandfrom aiogram.types import Messagerouter = Router()@router.message(Command("start"))async def start(message: Message) -> None: await message.answer("你好,我活着")async def main() -> None: bot = Bot(token="把 BotFather 给你的那串放这儿") dp = Dispatcher() dp.include_router(router) await dp.start_polling(bot) # 就是图里的第 2 步if __name__ == "__main__": asyncio.run(main())
三个部分,对上前面那张图:
Bot(token=...) | 拿着身份证去跟 Telegram 说话的那个人 |
Dispatcher + Router | 分拣员。消息进来了,该交给哪个函数处理 |
| 高亮那三行 | 你真正写的业务:收到 /start 就回一句话 |
start_polling | 图里的第 2 步。它会一直循环,直到你 Ctrl+C |
看不懂 async、await 没关系——你现在只要知道它们的意思是"这一步要等网络,等的时候先去干别的"。第 3 章会在真正用得上的地方讲。
你想做的那个机器人,把它拆成"用户做什么动作 → 机器人回什么",大概有几条?每一条基本就对应上面那样的一个函数。如果你能列出五六条,这个项目对你来说就是可行的。
从想法到上线,一共五步
知道自己在哪儿、还有多远,比什么都重要。整条路是这样的:
这一章你该记住的四件事
- 机器人是你自己的程序,不是 Telegram 的功能。进程停了它就停了。
- 先用轮询,别碰 Webhook。后者要公网服务器和 HTTPS,而且以后换过去业务代码基本不用改。
- token 就是账号加密码。永远不要写进代码提交上去,泄漏了就
/revoke。 - 先确认你想做的事 Telegram 允许。主动私聊陌生人、拿手机号、看已读——这几件怎么写都做不到。
看不懂的地方、想知道更多的地方,或者你打算做的东西不确定能不能做 —— 都可以说。留不留联系方式都行。