BetaCat_HA
BetaCat_HA
Published on 2025-07-24 / 39 Visits
0
0

GPNU电费余额不足自动推送

担心余额不足而导致停电?这个脚本可以帮到你!

推送示例

准备工作

使用抓包软件对企业微信中的水电控系统进行抓包,本文以Loon为例。

系统版本:iOS 17.0
抓包软件:Loon 3.3.2(877)
企业微信:4.1.38
通知推送:Bark 1.5.1(7)

  1. 下载Bark,并记录推送链接
推送链接
  1. Loon的MitM配置方法可参考第三方教程:Loon MitM功能如何使用

抓包流程

  1. 打开Loon抓包,并进入企业微信水电控系统,查询电费,回到Loon。

  2. 在抓包记录中搜索Balance

查找抓包记录
  1. 在该包中找到请求头-Authorization,记录下来。
Authorization
  1. 往下滑,点击JSON预览,记录roomCode的值。
JSON预览

JSON预览

配置脚本

  1. 保存脚本为BalanceAlert.py
import requests
import time
import json

# 脚本设置
TOKEN = "这里填上刚刚获取的Authorization"

# 推送设置
PUSH_URLS = [
    "Bark推送地址1,不带最后的斜杠/,示例:https://api.day.app/Jq3p7SgYVsdjier4sSpaGi",
    "Bark推送地址2,如不需要可删除"
]
THRESHOLD = 10.0 # 推送阈值,低于这个余额就推送

# 请求数据
data = {
    "useEleType": "1",
    "roomCode": "这里填上roomCode"
}

# 请求API
API_URL = "https://dkxt.gpnu.edu.cn/kbp/ele/wechat/ele/eleBalance"

ICON_WARNING = "https://raw.githubusercontent.com/wjy2311077/BestRules/main/Icon/warni
ng.jpg"
PARAM_ICON = f"icon={ICON_WARNING}"
PARAM_URL = "url="
PUSH_PARAMS = f"?{PARAM_ICON}"

# 获取当前时间戳
current_timestamp = int(time.time())

# 请求头信息
headers = {
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/
605.1.15 (KHTML, like Gecko) Mobile/15E148 wxwork/4.0.20 MicroMessenger/7.0.1 Language
/zh ColorScheme/Dark",
    "Authorization": TOKEN,
    "Content-Type": "application/json",
    "Accept": "*/*",
    "Host": "dkxt.gpnu.edu.cn",
    "Connection": "keep-alive",
}

# 使用 requests 库发送 POST 请求并提取返回的数据
response = requests.post(API_URL, headers=headers, json=data)

# 检查响应状态码
if response.status_code == 200:
    # 解析 JSON 响应
    response_json = response.json()

    if "code" not in response_json:
        print("响应数据中未找到 'code' 字段,请检查请求是否成功。")
        exit(1)

    if response_json.get("code") != 200:
        # 发送失败通知
        full_url = f"{PUSH_URLS[0]}/电费检查失败-{response_json.get('code')}/{response
_json.get('msg')}{PUSH_PARAMS}"
        response = requests.get(full_url)
        print(f"请求失败-{response_json.get('code')}:{response_json.get('msg')}")
        exit(1)

    # 检查响应数据是否包含 "data" 字段
    if "data" not in response_json:
        print("响应数据中未找到 'data' 字段,请检查请求是否成功。")
        exit(1)

    # 提取余额和补贴
    balance = response_json.get("data", {}).get("moneyBalance", "N/A")
    subsidy = response_json.get("data", {}).get("moneySubsidyBalance", "N/A")

    # 打印提取的信息
    print(f"Balance: {balance}")
    print(f"Subsidy: {subsidy}")

    # 判断余额和补贴是否过低,并推送通知
    if float(balance + subsidy) < THRESHOLD:
        print("余额过低,发送推送通知...")
        notification_title = "余额警告"
        notification_content = f"您的电费余额(含补助)为 {balance + subsidy} 元,已低
于 {THRESHOLD} 元,请及时充值。"

        # 遍历推送 URL 列表并发送通知
        for push_url in PUSH_URLS:
            full_url = f"{push_url}/{notification_title}/{notification_content}{PUSH_P
ARAMS}"
            try:
                response = requests.get(full_url)
                if response.status_code == 200:
                    print(f"推送通知发送成功!URL: {push_url}")
                else:
                    print(f"推送通知发送失败。状态码: {response.status_code}, URL: {pu
sh_url}")
            except requests.exceptions.RequestException as e:
                print(f"推送请求发生异常: {e}, URL: {push_url}")

else:
    print(f"请求失败,状态码: {response.status_code}")
  1. 设置定时任务,以crontab为例。
# 在6点-23点的59分执行任务
59 6-23/2 * * * python3 /path/to/BalanceAlert.py

Comment