切換選單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。

使用搬瓦工api監控網絡流量的使用並telegrambot通知

出自md5.pw
這是此頁面最近一次修訂;沒有已批准修訂。

使用前

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