这个西邮的东区学生公寓(安悦公寓)电费查询在一个支付宝小程序里面,但是小程序的电费查询功能是一个链接到第三方的页面。后续发现这东西甚至没有一个合适的鉴权机制,只要知道电表ID就能查电费,于是顺便用 Python 给宿舍做了个电量使用计数器。
通过简单的分享小程序可以获取查询页面嵌入的实际页面 URL,即:
http://cwgydf.xupt.edu.cn/electricmeterALi/index.html#/pages/meterlist/meterquery
访问页面需要传入3个 GET 参数:
userId
:支付宝用户ID,证明是小程序进入的用户
meterId
:查询用户ID(应该也是电表ID),和稍后发起 POST 查询请求的 electricUserUid 一致
elemeterTypeRemark
:疑似备注,安悦南用户进入查询页面,这个参数自动设置为“预付费远控公寓21老KD协议”
在这个页面点击“查询”按钮,会再向另一个地址发起 POST 请求,目标 URL 是:
http://cwgydf.xupt.edu.cn/kddz/electricmeterpost/aliElectricMeterQuery
POST 上传的数据 content-type 是 application/x-www-form-urlencoded。
请求体:
aliId=114514&electricUserUid=1919810&isAfterMoney=0
aliId
:支付宝小程序绑定的电表系统用户ID
electricUserUid
:电表ID
isAfterMoney
:充值后跳转,此参数为1
响应体:
content-type:application/json
{
"msg": "操作成功",
"code": 200,
"data": {
"querycode": "1",
"shengyu": "72.30",
"zxzhuangtai": "接通",
"price": "0.5000",
"zhuangtai": "接通",
"leiji": "0.00",
"querymsg": "KD协议状态查询成功!"
}
}
响应数据包括了剩余电量(度)、执行状态、电量单价(元/度)、实际状态、累计用电量(度,但是疑似设计问题永远为0)
实测无论如何(参数错误、查询超时),响应的信息 code 一直是 200,httpcode 也是 200 OK,所以实际是否查询成功还需要看 zhuangtai 是否为“查询失败”。
小技巧:善用 F12 开发者控制台“网络”日志,来获取查询时 POST 请求“载荷”,从而获取查询用户信息。
Python 查询示例:
import requests,json
# 要自己改用户信息
def electric():
reqData = {
"aliId": 8888,
"electricUserUid": 66,
"isAfterMoney": 0
}
response = requests.post('http://cwgydf.xupt.edu.cn/kddz/electricmeterpost/aliElectricMeterQuery',reqData).json()
resData = {}
if response['data']['zhuangtai'] == '查询失败':
resData['status'] = False
else:
resData['status'] = True
resData['data'] = response['data']
return resData
resData[‘status’] 可以判断是否查询成功;如果成功可通过 resData[‘data’][‘shengyu’] 输出剩余电量。