记录值得慢慢阅读的内容

Linux版Telegram命令行发送消息到指定聊天:从API到脚本的完整实战

本文详细讲解在Linux终端中通过Telegram Bot API和命令行工具向指定聊天发送消息的多种方法,包括curl脚本、Python封装、以及结合cron实现自动化,帮助你彻底摆脱图形界面的局限。

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

在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_idtext 是必填参数。如果要发送到频道,还需要在频道中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 foundchat_id 错误或Telegram无法找到该聊天。请确认你给Bot发过消息,且获取到的是正确的数字ID,而不是用户名。

3. 消息超长:Telegram消息最大长度为4096字符,如果需要发送更长的内容,建议分多条发送或截断。

4. 特殊字符导致解析失败:如果使用 curl --data-urlencode 仍报错,尝试在文本中加入 -g 关闭globbing,或者使用 --data 配合手动转义。

总结

通过本文的几种方法,你可以在Linux终端下快速实现向指定Telegram聊天发送消息。使用curl直接调用API是最基础的方式,适合快速测试;封装成Shell脚本或Python程序则更适合日常重用和复杂场景;结合cron还能实现定时自动化。这些技巧能极大提升你的工作效率,尤其是对于需要处理服务器监控、脚本通知等场景的用户。如果你还希望进一步深入,可以探索Telegram Bot API的其他方法,如发送文件、键盘按钮等,让消息交互更丰富。

FAQ

安卓移动端下载

常见问题