今日校园----获取未完成任务同学的姓名和班级

目录:尚未完成 2021.11.6

1. 查寝任务

1.1 思路:

目前,通过简单的测试,可以确保任务可行。爬取结果主要有两个关键要点:

  1. 未查寝的人数
  2. 学生的详细信息(名字,班级)

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请求前获得变化参数的具体值。变化的参数有:

  1. taskInstanceWid: 这应该就是signInstanceWid,可以通过以固定步长检索得到。

因此,任务主要分为以下几个模块:

  1. Keep-Alive: 保持cookie的存活
  2. getTaskInstanceWid: 在任务开始前或者某个时期,以某个固定的step来进行检索。
  3. 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,以及其它)我在之前的博文中都写过类似的,可以去翻阅。如果需求量高的话,我会抽时间重新整理一下。

上一篇:同时上传多个文件,解析多个文件


下一篇:北斗导航 | 获取观测卫星的位置信息,并绘制卫星的方位角和仰角得到星空图:GSV语句(附Matlab源代码)