botfromzero
本章目录
    Telegram 机器人实战 第一部分 · 它到底是什么

    第 1 章

    机器人到底是什么

    你可能以为机器人住在 Telegram 里。它不住在那儿——它是一段跑在你自己电脑上的程序,你关掉电脑,它就死了。

    约 8 分钟不用写代码看完你会知道自己接下来在干什么
    01

    它跑在哪里

    先纠正一个几乎人人都有的误解:机器人不是 Telegram 提供的功能,它是你自己的程序。

    Telegram 只做两件事——帮你收消息,帮你发消息。中间"看到用户说了什么、决定回什么"的那部分,全是你写的代码,跑在你的电脑或服务器上。

    所以从一开始就得接受这个事实:你写的这个东西,和你平时写的任何一个 Python 脚本没有本质区别。它需要一个进程一直开着,进程没了,机器人就"死"了。

    用户 他的手机 Telegram 服务器 你的程序 你的电脑上 1 发消息 2 有新消息吗? (每秒都在问) 3 有,给你 想好回什么 4 这样回他 5 收到回复
    你的程序从不直接接触用户。它只跟 Telegram 服务器打交道,连用户长什么样都看不见——只看得到 Telegram 转述给它的内容。

    这张图顺带解释了五件让新手困惑的事:

    为什么需要 token第 2 步里,Telegram 得知道是"哪个机器人"在问。token 就是这个身份。
    为什么程序得一直开着第 2 步是你的程序主动去问的。程序不跑,就没人去问,消息就一直堆在 Telegram 那边。
    为什么关电脑就不工作了同上。这也是为什么后面要专门讲"部署"——把它挪到一台不关机的机器上。
    为什么国内要挂代理第 2、4 步都是你的程序去连 Telegram 的服务器,这条路在国内不通。
    为什么回复有延迟消息到了 Telegram 之后,得等你的程序下一次来问才拿得到。
    02

    两种收消息的方式,先只学一种

    上面那张图画的是轮询——你的程序不停地问"有新消息吗"。还有另一种方式叫 Webhook:你把一个网址告诉 Telegram,有新消息它主动推给你。

    网上教程经常一上来就并列讲这两种,然后新手就掉进坑里了——因为 Webhook 需要一个有公网 IP、配好 HTTPS 证书的服务器,光是搞定这个就能劝退一半人。

    轮询 Polling

    getUpdates
    • +笔记本上就能跑,不用服务器
    • +不用域名,不用 HTTPS 证书
    • +改完代码重启就生效
    • 回复慢那么零点几秒
    • 程序得一直开着
    新手从这个开始。本教程全程用它。

    Webhook

    setWebhook
    • +消息实时推过来
    • +省资源,量大时更划算
    • 要公网 IP 或域名
    • 要 HTTPS 证书
    • 本地调试麻烦得多
    等你的 bot 真有几千人用了再换。
    两种方式功能完全一样,换的时候业务代码基本不用动。所以现在这个选择不会锁死你——先跑起来最要紧。
    03

    Token:一串又是身份证又是密码的东西

    你去 Telegram 里找 @BotFather 说一句 /newbot,取个名字,它会给你一串这样的东西:

    BotFather 给你的
    7284916350:AAHk9Lm2pQxV-fN3rTz8bWcY1sD4eG6hJ0

    这串东西的特殊之处在于:它同时是账号和密码,没有第二重验证。谁拿到它,谁就完全控制了你的机器人——能读它收到的所有消息,能用它的名义发任何东西。

    ⬤ 这是新手最常见的一次性事故

    把 token 直接写在代码里,然后把代码传到 GitHub。GitHub 上有专门扫 Telegram token 的爬虫,通常几分钟内就会被捡走

    正确做法是放进环境变量或 .env 文件,并且把 .env 写进 .gitignore。第 2 章会手把手做一遍。

    万一泄漏了也不用慌:找 BotFather 发 /revoke,旧 token 立刻作废,换一串新的。

    04

    它能做什么,不能做什么

    这一节可能是整章最值钱的部分。新手浪费时间最多的地方,不是代码写不对,是花了两天去实现一件 Telegram 根本不允许的事。

    先把边界记住,能省下大量白工:

    你可能以为实际上
    不行能主动给任何人发消息对方必须先跟你的机器人说过话(点过 Start)。所以"群发拉新"这条路从设计上就被堵死了。
    默认不行能看到群里所有消息机器人默认开着隐私模式,在群里只收得到命令、@它的、和回复它的消息。要收全部,得去 BotFather 关掉 Privacy Mode。
    不行能拿到用户手机号除非用户自己点按钮主动分享。你连他的用户名都不一定拿得到——有些人没设。
    不行能知道消息有没有被看到没有已读回执。用户读没读,你永远不知道。
    不行能把人拉进群只能生成邀请链接让人自己点。真要"拉",得对方先跟你的 bot 有过交互。
    可以在群里踢人、禁言、删消息但前提是你把它设成了群管理员,而且给了对应权限。
    可以收钱Telegram Stars 或第三方支付通道都支持。这是后面单独一章的内容。
    不行它挂了 Telegram 会帮你重启不会。进程是你的,死活你自己管——这也是"部署"那一章要解决的问题。
    上面这些不是 aiogram 的限制,是 Telegram Bot API 本身的限制。换任何语言、任何框架都一样。
    ◆ 还有一条经常让人抓狂的

    发消息有频率上限。大致是全局每秒 30 条,同一个群每分钟 20 条。超了 Telegram 会直接拒绝,而不是排队——群一大就开始丢消息,通常是新手上线后遇到的第一个"玄学 bug"。后面有一整章讲怎么对付它。

    05

    一个最小的机器人,长这样

    现在你已经知道它怎么工作了,来看看代码有多少。下面这段是一个完整可运行的机器人——用户发 /start,它回一句话。一共 18 行。

    bot.pyaiogram 3.x
    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

    看不懂 asyncawait 没关系——你现在只要知道它们的意思是"这一步要等网络,等的时候先去干别的"。第 3 章会在真正用得上的地方讲。

    ✓ 现在可以停下来想一件事

    你想做的那个机器人,把它拆成"用户做什么动作 → 机器人回什么",大概有几条?每一条基本就对应上面那样的一个函数。如果你能列出五六条,这个项目对你来说就是可行的。

    06

    从想法到上线,一共五步

    知道自己在哪儿、还有多远,比什么都重要。整条路是这样的:

    1 建 bot 拿 token 5 分钟 2 装环境 Python、依赖、代理 最容易卡在这 3 跑通第一句 它回你话了 第一次成功 4 做出真功能 你想要的那个 几小时 5 让它一直跑 挪到服务器 1 小时 你在这里
    第 2 步是整条路上流失最多的一环,而且它跟"会不会写代码"没关系。下一章专门解决它。

    这一章你该记住的四件事

    1. 机器人是你自己的程序,不是 Telegram 的功能。进程停了它就停了。
    2. 先用轮询,别碰 Webhook。后者要公网服务器和 HTTPS,而且以后换过去业务代码基本不用改。
    3. token 就是账号加密码。永远不要写进代码提交上去,泄漏了就 /revoke
    4. 先确认你想做的事 Telegram 允许。主动私聊陌生人、拿手机号、看已读——这几件怎么写都做不到。
    哪里没讲明白?

    看不懂的地方、想知道更多的地方,或者你打算做的东西不确定能不能做 —— 都可以说。留不留联系方式都行。