打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

使用搬瓦工api监控网络流量的使用并telegrambot通知:修订间差异

来自md5.pw
EliToviyah留言 | 贡献
添加使用搬瓦工api监控网络流量并推送到telegrambot
 
Liam留言 | 贡献
无编辑摘要
 
(未显示另一用户的1个中间版本)
第31行: 第31行:
<code>username_bot</code> 搜索bot时用的
<code>username_bot</code> 搜索bot时用的


其中
其中<code>username_bot</code> 必须是bot结尾 比如 abot或者a_bot


username_bot 比如是bot结尾 比如 abot或者a_bot
输入后 显示绿色的文本提示(你的username_bot名字 is available)就可以按<code>create bot</code>了
 
输入后 显示绿色的文本提示(你的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
如果是红色框框 就是'''文件已经存在'''你就换个名字比如 /root/bwg_monitor1.sh 如果改了文件名 下面的这个就都要改成 /root/bwg_monitor1.sh


如果是蓝色框框 就是'''文件不存在''' 就不用改
如果是蓝色框框 就是'''文件不存在''' 就不用改
第375行: 第374行:
如果你修改了 下面的也要改 并且要一样才行
如果你修改了 下面的也要改 并且要一样才行


替换你的实际文件名和路径
ExecStart=/bin/bash /root/bwg_monitor.sh 如果你上面没改 那就这样就行


这里 替换为你的实际文件名  
bwg_monitor.sh 你的文件名


ExecStart=/bin/bash /root/bwg_monitor.sh 如果你上面没改 那就这样就行<syntaxhighlight lang="bash">
/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>/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的信息