机器人建好了不回复:先分清是它没跑,还是对方没先发过 /start
这个站有八百多个用户绑了 Telegram,其中四百多个收不到机器人的消息。原因不是代码有问题,是那一步谁都容易漏。
Michael Chen先给一个真实的数字,因为它正好是这个话题下搜索量最集中的那个故障。
这个站有九千五百七十七个用户,其中八百五十四个把自己的 Telegram 身份绑到了账号上。但这八百五十四个里,只有四百四十六个真的能收到机器人发的消息,剩下四百零八个收不到(二〇二六年八月三十一日数的)。
四百零八个,接近一半。代码没问题,机器人也在跑。缺的是一步:这四百零八个人从来没有主动打开跟这个机器人的对话、发过一次 /start。
一条规则解释了大部分「机器人不回复」
机器人不能主动找一个没跟它说过话的人。这不是配置问题,是平台的规则,而且没有绕过去的办法。
所以「不回复」这句话要先拆成两种完全不同的情况:
| 现象 | 多半是 | 怎么确认 |
|---|---|---|
| 你给它发消息,它不回 | 程序没在跑,或者没连上 | 换个账号再发一次,还是不回就是程序侧 |
| 你发它回,但它主动推的消息发不出去 | 对方没发过 /start | 让对方点开对话发一次 /start,立刻就好 |
| 群里不回 | 隐私模式开着 | 在 BotFather 里关掉群隐私,或者把它设成管理员 |
第二行那种情况的成本很高,因为它不报错。你的程序调用发消息,返回一个失败,而你的日志里可能只记了一句发送异常。上面那四百零八个账号就是这么积累出来的:每个人都以为自己绑完了,系统这边也确实存下了身份,只是消息永远送不到。
做法上的教训是:凡是把绑定当成一个流程的,绑完之后要有一步「让用户在机器人里发一次 /start」的引导,并且用一条实际发出去的测试消息来确认绑定完成,而不是用「身份写进数据库了」来确认。
建一个机器人,四步
- 在 Telegram 里找到 BotFather,发 /newbot。
- 给一个显示名称,这个可以随便起,以后能改。
- 给一个用户名,必须以 bot 结尾。这一步最容易卡住,下面单说。
- 它会回一串令牌。这串东西就是这个机器人的密码,谁拿到谁就能操作它。
令牌不要写在代码里,尤其不要提交到公开仓库。写进环境变量。万一泄露了,在 BotFather 里用 /revoke 作废旧的,它会给你一串新的,然后记得把程序里的那串也换掉,否则你自己的机器人也会一起断掉。
用户名被占用:改法有讲究
提示这个用户名已经被占用,是这一步最常见的卡点。可选的用户名早就被抢得差不多了,所以改的时候别只在后面加数字。
数字后缀有一个副作用:它看起来像仿冒号。用户在搜索里看到两个名字几乎一样、其中一个后面挂着数字的机器人,会默认后面那个是假的。这个印象的成本比多想一个名字高得多。
可行的改法是往前加限定词而不是往后加数字,比如加上你的品牌名、地区或者用途。显示名称和用户名是两个东西,显示名称可以保持干净,用户名允许长一点。
第一版做三件事就够
不要一开始就把所有功能堆上去。第一版能跑通这三件事,后面加什么都是小事:
- 回应 /start,给一句话说明它能做什么。这一条不只是礼貌,它同时是上面那条规则的入口。用户发了 /start,你才拿得到跟他继续对话的通道。
- 认几个关键词。挑你实际被问得最多的那几个,不要凭想象列。
- 认不出来的时候说一句会有人跟进,而不是沉默。沉默比功能少更让人烦。
另外要提前定好:认不出来的问题转给谁。没定这一步的话,兜底那句话就变成了一个把问题吞掉的黑洞。
放在哪里跑
放在自己电脑上,合上盖子它就停了。要一直在线,有三种形态可选,按运维负担从轻到重是:按调用触发的无服务器函数、一台小服务器、托管的容器平台。低流量的机器人用第一种通常就够,而且很多平台的免费额度覆盖得住。
具体花多少钱这里不给数字,因为各家差别大而且变得快,报一个数字过两个月就是错的。判断标准是另一个:你的机器人除了回消息还要不要做别的事(定时任务、存数据、跑爬取)。要,选服务器;不要,选函数。
上线前跑一遍
- 令牌在环境变量里,不在代码里。
- 换一个从没用过的账号,发 /start,确认能收到回复。
- 再用那个账号触发一次主动推送,确认真的送到了,而不是只在日志里记了一行。
- 合上电脑,一小时后从另一台设备再试一次。
- 在 BotFather 里设好头像和简介,一个没有简介的机器人看起来像半成品。
第三步是最容易跳过而代价最大的一步。上面那四百零八个账号,就是因为没人做过这一步。
机器人跑起来之后,下一个问题通常是没人知道它存在。那是另一件事,搜不到的成因在频道搜索那一篇里。如果这个机器人要挂在一个用来投广告的频道下面,广告审核那一侧在广告那一篇。用脚本操作一个真人账号而不是机器人,那是完全不同的一套凭据,在接口那一篇里。
