在日常开发和运维中,我们经常需要向Telegram发送通知或消息。虽然可以使用各种编程语言的SDK,但curl作为命令行工具,轻量、灵活、无需额外依赖,特别适合快速测试和脚本自动化。本文将带你从零开始,完全通过curl调用Telegram Bot API发送消息,并深入解析各种实用技巧。
1. 准备工作:创建Bot并获取Token
要调用Telegram Bot API,首先需要拥有一个Bot。打开Telegram,搜索@BotFather,发送/newbot,按提示输入名称和用户名,即可创建。成功后BotFather会返回一个HTTP API Token,格式类似123456789:AAF...abc。请妥善保管这个Token,它相当于你Bot的钥匙。
另外,你需要知道接收消息的用户的Chat ID。最简单的办法:先给Bot发一条任意消息,然后访问https://api.telegram.org/bot<TOKEN>/getUpdates,在返回的JSON中找到chat对象中的id,那就是你的Chat ID(通常是正整数)。
2. 理解sendMessage核心参数
Telegram Bot API发送消息使用sendMessage方法。核心参数包括:
chat_id:接收者的唯一标识,可以是用户ID、群组ID或频道别名。text:要发送的文本内容,支持UTF-8编码。parse_mode:可选值HTML或MarkdownV2,用于格式化消息。disable_web_page_preview:可选,禁用链接预览。
3. 使用curl发送第一条消息(GET方式)
最简单的方式是直接通过URL传递参数,使用GET请求:
curl "https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=<CHAT_ID>&text=Hello"
将<TOKEN>和<CHAT_ID>替换为实际值。如果一切正常,你会收到一个包含ok:true的JSON响应。注意:URL中的中文或特殊字符需要URL编码,建议使用--data-urlencode。
4. 使用curl发送消息(POST方式)
更推荐使用POST请求,通过-d传递参数,避免URL长度限制和编码问题:
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" -d "chat_id=<CHAT_ID>&text=Hello"
如果需要发送中文,直接使用-d即可,但注意终端字符集必须是UTF-8。对于复杂文本,可以使用--data-urlencode:
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" --data-urlencode "chat_id=<CHAT_ID>" --data-urlencode "text=你好,Telegram!"
5. 处理特殊字符与格式化消息
Telegram支持HTML和MarkdownV2格式,默认关闭。启用后,text中的特殊字符需要转义。
HTML模式:在参数中添加parse_mode=HTML。例如:
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" --data-urlencode "chat_id=<CHAT_ID>" --data-urlencode "text=**加粗**<b>加粗</b>" --data-urlencode "parse_mode=HTML"
MarkdownV2模式:需转义_、*、[等约20个字符。例如发送*加粗*,需要写为\*加粗\*(在curl中反斜杠需转义)。推荐使用HTML,转义更简单。
6. 实用示例:发送带标题和链接的消息
结合parse_mode=HTML,可以发送富文本消息:
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
--data-urlencode "chat_id=<CHAT_ID>" \
--data-urlencode "text=<b>系统通知</b>\n点击 <a href=\"https://example.com\">此处</a> 查看详情" \
--data-urlencode "parse_mode=HTML" \
--data-urlencode "disable_web_page_preview=true"
注意:在JSON中换行符使用\n,在bash中需写为$'\n'或直接使用--data-urlencode。
7. 自动化脚本:批量发送或定时消息
curl非常适合嵌入Shell脚本,实现自动化。以下是一个简单的bash脚本,从文件读取用户列表并发送通知:
#!/bin/bash
TOKEN="你的TOKEN"
CHAT_ID="目标CHAT_ID"
TEXT="备份完成,时间:$(date)"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
--data-urlencode "chat_id=$CHAT_ID" \
--data-urlencode "text=$TEXT"
结合cron,即可实现定时推送,例如每天早晨发送天气预报。
8. 常见错误与排查方法
- 401 Unauthorized:Token错误,检查是否复制时遗漏字符。
- 404 Not Found:API地址错误,确认
sendMessage拼写正确。 - 400 Bad Request:参数格式错误,如chat_id不是整数或字符串,或text为空。
- chat_id not found:可能你发送的对象是机器人或频道,需要使用对应ID。
- 消息未发送:检查是否被机器人屏蔽,或用户未与Bot开启对话。
使用-v选项可以查看详细的HTTP请求和响应,有助于调试。
9. 安全建议:保护Token,使用环境变量
Token等同于Bot的密码,切勿硬编码在脚本中,更不要提交到公开仓库。建议使用环境变量:
export BOT_TOKEN="你的TOKEN"
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" ...
如果Token泄露,请立即用BotFather执行/revoke重新生成。
总结
通过curl调用Telegram Bot API发送消息,是快速集成通知功能的绝佳方式。本文从准备到实战,覆盖了GET/POST、格式化、自动化及安全。掌握这些技巧,无论是个人提醒还是企业监控,你都能轻松实现。建议在本地实践,并逐渐扩展为更复杂的脚本。