iaun пре 5 година
комит
34873ef1ca
4 измењених фајлова са 180 додато и 0 уклоњено
  1. 2 0
      .gitignore
  2. 6 0
      config.py
  3. 166 0
      kaoqin.py
  4. 6 0
      para.sample.py

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+__pycache__/
+para.py

+ 6 - 0
config.py

@@ -0,0 +1,6 @@
+## 考勤范围:在指定时间区间内,随机时间进行考勤
+# 考勤范围开始,格式 [小时, 分钟]
+START_TIME = [8, 0]
+
+# 考勤范围结束,格式 [小时, 分钟]
+END_TIME = [9, 0]

+ 166 - 0
kaoqin.py

@@ -0,0 +1,166 @@
+import requests
+import urllib.parse
+import json
+import random
+import time
+import datetime
+import sys
+
+import para
+import config
+
+TODAY = None
+TODAY_SUCCESS = False
+TODAY_EXEC_TIME = None
+
+d_start_time = None
+d_end_time = None
+
+def getHeader():
+    return {
+        "User-Agent":"Mozilla/5.0 (Linux; Android 10; MI 9 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36 MMWEBID/1122 MicroMessenger/7.0.20.1781(0x27001439) Process/toolsmp WeChat/arm64 NetType/4G Language/zh_CN ABI/arm64"
+    }
+
+def getObj(sxid, xssxglid, lat, lng, title):
+    obj = {}
+    obj['cnz022'] = sxid
+    obj['cnz058'] = xssxglid
+    obj['cne640'] = lat
+    obj['cne641'] = lng
+    obj['cne642'] = title
+    return json.dumps(obj,separators=(',',':'), ensure_ascii=False)
+
+
+def getTime():
+    return int(round(time.time()*1000))
+
+
+def f_login(session):
+    p = para.get()
+    try:
+        r = session.get("https://hrsspub.sz.gov.cn/jgxxfw/jgfw/sooLogin", params = {
+            "para": p,
+            "type": 1,
+            "_": getTime()
+        }, headers=getHeader())
+        if r.text.find('"status":200') == -1:
+            if r.text.find('系统异常'):
+                print("[%s] %s" % (TODAY, '登录无效,请检查para'))
+            else:
+                print("[%s] %s" % (TODAY, '未知错误'))
+            return False
+    except Exception as e:
+        print("[%s] %s" % (TODAY, e))
+        return False
+    else:
+        return True
+    
+def f_getKq(session):
+    try:
+        r = session.post("https://hrsspub.sz.gov.cn/jgxxfw/jgfw/ydfw/student/getKqdd", headers=getHeader())
+        if r.text.find('"status":200') == -1:
+            print("[%s] %s" % (TODAY, r.text))
+            return False
+        else:
+            data = json.loads(r.text)
+            if 'result' in data and 'xssxglid' in data['result'] and 'sxid' in data['result'] and 'data' in data['result'] and  len(data['result']['data'])!= 0 and 'cnz080' in data['result']['data'][0] and 'cnz058' in data['result']['data'][0] and 'lat' in data['result']['data'][0] and 'lng' in data['result']['data'][0] and 'title' in data['result']['data'][0]:
+                return f_submitKq(session, getObj(data['result']['sxid'], data['result']['xssxglid'], data['result']['data'][0]['lat'], data['result']['data'][0]['lng'], data['result']['data'][0]['title']))
+            else:
+                print("[%s] %s" % (TODAY, data))
+                print("[%s] %s" % (TODAY, '缺少部分信息'))
+                return False
+    except Exception as e:
+        print("[%s] %s" % (TODAY, e))
+        return False
+
+def f_submitKq(session, data):
+    try:
+        r = session.get('https://hrsspub.sz.gov.cn/jgxxfw/jgfw/ydfw/student/addKqjl', params = {
+            "xskqjlxxDTO": data,
+            "_": getTime()
+        }, headers=getHeader())
+        print("[%s] %s" % (TODAY, r.text))
+        d = json.loads(r.text)
+        if 'status' in d:
+            if d['status'] == 200 or d['status'] == 300:
+                return True
+
+    except Exception as e:
+        print("[%s] %s" % (TODAY, e))
+        return False
+    return False
+
+def getToday():
+    return str(datetime.datetime.now().date())
+
+def getRandomTime():
+    i_start_time = int(time.mktime(d_start_time.timetuple()))
+    i_end_time = int(time.mktime(d_end_time.timetuple()))
+    return datetime.datetime.fromtimestamp(random.randint(i_start_time, i_end_time))
+    
+
+def f_start():
+    global TODAY_SUCCESS
+    session = requests.session()
+    success = f_login(session)
+    if not success:
+        return
+    TODAY_SUCCESS = f_getKq(session)
+    print("[%s] %s %s" % (getToday(), TODAY_SUCCESS, datetime.datetime.now()))
+
+# 自定义规则(此处设置周六周日不打卡,1月后不打卡)
+def check_rule():
+    t = datetime.datetime.now()
+    if t.weekday() == 5 or t.weekday() == 6: # 周六日无需打卡
+        return False
+    
+    if t.month != 1: # 1月后假期无需打卡
+        return False
+    
+    return True
+
+def f_loop():
+    global TODAY, TODAY_SUCCESS, TODAY_EXEC_TIME
+    while True:
+        if not check_rule():
+            time.sleep(5)
+            continue
+        now = datetime.datetime.now()
+        if TODAY_EXEC_TIME is None: # 首次运行
+            TODAY_SUCCESS = False
+            TODAY_EXEC_TIME = datetime.datetime.strptime(TODAY+" %d:%d:00" % (config.END_TIME[0], config.END_TIME[1]), '%Y-%m-%d %H:%M:%S')
+            if TODAY_EXEC_TIME < now:
+                print("[%s] 今日超过设置时间,将不打卡" % TODAY)
+                TODAY_SUCCESS = True
+                time.sleep(5)
+                continue
+            else:
+                print("[%s] 开始打卡时间:%s" % (TODAY, "now"))
+                f_start()
+                time.sleep(5)
+                continue
+        
+        if not TODAY == getToday():
+            TODAY = getToday()
+            TODAY_SUCCESS = False
+            TODAY_EXEC_TIME = getRandomTime()
+            print()
+            print("[%s] 开始打卡时间:%s" % (TODAY, TODAY_EXEC_TIME))
+
+        if now >= TODAY_EXEC_TIME and not TODAY_SUCCESS:
+            f_start()
+            time.sleep(5)
+            continue
+        
+        time.sleep(5)
+
+
+if __name__ == '__main__':
+    TODAY = getToday()
+    d_start_time = datetime.datetime.strptime(TODAY+" %d:%d:00" % (config.START_TIME[0], config.START_TIME[1]), '%Y-%m-%d %H:%M:%S')
+    d_end_time = datetime.datetime.strptime(TODAY+" %d:%d:59" % (config.END_TIME[0], config.END_TIME[1]), '%Y-%m-%d %H:%M:%S')
+    if not d_start_time <= d_end_time:
+        print("[%s] %s" % (TODAY, 'config.py 时间区间错误'))
+        sys.exit()
+    f_loop()
+    

+ 6 - 0
para.sample.py

@@ -0,0 +1,6 @@
+para = "para"
+
+def get():
+    if para.find("para=") != -1:
+        return para.split("para=")[1]
+    return para