宿舍电费查询——以ZUA为例
- 0. 安装抓包环境
- 手机端
- 桌面端
- 1. 登录
- 1.1 开启抓包后进入缴费页面:
- 1.2 分析请求
- 1.3 编写登录代码
- 2. 获取楼栋及房间ID
- 2.1 获取楼栋ID
- 2.2 编写获取楼栋ID代码
- 2.3 获取房间ID
- 2.4 编写获取房间ID代码
- 3. 获取剩余电费:
- 3.1 选择房间号
- 3.2 获取指定房间剩余电量
- 4. 完整python代码
- 免责声明
0. 安装抓包环境
按需选择HTTPCanary、WireShark或Fidder等抓包软件,这里建议使用HTTPCanary
手机端
参考这篇文章小黄鸟(HTTPCanary)安装及Android高版本CA证书配置
桌面端
浏览并参考Fidder或WireShark
1. 登录
首先参考小黄鸟抓包实战之完美校园报平安选择微信为目标应用,过滤掉不需要的网络请求
1.1 开启抓包后进入缴费页面:
1.2 分析请求
输入信息登录后,返回HTTPCanary,根据Url关键词查找带Login
的请求:
点击请求下面的Text
可以看到登录的请求数据,几个比较重要的参数xh/sfz
、pwd
、xh
、Ityp
:
1.3 编写登录代码
import requestsdef login():login_url = 'http://cwcfw.zua.edu.cn/xysf/api/User/App/Login'login_data = { #这里填入你获取到的data信息, 由于密码采用 证书加密, 这里暂时不支持直接输入密码"xh": "xh","pwd": "pwd","rsaStr": "8983124","ltyp": "id"}session.post(login_url, cookies=cookie, json=login_data)# 可使用下面代码查看登录状态# response = requests.post(login_url, headers=headers, json=login_data)# print(response.text)cookie = {"ASP.NET_SessionId": "",# 这里面填入登录时抓取到的cookie
}
login()
2. 获取楼栋及房间ID
2.1 获取楼栋ID
登录进来后继续打开HTTPCanary并抓包,点击电费充值
,页面此时会跳转到楼栋选择页面
此时返回HTTPCanary并根据Url关键词查找带GetOption
的Url:
此时在请求->Raw下我们可以看到一个Post请求地址
和请求的Data数据
,而在响应->Text下可以看到返回的json数据
2.2 编写获取楼栋ID代码
随后,我们模拟这个请求获取各楼层ID:
import json
import requestsdef get_floors():url = 'https://cwcfw.zua.edu.cn/xysf/api/user/ElecRoomIs/GetOption'data = { # 请求中的数据包"key": "build","option": {"areaid": "1","buildid": "-1","roomid": "-1","IsLxr": False,"IsDefault": False,"IsFirst": False,"Cxid": ""}}response = session.post(url, cookies=cookie, json=data)# print(response.text)floors = {} # 将楼栋号和其对应的楼栋ID存入字典for floor in response.json().get('Content')[1:]:if not floor.get('selected'):continuename = floor.get('label').strip()[:-2]num = floor.get('value').strip()floors[name] = num# pprint(floors)return floorscookie = {"ASP.NET_SessionId": "",# 这里面填入登录时抓取到的cookie
}
session = requests.session()
login()
floors = get_floors()
print(floors) # 查看获取到的楼栋号及ID
这里请求采用的是session
而不是requests
是由于系统的登录策略,这个系统在每次登录后激活一段时间的账号使用权限,过后就会失去权限。使用login()
登录后session
保持住会话可以避免请求不到楼层信息。
2.3 获取房间ID
保持HTTPCanary运行,这里先选择你所在的楼号:
点击选择楼号后,离开返回HTTPCanary,查找关键词为GetOption
的Url:
我们可以从响应中看到我们选择的数据包可以获取到房间号,以及请求所需的Post地址
和Data
2.4 编写获取房间ID代码
根据Post地址
和Data
,模拟这个请求获取各楼层ID:
def get_rooms(floor):url = 'https://cwcfw.zua.edu.cn/xysf/api/user/ElecRoomIs/GetOption'data = {"key": "room","option": {"areaid": "1","buildid": floor,"roomid": "-1","IsLxr": False,"IsDefault": False,"IsFirst": False,"Cxid": ""}}response = session.post(url, cookies=cookie, json=data)# print(response.json())rooms = {}for room in response.json().get('Content')[1:]:if not room.get('selected'):continuename = room.get('label').strip()[:-2]num = room.get('value').strip()rooms[name] = num# pprint(rooms)return roomscookie = {"ASP.NET_SessionId": "",# 这里面填入登录时抓取到的cookie
}
session = requests.session()
login()
floor_id= 78 # 直接手动选择楼栋ID
rooms = get_rooms(floor_id)
print(rooms)
3. 获取剩余电费:
3.1 选择房间号
保持HTTPCanary运行,选择房间号后点击确认按钮查询该房间剩余电费:
此时返回HTTPCanary并根据Url关键词查找带Recharge
的Url:
Balance
即为所需房间的剩余电量
3.2 获取指定房间剩余电量
def get_balance(floor, room_id):url = "http://cwcfw.zua.edu.cn/xysf/aAppPage/index.aspx/GetRechargeInfo"data = {"rybh": json.dumps({"areaid": "1","buildid": floor,"roomid": room_id,"IsLxr": False,"IsDefault": False,"IsFirst": False,"Cxid": ""}),"category": "ElecRoomIs"}response = session.post(url, cookies=cookie, json=data)# response.encoding = 'utf-8'# print(response.json())Content = response.json().get('d').get('Content')address = Content.get('CzThirdInfo').get('Czxm').split('/')[-1].split('空调')[0]balance = Content.get('CzThirdInfo').get('Balance')return f'{room_id}\t{address}: {balance} kWh'cookie = {"ASP.NET_SessionId": "",# 这里面填入登录时抓取到的cookie
}
session = requests.session()
login()
floor_id = 78 # 直接手动选择楼栋ID
room_id = 24245
info = get_rooms(floor_id, room_id)
print(info)
4. 完整python代码
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# @author : xiao6ming6
# @time : 2025/7/11 20:45
# @function: the script is used to do ...
# @version : V1
import json
import requestsdef login():login_url = 'http://cwcfw.zua.edu.cn/xysf/api/User/App/Login'login_data = { #这里填入你获取到的data信息, 由于密码采用 证书加密, 这里暂时不支持直接输入密码,信息需通过抓包填入"xh": "xh","pwd": "pwd","rsaStr": "8983124","ltyp": "id"}session.post(login_url, cookies=cookie, json=login_data)# 可使用下面代码查看登录状态# response = requests.post(login_url, headers=headers, json=login_data)# print(response.text)def get_floors():url = 'https://cwcfw.zua.edu.cn/xysf/api/user/ElecRoomIs/GetOption'data = {"key": "build","option": {"areaid": "1","buildid": "-1","roomid": "-1","IsLxr": False,"IsDefault": False,"IsFirst": False,"Cxid": ""}}response = session.post(url, headers=headers, json=data)# print(response.text)floors = {}for floor in response.json().get('Content')[1:]:if not floor.get('selected'):continuename = floor.get('label').strip()[:-2]num = floor.get('value').strip()floors[name] = num# pprint(floors)return floorsdef get_rooms(floor):url = 'https://cwcfw.zua.edu.cn/xysf/api/user/ElecRoomIs/GetOption'data = {"key": "room","option": {"areaid": "1","buildid": floor,"roomid": "-1","IsLxr": False,"IsDefault": False,"IsFirst": False,"Cxid": ""}}response = session.post(url, headers=headers, json=data)# print(response.json())rooms = {}for room in response.json().get('Content')[1:]:if not room.get('selected'):continuename = room.get('label').strip()[:-2]num = room.get('value').strip()rooms[name] = num# pprint(rooms)return roomsdef get_balance(floor, room_id):url = "http://cwcfw.zua.edu.cn/xysf/aAppPage/index.aspx/GetRechargeInfo"data = {"rybh": json.dumps({"areaid": "1","buildid": floor,"roomid": room_id,"IsLxr": False,"IsDefault": False,"IsFirst": False,"Cxid": ""}),"category": "ElecRoomIs"}response = session.post(url, headers=headers, json=data)# print(response.json())Content = response.json().get('d').get('Content')address = Content.get('CzThirdInfo').get('Czxm').split('/')[-1].split('空调')[0]balance = Content.get('CzThirdInfo').get('Balance')return f'{room_id}\t{address}: {balance} kWh'cookie = {"ASP.NET_SessionId": "",# 这里面填入登录时抓取到的cookie
}
session = requests.session()
login()while True:room_name = input('enter room name(0 to exit): ').strip()if room_name == '0':breakfloor = room_name.split('-')[0]floors = get_floors()floor_id = floors.get(floor)rooms = get_rooms(floor_id)rooms_id = rooms.get(room_name)balance = get_balance(floor_id, rooms_id)print(balance)
如需对抓取登录信息方法有疑问,可通过评论区或阅读原文交流
免责声明
本文内容仅为技术研究与经验分享,旨在提供信息参考。所有方法、代码或操作步骤仅供学习交流,不构成任何形式的技术建议或法律依据。
使用者需自行承担因实践本文内容而产生的全部风险。作者及发布平台对任何直接、间接、因使用或无法使用本文内容造成的损失或损害概不负责。
技术应用应遵守所在国家/地区法律法规,任何违反法律的行为均与本文无关。建议实施前做好数据备份及环境隔离,确保操作安全可控。