目录:尚未完成 2021.11.6
1. 查寝任务
1.1 思路:
目前,通过简单的测试,可以确保任务可行。爬取结果主要有两个关键要点:
- 未查寝的人数
- 学生的详细信息(名字,班级)
POST请求的header以及data如下
header = {
定参 "Host": "swu.campusphere.net",
定参 "Accept": "application/json, text/plain, */*",
定参 "X-Requested-With": "XMLHttpRequest",
定参 "Accept-Language": "zh-cn",
定参 "Accept-Encoding": "gzip, deflate, br",
定参 "Content-Type": "application/json;charset=utf-8",
定参 "Origin": "https://swu.campusphere.net",
定参(请求次数过多可能失效)"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 (4891009536)cpdaily/9.0.12 wisedu/9.0.12",
定参 "Connection": "keep-alive",
定参 "Referer": "https://swu.campusphere.net/wec-counselor-sign-apps/sign/mobile/index.html?detail=true&signWid=448611&v=1636193619",
定参 "Content-Length": "297",
定参(需要进行keep-alive,即每隔一段时间,用该cookie向后台发送请求)"Cookie": cookie
}
body = {
定参"pageNumber": 1,
变参(这是表示一次接受多少数据,因此我们可以设置一个比较大的值)"pageSize": 479,
未知"signStatus": 2,
定参"sortColumn": "userId asc",
"cls": "",
"clsName": "",
"grade": "",
"dept": "",
"deptName": "",
"major": "",
"isLate": "-1",
"majorName": "",
"qrcodeUserWid": "-1",
"hasChangeLog": "",
"isMalposition": "-1",
"extraFieldItemVos": [],
定参(signWid)"taskWid": "448611",
变参"taskInstanceWid": "213524"
}
从以上json数据的分析中,我们发现,POST的数据中有变化的参数。因此,完成任务的关键就是在发送POST请求前获得变化参数的具体值。变化的参数有:
- taskInstanceWid: 这应该就是signInstanceWid,可以通过以固定步长检索得到。
因此,任务主要分为以下几个模块:
- Keep-Alive: 保持cookie的存活
- getTaskInstanceWid: 在任务开始前或者某个时期,以某个固定的step来进行检索。
- getInfo: 在固定的时间段内,每隔30min或者其它的时间间隔获取未完成任务的同学的姓名和班级。
1.2 程序模块
1.2.3 getInfo
def getData(filepath):
'''
获得未打卡同学的详细信息
:param filepath: 配置文件的路径
:return: [["name1","class1"],["name2","class2"]]
'''
# 加载header和data数据
with open(filepath) as fp:
userInfo = json.load(fp)
fp.close()
url = userInfo["url"]
cookie = userInfo["cookie"]
header = userInfo["header"]
header["Cookie"] = cookie
data = json.dumps(userInfo["body"])
print(type(header))
print(type(data))
# 创建session发送Post请求
s = requests.session()
re = s.post(url=url, headers=header, data=data)
# 处理数据
Info = re.json()
mark = Info["message"]
if mark != "SUCCESS":
return False
persons = Info["datas"]["rows"]
infos = []
# 解析数据
for item in persons:
tmp = []
tmp.append(item["name"])
tmp.append(item["cls"])
infos.append(tmp)
return infos
注意
上面就是核心部分,其余模块(keep-alive,更新taskInstanceWid,以及其它)我在之前的博文中都写过类似的,可以去翻阅。如果需求量高的话,我会抽时间重新整理一下。