在Telegram生态中,机器人(Bot)是自动化交互的核心载体。无论是消息推送、群组管理还是业务集成,都离不开对Bot API的精准调用。许多开发者在初次接触时,往往被认证流程、更新获取方式、方法参数等细节困扰。本文将从实战角度出发,系统梳理Telegram机器人API调用的关键环节,并提供可直接运行的代码示例,帮助你快速掌握这一核心技能。
一、Bot API调用基础:Token认证与请求格式
每个Telegram机器人都有一个唯一的认证凭证——Bot Token,格式通常为 123456789:ABCdefGhIJKlmNoPQRsTUVwxyz。所有API请求都必须携带这个Token,否则服务器将返回401错误。
API的基础URL为 https://api.telegram.org/bot<token>/METHOD_NAME。例如,调用getMe方法验证机器人身份:
GET https://api.telegram.org/bot123456789:ABCdefGhIJKlmNoPQRsTUVwxyz/getMe
返回JSON中会包含机器人的id、username、first_name等信息。开发者可以通过curl、Python requests、Node.js axios等工具发起请求。建议使用HTTP客户端库,而非直接拼接URL,以便处理超时和错误。
二、接收消息的两条路径:getUpdates与Webhook
要让机器人响应消息,必须先获取用户发送的更新(Update)。Telegram提供两种方式:
1. 长轮询(getUpdates)
客户端主动调用getUpdates方法,服务器返回自上次offset以来的新更新。关键参数是offset、limit和timeout。使用长轮询时,需要手动维护offset以避免重复处理:
POST https://api.telegram.org/bot<token>/getUpdates?offset=123456789&timeout=30
Python示例(使用requests库):
import requests
token = 'YOUR_BOT_TOKEN'
url = f'https://api.telegram.org/bot/getUpdates'
offset = None
while True:
params = {'timeout': 30}
if offset:
params['offset'] = offset
response = requests.get(url, params=params).json()
for update in response.get('result', []):
# 处理每条更新
offset = update['update_id'] + 1
2. Webhook(推荐)
Webhook是更高效的方式:Telegram服务器在有新更新时,主动向你的HTTPS端点发送POST请求。设置Webhook使用setWebhook方法,前提是你的服务器必须支持HTTPS且端口为443、80或88。
POST https://api.telegram.org/bot<token>/setWebhook?url=https://yourdomain.com/webhook
使用Flask实现Webhook接收:
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
update = request.get_json()
# 处理update
return 'OK'
if __name__ == '__main__':
app.run(port=5000, ssl_context=('cert.pem', 'key.pem')) # 需配置SSL
注意:Webhook模式下不能再调用getUpdates(会冲突),删除Webhook使用deleteWebhook方法。
三、核心API方法:发送消息与富媒体
掌握sendMessage是基础,它支持文本消息、内联键盘、Markdown/HTML格式等。典型的调用参数包括:
chat_id:接收者ID(用户或群组,负数表示群组)text:消息文本,支持格式化parse_mode:HTML或MarkdownV2reply_markup:内联键盘或自定义键盘
POST https://api.telegram.org/bot<token>/sendMessage
Content-Type: application/json
{
"chat_id": 123456789,
"text": "你好,我是Bot!",
"parse_mode": "HTML",
"reply_markup": {
"inline_keyboard": [[
{"text": "按钮1", "callback_data": "btn1"}
]]
}
}
除了sendMessage,还有sendPhoto、sendDocument、sendAudio等富媒体方法,参数类似但需要传递media或文件URL。例如发送图片:
POST https://api.telegram.org/bot<token>/sendPhoto
{
"chat_id": 123456789,
"photo": "https://example.com/image.jpg",
"caption": "图片描述"
}
更多方法(如editMessageText、answerCallbackQuery、sendChatAction)可参考官方文档,按需选用。
四、常见错误与排查策略
API调用中经常遇到以下错误,需要有针对性的处理:
- 401 Unauthorized:Token错误或被撤销,检查Bot Token是否正确,必要时通过BotFather重新生成。
- 404 Not Found:方法名拼写错误,或使用错误的HTTP方法(应为POST或GET,但部分方法仅限POST)。
- 400 Bad Request:参数缺失或格式错误,如chat_id为负数时需加括号?正确格式是
-100...,注意JSON中不需要引号。检查类型和必需字段。 - 429 Too Many Requests:请求频率过高,遵从Retry-After头信息,实现指数退避。
- 409 Conflict:Webhook与getUpdates同时活跃,统一删除Webhook或改用其中一种模式。
建议在代码中捕获HTTP状态码和错误描述,并记录日志以便分析。
五、性能优化与安全实践
在高并发或生产环境下,注意以下要点:
- 使用连接池:避免每个请求都新建TCP连接,使用requests.Session或httpx.Client复用。
- 异步调用:Python可选用aiohttp或python-telegram-bot的异步版本,提升吞吐量。
- Webhook负载均衡:如果你的Bot服务多实例,需确保Webhook只指向唯一入口,或使用分布式锁处理。
- 安全校验:验证Webhook请求的X-Telegram-Bot-Api-Secret-Token头,防止伪造请求。
- 限制敏感操作:对于管理类操作,应校验用户身份和权限。
六、从API到完整Bot的开发建议
虽然直接调用API可以深入理解机制,但实际开发中可借助成熟框架(如python-telegram-bot、Telegram.Bot for C#、node-telegram-bot-api)来简化工作。这些框架封装了轮询、错误处理、会话管理等,但底层依然是本文所述的API调用。建议开发者先掌握裸API,再选择框架,这样调试问题时会更有把握。
总结
Telegram机器人API调用并不复杂,核心在于理解认证、更新获取和消息发送三件事。通过本文的介绍,你应该已经能写一个最简单的回显Bot,并能扩展出更丰富的功能。记住,官方文档是最权威的来源,遇到疑问时先查阅相关方法定义。现在,去打造你的第一个机器人吧。