Telegram Bot API curl命令实战:一条命令发送消息的完整指南

本文详细讲解如何通过curl命令行调用Telegram Bot API发送消息,从创建Bot、获取Token与Chat ID,到GET/POST请求、格式化消息、自动化脚本及常见错误排查,帮助你快速掌握高效的消息推送技巧。

阅读提示建议先浏览小标题,再根据需要深入阅读具体段落。

在日常开发和运维中,我们经常需要向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:可选值HTMLMarkdownV2,用于格式化消息。
  • 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、格式化、自动化及安全。掌握这些技巧,无论是个人提醒还是企业监控,你都能轻松实现。建议在本地实践,并逐渐扩展为更复杂的脚本。

FAQ

安装与配置指南

常见问题

如何获取用户的Chat ID?

先让你的Bot给目标用户发送一条消息,然后访问https://api.telegram.org/bot<TOKEN>/getUpdates,在返回的JSON中找到chat对象中的id字段。对于用户私聊,chat_id就是该用户的数字ID;对于群组,则是负数。

curl发送中文消息出现乱码或错误怎么办?

确保终端和HTTP请求使用UTF-8编码。在curl中使用--data-urlencode参数对中文文本进行编码,并避免在URL中直接传递中文。另外,可以设置请求头'Content-Type: application/x-www-form-urlencoded',但curl -d默认会设置。

sendMessage和sendPhoto有什么区别?

sendMessage用于发送纯文本或格式化消息(HTML/Markdown),而sendPhoto用于发送图片,通过multipart/form-data方式上传,还可以附带说明文字。发送图片需要用-F参数指定文件,例如:curl -F 'chat_id=123' -F 'photo=@image.jpg' https://api.telegram.org/bot<TOKEN>/sendPhoto