对于很多Telegram用户来说,API接口听起来像是只有程序员才能碰的东西。但实际上,借助官方提供的工具和简单的代码,任何人都可以创建自己的机器人,实现消息自动回复、定时推送、甚至接入外部服务(如天气预报、新闻摘要)。本教程将带你从注册API令牌开始,逐步完成一个能自动回复的机器人,并讲解如何通过接口发送消息。
问题现象描述
你可能已经见过很多Telegram机器人,它们能自动回复关键词、发送图片、甚至执行复杂的查询。当你尝试自己动手时,可能会卡在“如何获取API接口”、“调用后没有反应”或者“不知道从哪里开始写代码”这些问题上。实际上,Telegram Bot API是一个基于HTTP的开放接口,你只需要一个令牌(Token)和一个简单的请求格式,就能让机器人工作。本文将用最通俗的语言,带你完成从申请到实战的全过程。
申请Telegram Bot API令牌(Token)
具体操作说明:
打开Telegram,在搜索栏输入 @BotFather(这是Telegram官方提供的机器人管理账号)。点击进入对话窗口,输入命令 /newbot并按回车。BotFather会要求你为机器人起一个名字,例如“我的测试机器人”,然后要求设置一个唯一的用户名,必须以 bot结尾,例如“MyTest123_bot”。如果用户名可用,BotFather会回复一条消息,其中包含你的API令牌,格式类似 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11。请立即复制并保存好这个令牌,关闭窗口后将无法再次查看。
注意事项/小提示:
- 令牌是机器人的唯一身份凭证,不要分享给任何人,否则他人可以控制你的机器人。
- 用户名一旦设定,后续可以在BotFather中通过 /setusername修改,但令牌无法更改,只能重新创建机器人。
- 如果丢失了令牌,可以在BotFather中输入 /mybots,选择你的机器人,然后点击 API Token按钮来查看(但某些版本可能不显示完整令牌,建议创建时立刻保存)。
备用方案:
- 如果找不到BotFather,请确保你的Telegram版本是最新的,或者直接使用浏览器访问
https://t.me/botfather打开对话。 - 若令牌泄露,立即在BotFather中输入 /revoke撤销旧令牌,再使用 /token重新生成一个新令牌。
测试API接口是否可用(发送第一条消息)
具体操作说明:
打开浏览器,在地址栏输入以下URL(将 YOUR_BOT_TOKEN替换为你保存的令牌):
https://api.telegram.org/botYOUR_BOT_TOKEN/getMe
如果一切正常,浏览器会返回一段JSON格式的数据,类似 {"ok":true,"result":{"id":123456789,"is_bot":true,"first_name":"我的测试机器人","username":"MyTest123_bot"}}。看到 "ok":true就说明API接口已经成功连接,机器人处于在线状态。
注意事项/小提示:
- 注意URL中的
bot前缀是固定的,必须紧跟在域名后,且与令牌之间没有空格。 - 如果返回
{"ok":false,"error_code":401,"description":"Unauthorized"},说明令牌错误或已失效,请检查复制内容是否完整(包括冒号后的所有字符)。 - 如果返回
{"ok":false,"description":"Not Found"},说明URL格式错误,检查是否有拼写错误(例如将telegram拼成telegrm)。
备用方案:
- 如果浏览器无法访问(例如被墙或网络限制),可以使用curl命令测试:在终端输入
curl https://api.telegram.org/botYOUR_BOT_TOKEN/getMe。 - 也可以使用第三方在线API测试工具(如Postman),但注意不要将令牌暴露在公开的请求历史中。
让机器人回复特定消息(使用getUpdates获取消息)
具体操作说明:
为了让机器人能接收用户发送的消息,我们需要调用 getUpdates接口。首先,向你的机器人发送一条任意消息(例如“你好”)。然后在浏览器中访问:
https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates
返回的JSON数据中,result数组里会包含你刚发送的消息信息,包括 message_id、chat(聊天ID)、text(消息内容)等。记录下 chat对象中的 id字段(例如 123456789),这是你和机器人对话的聊天ID,后续发送消息时需要用到。
注意事项/小提示:
- 如果返回
{"ok":true,"result":[]}空数组,说明没有新消息。请确保你已经向机器人发送了消息,并且发送后等几秒再刷新浏览器,因为API有短暂的延迟。 - 每次调用getUpdates后,已读取的消息会被标记为已读,下次调用不会再返回。如果需要持续监听,建议使用长轮询(long polling)或Webhook方式。
- 聊天ID是数字形式,不要带引号或空格,例如
chat_id=123456789。
备用方案:
- 如果不想手动查看JSON,可以使用 @get_id_bot这类第三方机器人来获取聊天ID(但注意隐私风险)。
- 对于群组或频道,聊天ID可能是负数(例如
-100123456789),此时在URL中也需要带上负号。
通过API发送消息(sendMessage接口)
具体操作说明:
现在我们来让机器人主动发送消息。在浏览器地址栏输入以下URL(替换令牌和聊天ID):
https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage?chat_id=123456789&text=你好,我是你的机器人!
回车后,如果返回 {"ok":true,"result":{"message_id":2,...}},说明消息发送成功。此时打开Telegram与机器人的对话,你会看到机器人回复了刚才设定的文字。
注意事项/小提示:
- URL中的参数必须使用 UTF-8编码,如果包含中文、空格或特殊符号,建议先进行URL编码(例如将空格转为
%20)。最简单的方式是使用在线URL编码工具。 - 除了
text,还可以加入其他参数,例如parse_mode=Markdown来支持格式化文本(加粗、斜体等),或者disable_web_page_preview=true禁用链接预览。 - 如果返回
{"ok":false,"description":"Bad Request: chat not found"},说明聊天ID错误,请确认ID是否准确,或者机器人是否被用户屏蔽。
备用方案:
- 如果不想手动拼接URL,可以使用Telegram官方提供的 Bot API库(如Python的
python-telegram-bot、Node.js的node-telegram-bot-api),通过代码调用接口。 - 对于批量发送,可以在URL后添加
&reply_to_message_id=1来回复特定消息,或者使用sendPhoto、sendDocument等接口发送文件。
设置Webhook实现自动响应(进阶,可选)
具体操作说明:
如果想让机器人能实时响应任何人的消息,而不是手动刷新getUpdates,需要设置Webhook。首先,你需要一个公网可访问的HTTPS服务器(例如使用ngrok临时暴露本地服务,或部署到云服务器)。假设你的服务器地址是 https://example.com/webhook,则在浏览器中调用:
https://api.telegram.org/botYOUR_BOT_TOKEN/setWebhook?url=https://example.com/webhook
返回 {"ok":true,"result":true,"description":"Webhook was set"}表示成功。之后,所有发送给机器人的消息都会以POST请求的形式发送到你的服务器上,你只需在服务器端处理请求并调用sendMessage回复即可。
注意事项/小提示:
- Webhook的URL必须使用 HTTPS协议,且端口必须是标准端口(443)。如果使用ngrok,它会自动提供HTTPS地址。
- 设置Webhook后,getUpdates将不再返回消息(两者互斥)。如需切换回轮询,调用
deleteWebhook接口。 - 服务器端需要能解析JSON格式的请求体,并正确返回
200 OK,否则Telegram会重试发送。
备用方案:
- 如果没有服务器,可以继续使用getUpdates加轮询的方式,但需要编写循环代码(例如每5秒请求一次)。
- 对于简单场景,可以使用 IFTTT或 Zapier等自动化工具,通过Webhook与Telegram API集成,无需自己写代码。
常见问题补充
问:调用API时返回“429 Too Many Requests”怎么办?
答:这是请求频率过高被限流。请降低请求频率,例如每次请求间隔至少1秒。如果是轮询,建议使用长轮询(在getUpdates中添加 timeout=30参数)来减少请求次数。
问:机器人无法发送消息给用户,提示“bot was blocked by the user”?
答:用户可能主动屏蔽了你的机器人。机器人无法主动解除屏蔽,只能等待用户重新与机器人互动(例如搜索并发送 /start)。
问:如何让机器人发送图片或文件?
答:使用 sendPhoto接口,参数为 chat_id和 photo(可以是URL或文件ID)。例如:
https://api.telegram.org/botTOKEN/sendPhoto?chat_id=123&photo=https://example.com/pic.jpg
文件ID可以从之前发送过的消息中获取(通过getUpdates中的 document.file_id字段)。
总结:
Telegram Bot API本质上是一组HTTP接口,通过令牌认证,只需掌握getMe、getUpdates和sendMessage三个核心接口,就能实现机器人的基本收发功能;进阶使用Webhook可实现实时响应,适合自动化场景。