使用搬瓦工api监控网络流量的使用并telegrambot通知:修订间差异
更多语言
更多操作
EliToviyah(留言 | 贡献) 添加使用搬瓦工api监控网络流量并推送到telegrambot |
无编辑摘要 |
||
| (未显示另一用户的1个中间版本) | |||
| 第31行: | 第31行: | ||
<code>username_bot</code> 搜索bot时用的 | <code>username_bot</code> 搜索bot时用的 | ||
其中 | 其中<code>username_bot</code> 必须是bot结尾 比如 abot或者a_bot | ||
输入后 显示是绿色的文本提示(你的username_bot名字 is available)就可以按<code>create bot</code>了 | |||
输入后 显示 | |||
[[File:Createtelegrambot2.png|border]] | [[File:Createtelegrambot2.png|border]] | ||
| 第44行: | 第42行: | ||
创建好后按copy 就复制bot token了 | 创建好后按copy 就复制bot token了 | ||
马赛克区域(绿色框)可以点一下 就可以显示bot token | 马赛克区域(绿色框)可以点一下 就可以显示bot token (不要给别人看...) | ||
如果你有bot 选择一个你要推送消息的bot 就会跳到上面这个页面 直接点copy就可以复制bot token了 | 如果你有bot 选择一个你要推送消息的bot 就会跳到上面这个页面 直接点copy就可以复制bot token了 | ||
| 第61行: | 第59行: | ||
[[File:Telegramstart.png|border]] | [[File:Telegramstart.png|border]] | ||
打开这个页面 选择开始 | 打开这个页面 选择 '''开始''' | ||
然后用浏览器打开 | 然后用浏览器打开 | ||
| 第89行: | 第87行: | ||
API_KEY="你的api_key" | API_KEY="你的api_key" | ||
| 第97行: | 第96行: | ||
默认在50 80 90 95的时候通知 | 默认在50 80 90 95的时候通知 | ||
每一个数代表百分比你可以添加(30 50 80 90 95) | 每一个数代表一个超过就通知的百分比你可以添加(30 50 80 90 95) | ||
每个中间 | 每个中间要有空格 | ||
也可以减少(50 95) | 也可以减少 比如(50 95) | ||
'''Telegram 配置''' | '''Telegram 配置''' | ||
| 第150行: | 第149行: | ||
[[File:Checkfile1.png|border]] | [[File:Checkfile1.png|border]] | ||
如果是红色框框 就是'''文件已经存在''' | 如果是红色框框 就是'''文件已经存在'''你就换个名字比如 /root/bwg_monitor1.sh 如果改了文件名 下面的这个就都要改成 /root/bwg_monitor1.sh | ||
如果是蓝色框框 就是'''文件不存在''' 就不用改 | 如果是蓝色框框 就是'''文件不存在''' 就不用改 | ||
| 第375行: | 第374行: | ||
如果你修改了 下面的也要改 并且要一样才行 | 如果你修改了 下面的也要改 并且要一样才行 | ||
替换你的实际文件名和路径 | |||
ExecStart=/bin/bash /root/bwg_monitor.sh 如果你上面没改 那就这样就行 | |||
bwg_monitor.sh 是你的文件名 | |||
/root/ 代表是 / 目录下的 root 目录 下的 bwg_monitor.sh 文件<syntaxhighlight lang="bash"> | |||
cat << 'EOF' > /etc/systemd/system/bwg-monitor.service | cat << 'EOF' > /etc/systemd/system/bwg-monitor.service | ||
[Unit] | [Unit] | ||
| 第394行: | 第400行: | ||
这个文件告诉系统“什么时候运行”。 | 这个文件告诉系统“什么时候运行”。 | ||
<code>/etc/systemd/system/bwg-monitor.timer</code>同上你可以检查一下 | |||
如果你修改了文件名 需要注意的是 两个文件名的名字需要一致 <code>bwg-a.timer</code> <code>bwg-a.service</code> .timer和.service 之前的那个文件名 | 如果你修改了文件名 需要注意的是 两个文件名的名字需要一致 <code>bwg-a.timer</code> <code>bwg-a.service</code> .timer和.service 之前的那个文件名 | ||
| 第454行: | 第460行: | ||
[[File:Store.png|border]] | [[File:Store.png|border]] | ||
monitor.log是执行日志 | monitor.log是执行过程记录的日志 | ||
usage_data.json是缓存信息 | usage_data.json是缓存信息 | ||
| 第466行: | 第472行: | ||
如果你不是root账户的话 就用这个 <code>rm $HOME/.cache/bwg_monitor/usage_data.json</code> | 如果你不是root账户的话 就用这个 <code>rm $HOME/.cache/bwg_monitor/usage_data.json</code> | ||
如果出现错误请检查 <code>cat $HOME/.cache/bwg_monitor/monitor.log</code>的信息 | 如果出现错误和非预期情况请检查 <code>cat $HOME/.cache/bwg_monitor/monitor.log</code>的信息 | ||
[[Category:500 常见应用指南 — Application Guides]] | |||
2026年1月26日 (一) 09:37的最新版本
使用前
获取veid和apikey
请参考 搬瓦工api使用
获取telegramBOT和bot token和chat_id
同样需要保存好bot token和chat_id
同样需要保存好bot token和chat_id
同样需要保存好bot token和chat_id
bot token
在telegram搜索框搜索 botfather 找到如图的这位
点击打开 如果你没有任何机器人的话 点击create a new bot
在这两个地方 输入
Bot Name bot的名字用于显示
和
username_bot 搜索bot时用的
其中username_bot 必须是bot结尾 比如 abot或者a_bot
输入后 显示是绿色的文本提示(你的username_bot名字 is available)就可以按create bot了
创建好后按copy 就复制bot token了
马赛克区域(绿色框)可以点一下 就可以显示bot token (不要给别人看...)
如果你有bot 选择一个你要推送消息的bot 就会跳到上面这个页面 直接点copy就可以复制bot token了
chat_id
需要先获取bot token
点击bot的username_bot名字的位置 就是黄色框框
弹出界面 选 蓝色框框的图标
打开这个页面 选择 开始
然后用浏览器打开
https://api.telegram.org/bot替换成你复制的bottoken/getUpdates
把 替换成你复制的bottoken 这几个字删掉 然后粘贴copy的token 就可以了
在chat后面跟着的这个id就是你的chat_id了
配置检测脚本
切换到root账户
- 输入命令:
su -(注意:su 后面有个空格和减号,这很重要,代表同时切换环境变量) - 输入 Root 密码(输入时看不见)。
- 此时你的提示符会变成
#,代表你又是 Root 了。
服务器脚本
veid和api_key
VEID="你的veid"
API_KEY="你的api_key"
通知telegram的阈值数组 (百分比)
NOTIFY_THRESHOLDS=(50 80 90 95)
默认在50 80 90 95的时候通知
每一个数代表一个超过就通知的百分比你可以添加(30 50 80 90 95)
每个中间要有空格
也可以减少 比如(50 95)
Telegram 配置
TG_BOT_TOKEN="你的机器人token"
TG_CHAT_ID="你的telegram ID"
设定telegram静音推送的开始时间和结束时间
(使用 UTC 小时 0-23) 北京时间 19:00 - 08:00 对应 UTC 11:00 - 00:00
静音开始时间
SILENT_UTC_START=11
静音结束时间
SILENT_UTC_END=0
如果你明白以下内容也可以修改
存储目录
STORAGE_DIR="$HOME/.cache/bwg_monitor"
缓存数据存放的文件
DATA_FILE="$STORAGE_DIR/usage_data.json"
日志存放文件
LOG_FILE="$STORAGE_DIR/monitor.log"
日志超过多少就删除
LOG_MAX_LINES=500
检查文件是否存在
输入 ls /root/bwg_monitor.sh
如果是红色框框 就是文件已经存在你就换个名字比如 /root/bwg_monitor1.sh 如果改了文件名 下面的这个就都要改成 /root/bwg_monitor1.sh
如果是蓝色框框 就是文件不存在 就不用改
修改后
复制代码块的所有内容 粘贴到ssh里面 按回车就行了
脚本代码块:
cat << 'EOF' > /root/bwg_monitor.sh
#!/bin/bash
# ================= 配置区 =================
VEID="你的veid"
API_KEY="你的api_key"
# 预警阈值数组 (百分比)
NOTIFY_THRESHOLDS=(50 80 90 95)
# Telegram 配置
TG_BOT_TOKEN="你的机器人token"
TG_CHAT_ID="你的telegram ID"
# (使用 UTC 小时 0-23) 北京时间 19:00 - 08:00 对应 UTC 11:00 - 00:00
SILENT_UTC_START=11
SILENT_UTC_END=0
STORAGE_DIR="$HOME/.cache/bwg_monitor"
DATA_FILE="$STORAGE_DIR/usage_data.json"
LOG_FILE="$STORAGE_DIR/monitor.log"
LOG_MAX_LINES=500
# ==========================================
mkdir -p "$STORAGE_DIR"
# 增强型 JSON 提取函数 (无需 jq, 适配各种空格格式)
get_json_num() {
echo "$1" | grep -o "\"$2\":[^,}]*" | sed 's/.*://;s/[ "]*//g'
}
log_message() {
local msg="$1"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "$timestamp $msg" >> "$LOG_FILE"
# 自动清理旧日志
if [ $(wc -l < "$LOG_FILE") -gt "$LOG_MAX_LINES" ]; then
sed -i "1,$((LOG_MAX_LINES/2))d" "$LOG_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 日志已自动减半清理。" >> "$LOG_FILE"
fi
}
send_tg_msg() {
local message="$1"
local is_test_mode="$2"
local silent_param=""
# 获取当前 UTC 小时
local current_utc_hour=$(date -u +%H)
current_utc_hour=$((10#$current_utc_hour))
# --- 跨午夜逻辑判断 ---
local is_silent=false
if [ "$SILENT_UTC_START" -lt "$SILENT_UTC_END" ]; then
# 情况 A: 时间段不跨越午夜 (如 10:00-18:00)
if [ "$current_utc_hour" -ge "$SILENT_UTC_START" ] && [ "$current_utc_hour" -lt "$SILENT_UTC_END" ]; then
is_silent=true
fi
else
# 情况 B: 时间段跨越午夜 (如 11:00-00:00)
if [ "$current_utc_hour" -ge "$SILENT_UTC_START" ] || [ "$current_utc_hour" -lt "$SILENT_UTC_END" ]; then
is_silent=true
fi
fi
[ "$is_silent" = true ] && silent_param="-d disable_notification=true"
# 执行发送
local res=$(curl -s -X POST "https://api.telegram.org/bot$TG_BOT_TOKEN/sendMessage" \
-d "chat_id=$TG_CHAT_ID" \
$silent_param \
-d "text=$message")
if [[ "$res" == *"\"ok\":true"* ]]; then
if [[ "$is_test_mode" == "-t" ]]; then
echo "✅ Telegram 发送成功! (静音模式: $is_silent)"
else
log_message "[SUCCESS] Telegram 预警已送达 (静音: $is_silent)。"
fi
return 0
else
if [[ "$is_test_mode" == "-t" ]]; then
echo "❌ Telegram 错误: $res"
else
log_message "[ERROR] Telegram 失败: $res"
fi
return 1
fi
}
# --- 处理测试参数 -t ---
if [[ "$1" == "-t" ]]; then
echo "--- 正在进入模拟测试模式 ---"
# 模拟输入值
MOCK_PLAN=2147483648000
MOCK_USED=77207619653
MOCK_MULT=1
# 模拟重置时间:当前时间 + 1天 (86400秒)
MOCK_NEXT_RESET=$(($(date +%s) + 86400))
# 计算逻辑
M_PLAN_KB=$(( MOCK_PLAN * MOCK_MULT / 1024 ))
M_USED_KB=$(( MOCK_USED * MOCK_MULT / 1024 ))
M_USAGE_PERCENT=$(( M_USED_KB * 100 / M_PLAN_KB ))
M_USED_GB=$(( M_USED_KB / 1024 / 1024 ))
M_TOTAL_GB=$(( M_PLAN_KB / 1024 / 1024 ))
M_RESET_DATE=$(date -d @"$MOCK_NEXT_RESET" '+%Y-%m-%d %H:%M')
TEST_MSG="🔔 搬瓦工监控模拟测试
当前进度: $M_USAGE_PERCENT%
已用流量: ${M_USED_GB} GB
总量配额: ${M_TOTAL_GB} GB
下次重置: $M_RESET_DATE
------------------
如果收到此消息,说明 Bot 配置与计算逻辑正常。"
echo "计算结果: 已用 $M_USAGE_PERCENT% ($M_USED_GB/$M_TOTAL_GB GB)"
if send_tg_msg "$TEST_MSG"; then
echo "✅ 测试成功!请检查 Telegram。"
else
echo "❌ 测试失败!请检查 Token/ID 或网络连接。"
fi
echo "--- 测试结束 (数据未保存) ---"
exit 0
fi
# --- 正式运行逻辑 ---
RESPONSE=$(curl -s -X POST "https://api.64clouds.com/v1/getServiceInfo" -d "veid=$VEID" -d "api_key=$API_KEY")
ERROR_CODE=$(get_json_num "$RESPONSE" "error")
if [[ "$ERROR_CODE" != "0" ]]; then
log_message "[ERROR] API 请求失败: $RESPONSE"
exit 1
fi
# 提取关键数据
PLAN=$(get_json_num "$RESPONSE" "plan_monthly_data")
USED=$(get_json_num "$RESPONSE" "data_counter")
MULT=$(get_json_num "$RESPONSE" "monthly_data_multiplier")
NEXT_RESET=$(get_json_num "$RESPONSE" "data_next_reset")
# 转换 KB 预防 32 位溢出
PLAN_KB=$(( PLAN * MULT / 1024 ))
USED_KB=$(( USED * MULT / 1024 ))
USAGE_PERCENT=$(( USED_KB * 100 / PLAN_KB ))
# 读取历史数据
HIST_NOTIFIED=$(get_json_num "$(cat "$DATA_FILE" 2>/dev/null || echo '{"notified_level":-1}')" "notified_level")
HIST_RESET_TS=$(get_json_num "$(cat "$DATA_FILE" 2>/dev/null || echo '{"last_check_ts":0}')" "last_check_ts")
# 跨周期重置
if [[ "$NEXT_RESET" != "$HIST_RESET_TS" ]]; then
HIST_NOTIFIED=-1
log_message "[INFO] 进入新计费周期。"
fi
FINAL_NOTIFY_LEVEL=$HIST_NOTIFIED
for level in "${NOTIFY_THRESHOLDS[@]}"; do
if [ "$USAGE_PERCENT" -ge "$level" ] && [ "$level" -gt "$HIST_NOTIFIED" ]; then
USED_GB=$(( USED_KB / 1024 / 1024 ))
TOTAL_GB=$(( PLAN_KB / 1024 / 1024 ))
RESET_DATE=$(date -d @"$NEXT_RESET" '+%Y-%m-%d %H:%M')
MSG="🚨 搬瓦工流量预警
进度: $USAGE_PERCENT%
已用: ${USED_GB} GB
总量: ${TOTAL_GB} GB
重置日期: $RESET_DATE"
if send_tg_msg "$MSG"; then
FINAL_NOTIFY_LEVEL=$level
log_message "[SUCCESS] 发送 $level% 通知。"
fi
fi
done
# 保存状态
echo "{\"total_usage_kb\":$USED_KB,\"last_check_ts\":$NEXT_RESET,\"notified_level\":$FINAL_NOTIFY_LEVEL}" > "$DATA_FILE"
log_message "[INFO] 检查完毕: $USAGE_PERCENT%"
EOF
授予执行权限
输入 chmod +x /root/bwg_monitor.sh
然后输入 ls -l /root/bwg_monitor.sh
如果像蓝色框框 有x就说明有执行权限了 如果是红色的-就说明还没执行的权限
测试telegram推送
输入 /root/bwg_monitor.sh -t
如下是失败了 你的bot token或 chat_id 不正确
正常就可以配置开机自动启动了
配置开机自动启动
第一步:创建 Service 文件
这个文件告诉系统“要运行什么”。
这里你也可以去 ls /etc/systemd/system/bwg-monitor.service 检查一下这个文件是否存在防止被覆盖... 但一般不会有吧.... 如果存在就 把 /etc/systemd/system/bwg-monitor.service改成/etc/systemd/system/bwg-monitor1.service之类的 只改最后一个/ 后面 和 . 之前的 就是 /etc/systemd/system/这里可以修改.service
如果你修改了 下面的也要改 并且要一样才行
替换你的实际文件名和路径
ExecStart=/bin/bash /root/bwg_monitor.sh 如果你上面没改 那就这样就行
bwg_monitor.sh 是你的文件名
/root/ 代表是 / 目录下的 root 目录 下的 bwg_monitor.sh 文件
cat << 'EOF' > /etc/systemd/system/bwg-monitor.service
[Unit]
Description=BandwagonHost Traffic Monitor Service
After=network.target
[Service]
Type=oneshot
# 替换为你的实际文件名
ExecStart=/bin/bash /root/bwg_monitor.sh
EOF
第二步:创建 Timer 文件
这个文件告诉系统“什么时候运行”。
/etc/systemd/system/bwg-monitor.timer同上你可以检查一下
如果你修改了文件名 需要注意的是 两个文件名的名字需要一致 bwg-a.timer bwg-a.service .timer和.service 之前的那个文件名
有几个可以修改的地方
# 开机后 2 分钟开始第一次执行
OnBootSec=2min
# 之后每隔 1 小时执行一次
OnUnitActiveSec=1h
# 如果关机错过了时间,开机后立刻补跑
Persistent=true
cat << 'EOF' > /etc/systemd/system/bwg-monitor.timer
[Unit]
Description=Run BandwagonHost Traffic Monitor every hour
[Timer]
# 开机后 2 分钟开始第一次执行
OnBootSec=2min
# 之后每隔 1 小时执行一次
OnUnitActiveSec=1h
# 如果关机错过了时间,开机后立刻补跑
Persistent=true
[Install]
WantedBy=timers.target
EOF
第三步:启动并激活
在终端执行以下命令:
# 重新加载配置
systemctl daemon-reload
# 启动定时器并设置为开机自启
systemctl enable --now bwg-monitor.timer
# 查看定时器状态
systemctl status bwg-monitor.timer
蓝色框框说明是定时器已经正常运行
红色框框是已经开启了 自动开机启动
绿色的框框代表service正在等待 只要不是红色的就行了
缓存和日志的存储位置
在 默认位置在 $HOME/.cache/bwg_monitor/
如果你是按照本文来的那$HOME就是/root 完整路径就是 /root/.cache/bwg_monitor/
monitor.log是执行过程记录的日志
usage_data.json是缓存信息
如果需要重复测试的话 需要删除usage_data.json缓存信息
如果你按照本文的来的话切换了root账户
就输入 rm /root/.cache/bwg_monitor/usage_data.json
如果你不是root账户的话 就用这个 rm $HOME/.cache/bwg_monitor/usage_data.json
如果出现错误和非预期情况请检查 cat $HOME/.cache/bwg_monitor/monitor.log的信息














