提要

之前基于ChromeDriver和selenium实现了自动打卡程序,但还存在一些问题:

代码量大
执行速度慢
受网络波动影响较大

尽管如此,这种方法也是有优点的,比如:

适应性强
可识别验证码等

另一种思路

  因为学校的打卡系统没有验证码识别,且整个系统基本上不设防,所以使用请求(requests)可以更加高效的实现打卡功能。

语言:Python
原理:发送请求登录打卡网站,获取上次打卡信息,并通过请求提交实现打卡
优点:速度快(保守估计比第一种方法快五十倍)
缺点:局限性较大,如果网站有验证码,就会很麻烦

Python代码

import requests
import re
import json
import pymysql
import hashlib

url_login="http://xggl.hnie.edu.cn/website/login"

headers = {
    'Host':"xggl.hnie.edu.cn",
    'Accept-Language':"zh-CN,zh;q=0.9,en;q=0.8",
    'Accept-Encoding':"gzip, deflate",
    'Content-Type':"application/x-www-form-urlencoded; charset=UTF-8",
    'Connection':"keep-alive",
    'Referer':"http://xggl.hnie.edu.cn/index",
    'User-Agent':"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36"
}

def md5(str):
    m = hashlib.md5()
    m.update(str.encode("utf8"))
    return m.hexdigest()

if __name__ == '__main__':
    db = pymysql.connect(host='xxxxxxxxxxxxxx',port=3306,user='xxxxxxxxxxxxxx',password='xxxxxxxxxxxxxx',db='xxxxxxxxxxxxxx')
    cursor = db.cursor()
    cursor.execute("use xxxxxxxxxxxxxx;")
    cursor.execute("select count(*) from xxxxxxxxxxxxxx;")
    num = cursor.fetchone()
    cursor.execute("SELECT * FROM xxxxxxxxxxxxxx")
    user_data = cursor.fetchall()
    for i in range(0,num[0]):
        data = {
            'username': user_data[i][1],
            'password': md5(user_data[i][2]),
            'action': "signin"
        }
        #登录
        session_requests = requests.session()
        login_res = session_requests.post(url_login,headers=headers, data=data)  

        #获取上次打卡信息
        last_url = "http://xggl.hnie.edu.cn/content/student/temp/zzdk/lastone"
        last_res = session_requests.get(last_url,headers=headers)
        last_text = last_res.content.decode("utf-8")
        xian = ""
        #因为有些地区没有县级,获取的时候会出错,所以这里要处理一下异常
        try:
            xian = json.loads(last_text)['jzdXian']['dm']
        except BaseException:
            xian = ""
        last_data = {
            'operationType' : "Create",
            'sfzx.dm' : json.loads(last_text)['sfzx'],
            'jzdSheng.dm' : json.loads(last_text)['jzdSheng']['dm'],
            'jzdShi.dm' : json.loads(last_text)['jzdShi']['dm'],
            'jzdXian.dm' : xian,
            'jzdDz' : json.loads(last_text)['jzdDz'],
            'jzdDz2' : json.loads(last_text)['jzdDz2'],
            'lxdh' : json.loads(last_text)['lxdh'],
            'grInd' : json.loads(last_text)['grInd'],
            'jcInd' : json.loads(last_text)['jcInd'],
            'jtqk.dm' : json.loads(last_text)['jtqk']['dm'],
            'jtqkXx' : json.loads(last_text)['jtqkXx'],
            'brqk.dm' : json.loads(last_text)['brqk']['dm'],
            'qwhbInd' : json.loads(last_text)['qwhbInd'],
            'qwhbXx' : json.loads(last_text)['qwhbXx'],
            'jchbrInd' : json.loads(last_text)['jchbrInd'],
            'jchbrXx' : json.loads(last_text)['jchbrXx'],
            'lxjlInd' : json.loads(last_text)['lxjlInd'],
            'lxjlXx' : json.loads(last_text)['lxjlXx'],
            'tw' : json.loads(last_text)['tw'],
            'bz' : json.loads(last_text)['bz'],
        }
        #print(last_data)
        #提交打卡
        dk_url = "http://xggl.hnie.edu.cn/content/student/temp/zzdk" + re.findall("welcome(.*?)\"",login_res.content.decode("utf-8"))[0]
        dk_res = session_requests.post(dk_url,headers=headers,data=last_data)
        print(dk_res.content.decode("utf-8"))

上一篇指路:关于易班打卡那点事(一)

GitHub地址:湖南工程学院易班自动打卡脚本

最后修改:2020 年 11 月 17 日 01 : 53 PM
愿君多打钱,此物最相思