在Linux日常使用中,我们常常需要一种快速、可脚本化的方式将通知或日志发送到Telegram。无论是服务器监控告警、定时任务结果,还是简单的地理位置提醒,通过命令行发送消息都能让你无需打开图形界面即可完成。Telegram官方提供了强大的Bot API,配合Linux的命令行工具,你可以轻松实现这一需求。本文将从零开始,为你展示如何申请Bot、获取聊天ID,并用curl、Shell脚本、Python以及cron定时任务等多种方式向指定聊天发送消息。
一、前提准备:创建Telegram Bot并获取Token
在调用API之前,你必须有至少一个Bot。Telegram官方机器人@BotFather负责创建和管理Bot。打开Telegram客户端,找到BotFather,发送 /newbot,按提示输入显示名称和用户名(需要以 bot 结尾)。创建成功后会获得一个HTTP API Token,形如:110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw。请妥善保管Token,它是调用API的凭证。
要发送消息到一个聊天(用户或群组),你还需要知道该聊天的数字ID(chat_id)。获取方式因聊天类型而异:
- 如果你要把消息发送给自己的Telegram账号,可以先给Bot发送任意一条消息,然后访问
https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates,在响应JSON中找到chat.id字段即可。 - 如果发送给群组,可以在群内添加Bot,然后使用上述
getUpdates方法查看群组的chat.id(通常为负数)。 - 如果目标不是数字ID,而是已知的 @username,则不能直接用于API,必须使用数字ID。
二、方法一:使用curl直接调用sendMessage API
最简单的发送方式就是通过curl发起HTTP POST请求到 sendMessage 方法。以下是一个基本示例:
curl -s -X POST "https://api.telegram.org/bot<YOUR_TOKEN>/sendMessage" \
-d "chat_id=<YOUR_CHAT_ID>" \
-d "text=你好,这是来自Linux命令行的消息。"
请求参数通过 -d 传递。需要注意:如果消息内容包含特殊字符(如&、空格、中文标点等),建议使用 --data-urlencode 进行URL编码,避免错误:
curl -s -X POST "https://api.telegram.org/bot<YOUR_TOKEN>/sendMessage" \
--data-urlencode "chat_id=<YOUR_CHAT_ID>" \
--data-urlencode "text=服务器于 $(date) 发生告警,请检查。"
chat_id 和 text 是必填参数。如果要发送到频道,还需要在频道中Bot是管理员,并将 chat_id 设为频道的ID(形如 @channel_username 或数字ID)。
三、方法二:编写可复用的Shell脚本
直接使用curl每次都要输入完整Token和ID,比较繁琐。我们可以将发送逻辑封装成一个Shell脚本,便于其他脚本调用。创建一个文件 tg_send.sh:
#!/bin/bash
# 用法: ./tg_send.sh "消息内容"
BOT_TOKEN="YOUR_TOKEN"
CHAT_ID="YOUR_CHAT_ID"
message="$1"
if [ -z "$message" ]; then
echo "错误:消息内容不能为空" >&2
exit 1
fi
curl -s -X POST "https://api.telegram.org/bot$/sendMessage" \
--data-urlencode "chat_id=$" \
--data-urlencode "text=$"
赋予执行权限并测试:
chmod +x tg_send.sh
./tg_send.sh "测试消息"
如果成功,你会在Telegram聊天中收到消息。该脚本可以直接被其他脚本调用,实现无缝集成。
四、方法三:使用Python封装更灵活
对于更复杂的逻辑(如动态生成消息、处理返回状态码),Python是更友好的选择。使用 requests 库(如果没有安装,可通过 pip install requests 安装),创建文件 tg_send.py:
import requests
import sys
def send_message(bot_token, chat_id, text):
url = f"https://api.telegram.org/bot/sendMessage"
payload = {
'chat_id': chat_id,
'text': text
}
try:
resp = requests.post(url, data=payload, timeout=10)
resp.raise_for_status()
result = resp.json()
if result.get('ok'):
print("消息发送成功")
else:
print(f"发送失败: ")
except Exception as e:
print(f"错误: ")
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) < 2:
print("用法: python3 tg_send.py '消息内容'")
sys.exit(1)
BOT_TOKEN = "YOUR_TOKEN"
CHAT_ID = "YOUR_CHAT_ID"
send_message(BOT_TOKEN, CHAT_ID, sys.argv[1])
运行:
python3 tg_send.py "Hello from Python"
你还可以扩展脚本,支持从stdin读取消息、发送文件(sendDocument)或图片(sendPhoto)。
五、方法四:结合cron实现定时自动发送
命令行发送的最大价值在于自动化。利用Linux的cron定时任务,可以每天定时执行脚本发送提醒。例如,每天早上8点发送天气预报(假设你有一个获取天气的脚本 weather.sh):
0 8 * * * /path/to/weather.sh | /path/to/tg_send.sh
或者更直接,在 tg_send.sh 中传入动态内容:
0 8 * * * /path/to/tg_send.sh "早上好,今天记得喝水哦!"
注意,环境变量可能不会自动加载,最好在脚本开头指定Java路径或使用绝对路径。cron的输出会发送到邮箱,如果你不想收到邮件,可以重定向:
0 8 * * * /path/to/tg_send.sh "Daily message" > /dev/null 2>&1
六、高级技巧:发送Markdown与HTML格式消息
Telegram Bot API支持 parse_mode 参数,可以发送格式化的消息。支持Markdown和HTML两种模式。例如发送加粗文本:
curl -s -X POST "https://api.telegram.org/bot<YOUR_TOKEN>/sendMessage" \
--data-urlencode "chat_id=<YOUR_CHAT_ID>" \
--data-urlencode "text=**重要通知**:系统需要维护。" \
--data-urlencode "parse_mode=MarkdownV2"
使用HTML时(parse_mode=HTML),可以用 <b>、<i>、<a href="..."> 等标签。注意MarkdownV2有严格语法,需要转义特殊字符;HTML相对宽松。建议如果消息内容来自用户输入,优先选择HTML并做实体转义,避免注入。
七、常见问题与排查
1. 返回 401 Unauthorized:Token错误或已被撤销。检查Token是否完整复制,可以在BotFather重新生成。
2. 返回 Bad Request: chat not found:chat_id 错误或Telegram无法找到该聊天。请确认你给Bot发过消息,且获取到的是正确的数字ID,而不是用户名。
3. 消息超长:Telegram消息最大长度为4096字符,如果需要发送更长的内容,建议分多条发送或截断。
4. 特殊字符导致解析失败:如果使用 curl --data-urlencode 仍报错,尝试在文本中加入 -g 关闭globbing,或者使用 --data 配合手动转义。
总结
通过本文的几种方法,你可以在Linux终端下快速实现向指定Telegram聊天发送消息。使用curl直接调用API是最基础的方式,适合快速测试;封装成Shell脚本或Python程序则更适合日常重用和复杂场景;结合cron还能实现定时自动化。这些技巧能极大提升你的工作效率,尤其是对于需要处理服务器监控、脚本通知等场景的用户。如果你还希望进一步深入,可以探索Telegram Bot API的其他方法,如发送文件、键盘按钮等,让消息交互更丰富。