使用Shell脚本和cURL命令通过Telegram机器人发送通知消息
使用Shell脚本和cURL命令通过Telegram机器人发送通知消息
摘要
本文详细介绍如何使用Shell脚本和cURL命令通过Telegram机器人发送通知消息,涵盖机器人创建、chat_id获取、消息发送及实战应用。适合需要实现服务器监控、自动化通知的开发和运维人员。
目录
- #1-telegram机器人创建与配置
- #2-获取chat_id
- #3-curl命令基础
- #4-shell脚本发送消息
- #5-高级应用场景
- #6-常见问题与调试
- #7-总结
1 Telegram机器人创建与配置
Telegram机器人通过BotFather创建,BotFather是Telegram官方的机器人管理工具。创建过程简单且完全免费,只需在Telegram中搜索@BotFather即可开始交互。
创建流程: 1. 在Telegram中搜索@BotFather并开启对话
2. 发送/newbot命令创建新机器人 3.
按提示设置机器人名称和用户名(必须以bot结尾) 4.
创建成功后,BotFather会提供API
Token,格式如123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ
设计动机:Telegram机器人提供了一种标准化的API接口,允许开发者通过HTTP请求与平台交互,无需复杂的认证协议。这种设计使得任何能发送HTTP请求的工具都能使用Telegram机器人功能。
关键要点: - Token是机器人的唯一凭证,必须妥善保管 - 机器人用户名必须全局唯一且以”bot”结尾 - 创建后需要先向机器人发送任意消息激活
2 获取chat_id
chat_id是消息发送的目标标识,可以是用户ID或群组ID。获取chat_id的方法因目标类型而异。
个人chat_id获取: 1. 向机器人发送任意消息 2.
访问https://api.telegram.org/bot<YourBOTToken>/getUpdates
3. 在返回的JSON中查找”chat”下的”id”字段
群组chat_id获取: 1. 将机器人添加到群组 2. 在群组中发送一条以”/“开头的消息 3. 通过上述getUpdates接口获取,群组chat_id为负数
# 获取updates示例
curl -s "https://api.telegram.org/bot<YourBOTToken>/getUpdates" | python -m json.tool下面的流程图展示了获取chat_id的完整过程:
flowchart TD
A[开始获取chat_id] --> B{目标类型}
B -->|个人用户| C[向机器人发消息]
B -->|群组| D[添加机器人到群组]
D --> E[在群组发送消息]
C --> F[访问getUpdates接口]
E --> F
F --> G[解析JSON获取id]
G --> H[完成]
常见误区: - 未先向机器人发送消息就直接尝试获取updates,会导致返回空结果 - 群组chat_id为负数,与个人chat_id格式不同 - 需要确保机器人有权限访问群组消息
3 cURL命令基础
cURL是一个功能丰富的命令行网络工具,支持多种协议(HTTP、FTP等),是Shell脚本中发送HTTP请求的理想选择。
关键参数说明: -
-X:指定请求方法(GET、POST等) -
-d:发送POST数据 - -H:设置请求头 -
-s:静默模式,减少输出 -
--connect-timeout:设置连接超时时间 -
--retry:设置重试次数
基础消息发送格式:
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
-d chat_id="<CHAT_ID>" \
-d text="Hello World"设计优势:cURL支持多种数据格式和认证方式,能够灵活适应不同API需求。其简单的语法和丰富的选项使得在Shell脚本中集成HTTP请求变得简单高效。
4 Shell脚本发送消息
4.1 基础消息发送
最基本的消息发送脚本只需要几行代码:
#!/bin/bash
TOKEN="你的机器人TOKEN"
CHAT_ID="你的CHAT_ID"
MESSAGE="这是测试消息"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="$MESSAGE"4.2 发送服务器日志的实战脚本
以下脚本实现将服务器日志实时传送到Telegram群组的功能:
#!/bin/bash
# Telegram配置
TOKEN="你的机器人TOKEN"
CHAT_ID="你的群组CHAT_ID"
# 日志文件路径
LOG_DIR="/var/wwwroot/app/storage/logs"
LOG_FILE="$LOG_DIR/laravel.log"
# 切割并发送最新日志
send_log_update() {
# 获取最近日志
LATEST_LOG=$(tail -n 10 $LOG_FILE)
# 发送到Telegram
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
--data-urlencode "text=最新的应用日志:
$LATEST_LOG"
}
# 定时执行(每30秒检查一次)
while true; do
send_log_update
sleep 30
done4.3 带格式和错误处理的高级脚本
#!/bin/bash
TOKEN="你的机器人TOKEN"
CHAT_ID="你的CHAT_ID"
send_telegram_message() {
local message="$1"
local max_retries=3
local retry_count=0
while [ $retry_count -lt $max_retries ]; do
# 发送消息,设置超时避免长时间阻塞
response=$(curl -s -w "%{http_code}" -X POST \
--connect-timeout 10 \
--max-time 20 \
"https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
--data-urlencode "text=$message")
http_code=$(echo "$response" | tail -n1)
json_response=$(echo "$response" | head -n -1)
if [ "$http_code" -eq 200 ]; then
echo "消息发送成功"
return 0
else
echo "发送失败,重试中... ($((retry_count+1))/$max_retries)"
retry_count=$((retry_count+1))
sleep 2
fi
done
echo "错误: 消息发送失败 after $max_retries 次重试"
return 1
}
# 使用HTML格式发送消息
send_telegram_message "【系统通知】服务器状态监控
<b>时间</b>: $(date)
<b>主机</b>: $(hostname)
<b>负载</b>: $(uptime | awk -F'load average:' '{print $2}')
状态: ✅ 正常"脚本设计要点: - 添加重试机制提高可靠性 - 设置超时避免脚本阻塞 - 支持消息格式(HTML/Markdown) - 包含错误处理和状态反馈
5 高级应用场景
5.1 服务器监控通知
将Telegram机器人集成到服务器监控系统中:
#!/bin/bash
TOKEN="你的机器人TOKEN"
CHAT_ID="你的CHAT_ID"
# 磁盘使用率监控
disk_alert() {
local usage=$(df / | awk 'END{print $5}' | sed 's/%//')
if [ $usage -gt 90 ]; then
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
--data-urlencode "text=⚠️ 磁盘空间警告
服务器: $(hostname)
挂载点: /
使用率: ${usage}%
请及时清理磁盘空间"
fi
}
# 内存监控
memory_alert() {
local mem_info=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')
local threshold=90
local usage=$(echo $mem_info | sed 's/%//')
if (( $(echo "$usage > $threshold" | bc -l) )); then
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
--data-urlencode "text=⚠️ 内存使用警告
服务器: $(hostname)
使用率: $mem_info
当前阈值: ${threshold}%"
fi
}
# 定时执行监控
while true; do
disk_alert
memory_alert
sleep 300 # 5分钟检查一次
done5.2 日志实时传送优化
针对中提到的服务器负载问题,以下是优化方案:
#!/bin/bash
# 配置
TOKEN="你的机器人TOKEN"
CHAT_ID="你的CHAT_ID"
LOG_FILE="/var/log/your-app/app.log"
LAST_POSITION_FILE="/tmp/tg_bot_last_position"
# 获取上次读取位置
get_last_position() {
if [ -f "$LAST_POSITION_FILE" ]; then
cat "$LAST_POSITION_FILE"
else
echo "0"
fi
}
# 保存当前位置
save_position() {
echo "$1" > "$LAST_POSITION_FILE"
}
# 发送日志更新
send_log_update() {
local current_position=$(get_last_position)
local new_position=$(wc -l < "$LOG_FILE" 2>/dev/null || echo "0")
# 如果有新日志
if [ "$new_position" -gt "$current_position" ]; then
local new_lines=$((new_position - current_position))
# 读取新日志(限制行数避免消息过长)
local new_content=$(tail -n $new_lines "$LOG_FILE" | head -n 10)
if [ -n "$new_content" ]; then
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
--data-urlencode "text=📊 新日志更新 ($(date))
${new_content}" > /dev/null
fi
save_position $new_position
fi
}
# 使用inotify-twait监控文件变化,降低CPU使用
while true; do
if command -v inotifywait &> /dev/null; then
inotifywait -e modify -t 30 "$LOG_FILE" 2>/dev/null && send_log_update
else
# 如果没有inotifywait,使用轮询(效率较低)
send_log_update
sleep 30
fi
done5.3 消息格式和多媒体发送
Telegram API支持丰富的消息格式,包括HTML和Markdown:
#!/bin/bash
TOKEN="你的机器人TOKEN"
CHAT_ID="你的CHAT_ID"
# 发送HTML格式消息
send_html_message() {
local title="$1"
local content="$2"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d parse_mode="HTML" \
--data-urlencode "text=<b>${title}</b>
${content}
<pre>时间: $(date)</pre>
<code>主机: $(hostname)</code>"
}
# 发送图片
send_photo() {
local photo_url="$1"
local caption="$2"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendPhoto" \
-d chat_id="$CHAT_ID" \
-d photo="$photo_url" \
--data-urlencode "caption=$caption"
}
# 使用示例
send_html_message "服务器部署完成" "✅ 应用部署成功
版本: v1.2.0
环境: production"6 常见问题与调试
6.1 网络连接问题
代理设置:在国内环境可能需要配置代理:
# 通过代理发送消息
curl -x socks5://127.0.0.1:10808 \
-s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="通过代理发送的消息"连接超时处理:
curl --connect-timeout 10 \ # 连接超时10秒
--max-time 30 \ # 整体超时30秒
--retry 3 \ # 失败重试3次
--retry-delay 5 \ # 重试间隔5秒
-s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="带超时控制的消息"6.2 错误代码处理
常见Telegram API错误代码及处理:
#!/bin/bash
send_message_with_error_handling() {
local token="$1"
local chat_id="$2"
local message="$3"
response=$(curl -s -w "%{http_code}" -X POST \
"https://api.telegram.org/bot$token/sendMessage" \
-d chat_id="$chat_id" \
--data-urlencode "text=$message")
http_code=$(echo "$response" | tail -n1)
json_response=$(echo "$response" | head -n -1)
case $http_code in
200)
echo "成功: 消息已发送"
;;
400)
echo "错误: 请求错误 - 检查参数格式"
;;
401)
echo "错误: Token无效"
;;
403)
echo "错误: 机器人无权向该chat_id发送消息"
;;
429)
echo "错误: 请求频率限制 - 需要等待"
local retry_after=$(echo "$json_response" | grep -o '"retry_after":[0-9]*' | cut -d: -f2)
echo "请等待 ${retry_after} 秒后重试"
;;
*)
echo "错误: HTTP代码 $http_code"
;;
esac
}6.3 性能优化建议
- 消息频率控制:Telegram有限制频率(约30消息/秒),需合理设计发送间隔
- 消息长度限制:单条消息不超过4096字符,长消息需要分割
- 异步发送:对于非关键通知,可使用异步方式避免阻塞主流程
# 异步发送示例
async_send_message() {
local message="$1"
{
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
--data-urlencode "text=$message" > /dev/null &
} 2>/dev/null
}7 总结
本文全面介绍了使用Shell脚本和cURL命令通过Telegram机器人发送通知消息的完整流程,关键要点包括:
- 机器人创建:通过@BotFather创建机器人并获取Token,这是所有功能的基础
- 身份识别:正确获取chat_id,区分个人chat_id和群组chat_id(负值)
- 核心工具:cURL命令是Shell脚本中调用Telegram API的关键工具
- 实战脚本:从基础消息发送到复杂的服务器监控和日志传送
- 高级特性:支持消息格式化、多媒体发送和错误处理
- 优化方案:针对性能问题的优化策略,如使用inotifywait减少资源消耗
优势:Shell脚本+cURL的方案轻量、跨平台,适合集成到各种自动化流程中 局限:需要处理网络连接问题,复杂交互场景可能不如Python等编程语言灵活
延伸阅读
- https://core.telegram.org/bots/api - 最权威的API参考
- https://curl.se/docs/manpage.html - 完整的cURL命令文档
- https://tldp.org/LDP/abs/html/ - Shell脚本编程深入学习
一句话记忆
通过Shell脚本和cURL,可以高效利用Telegram机器人实现服务器监控和消息推送,关键在于正确获取Token和chat_id,并合理设计消息发送策略。