Sqxy宿舍电费微信推送

前言

宿舍电费只能使用支付宝完美校园小程序查询,还要忍受一堆广告。因此这里也是直接抓包,获得了电费查询的url。通过curl请求、crontab再配合微信测试号实现定时推送。

软件工具

  • curl

这里只要安装了curl即可。

使用方法

  1. 获取微信测试号
    https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
  2. 获取微信AppID、AppSecert
  3. 创建推送模板,获取Template_ID
  4. 调用access_token接口获取Token
  5. 调用电费接口获取剩余电费
  6. 调用测试号推送接口推送电费数据
  7. 将脚本放入Openwrt,使用Crontab定时推送

模板

微信测试号消息创建模板

今天是:{{date.DATA}}
您的宿舍号是:{{roomno.DATA}}
当前剩余电费:{{electricities.DATA}}

微信测试号消息推送json模板

{
    "touser": "被推送的用户id,用户关注测试号后获取",
    "template_id": "你的template_id,消息模板创建成功后获取",
    "url": "http://weixin.qq.com/download",
    "data": {
        "date": {
            "value": "2025年7月3日"
        },
        "roomno": {
            "value": "30#2001"
        },
        "electricities": {
            "value": "12.23度"
        }
    }
}

完美校园电费请求参数json模板

{
  "timestamp": "2025-03-02 17:48:02",
  "method": "samllProgramGetRoomState",
  "bizcontent": "{\"payproid\":953,\"schoolcode\":\"1402\",\"roomverify\":\"2-11--2-6005\",\"businesstype\":2}",
  "sourceId": 1
}

完美校园电费返回值json模板

{
  "businessData": {
        "description": "剩余电量",
        "quantity": "97.55",
        "quantityunit": "度"
  },
  "returncode": "SUCCESS",
  "returnmsg": "获取成功",
  "subCode": null,
  "subMsg": null
}

测试结果

附件

  • shell脚本源码
#!/bin/bash

### configs
# appID
APPID='你的APPID'
# appsecret
APPSECRET='你的APPSECRET'
# template_id
TEMPLATE_ID='你的TEMPLATE_ID'
# access_token
TOKEN=""
# followers
FOLLOWERS=(
    '用户token1' # 用户1
    '用户token2' # 用户2
)

### headers
# user-agent
USER_AGENT="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35"
# accept
ACCEPT="accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
# content type
CONTENT_TYPE="Content-Type: application/json"
###

### date
# date formated
# current date
CUR_DATE=$(date '+%Y年%m月%d日')
# Room No.
ROOMNO='你的宿舍号'
# electricities
ELECTRICITIES=""
# json data
JSON_DATA=""
# template url
TEMPLATE_URL="http://weixin.qq.com/download"
###

### urls
# get token
GET_TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token"
GET_TOKEN_URL_PARAM="grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}"

### functions
# get token
get_token() {
    local RET=$(curl -s -H "${USER_AGENT}" -H "${ACCEPT}" -d "${GET_TOKEN_URL_PARAM}" $GET_TOKEN_URL)
    # unset TOKEN
    TOKEN=$(echo $RET | cut -d : -f 2 | cut -d , -f 1 | cut -d \" -f 2)
    return 0
}

# push Message
push_message() {
    get_token
    get_electricities

    # push message
    JSON_PATH="./data.json"

    PUSH_MESSAGE_URL="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${TOKEN}"

    for ((i = 0; i < ${#FOLLOWERS[@]}; i++)); do
        local user=${FOLLOWERS[$i]}
        encode_data_json ${user}

        local RET=$(curl -s -H "${USER_AGENT}" -H "${ACCEPT}" -H "${CONTENT_TYPE}" -d "${JSON_DATA}" $PUSH_MESSAGE_URL)
        # local RET=$(curl -H $USER_AGENT -H $ACCEPT -H $CONTENT_TYPE -d $JSON_PATH $PUSH_MESSAGE_URL)
        echo $RET
    done
}

# 构造模板json数据
encode_data_json() {
    # unset JSON_DATA
    JSON_DATA="{\"touser\": \"$1\",\"template_id\": \"${TEMPLATE_ID}\",\"url\": \"${TEMPLATE_URL}\",\"data\": {\"date\": {\"value\": \"${CUR_DATE}\"},\"roomno\": {\"value\": \"${ROOMNO}\"},\"electricities\": {\"value\": \"${ELECTRICITIES}\"}}}"
}

# get electricities
get_electricities() {
    local RET=$(
        curl -s -X POST 'https://cloudpaygateway.59wanmei.com:8087/paygateway/smallpaygateway/trade' \
            -H 'Origin: https://cloudpaygateway.59wanmei.com:8087' \
            -H 'Accept: application/json, text/plain, */*' \
            -H 'X-Requested-With: com.eg.android.AlipayGphone' \
            -H 'Referer: https://cloudpaygateway.59wanmei.com:8087/pay/index.html?token=你的token&_timestamp=1740900078698&customerId=1402' \
            -H 'Sec-Fetch-Site: same-origin' \
            -H 'Sec-Fetch-Dest: empty' \
            -H 'Accept-Encoding: gzip' \
            -H 'Sec-Fetch-Mode: cors' \
            -H 'x-mass-tappid: 2019030163398604' \
            -H 'Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' \
            -H 'Content-Type: application/json;charset=UTF-8' \
            -H 'Content-Length: 193' \
            -H 'User-Agent: Mozilla/5.0 (Linux; Android 14; OPD2201 Build/UKQ1.230924.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.148 MYWeb/0.11.0.250212163947 UWS/3.22.2.9999 UCBS/3.22.2.9999_220000000000 Mobile Safari/537.36 NebulaSDK/1.8.100112 Nebula AlipayDefined(nt:WIFI,ws:560|0|2.5,ac:sp) AliApp(AP/10.7.0.8000) AlipayClient/10.7.0.8000 Language/zh-Hans useStatusBar/true isConcaveScreen/false Region/CNAriver/1.0.0 MiniProgram APXWebView DTN/2.0' \
            -H 'Connection: Keep-Alive' \
            -H 'Host: cloudpaygateway.59wanmei.com:8087' \
            --data '{"timestamp":"2025-03-02 15:21:20","method":"samllProgramGetRoomState","bizcontent":"{\"payproid\":953,\"schoolcode\":\"1402\",\"roomverify\":\"2-11--6-6035\",\"businesstype\":2}","sourceId":1}'
    )
    # unset ELECTRICITIES
    ELECTRICITIES=$(echo $RET | cut -d : -f 4 | cut -d , -f 1 | cut -d \" -f 2)
    if [ $(printf "%.0f" ${ELECTRICITIES}) -gt "10" ]; then
        ELECTRICITIES+="度,电费大大滴有"
    else
        ELECTRICITIES+="度,你滴,快充电费~"
    fi
}

# main function
push_message