利用搬瓦工api监控网络流量的使用并telegrambot通知

该教程提供通过搬瓦工API监控网络流量使用情况的完整方案,需配置VEID和API_KEY作为监控凭证,并设置Telegram Bot实现流量阈值提醒。脚本支持自定义通知阈值百分比数组和静音时段,通过UTC时间控制避免夜间打扰。核心功能包括自动获取流量数据、触发多级预警通知、日志管理和静默推送逻辑,最终实现服务器流量使用的自动化监控体系。
同样需要保存好bot token和chat_id

bot token

在telegram搜索框搜索 botfather 找到如图的这位

点击打开 如果你没有任何机器人的话 点击create a new bot

在这两个地方 输入

Bot Namebot的名字用于显示

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里面 按回车就行了

脚本代码块:


利用搬瓦工api监控网络流量的使用并telegrambot通知

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的信息

原创文章,作者:banwagong,如若转载,请注明出处:https://bwgcn2gia.com/archives/356.html

(0)
上一篇 02/04/2026 12:01
下一篇 02/09/2026 12:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注