使用搬瓦工api監控網絡流量的使用並telegrambot通知
更多語言
更多操作
使用前
獲取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 如果你上面沒改 那就這樣就行
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的信息














