kaoqin.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import requests
  2. import json
  3. import random
  4. import time
  5. import datetime
  6. import sys
  7. import para
  8. import config
  9. TODAY = None
  10. TODAY_SUCCESS = False
  11. TODAY_EXEC_TIME = None
  12. # d_start_time = None
  13. # d_end_time = None
  14. def getHeader():
  15. return {
  16. "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"
  17. }
  18. def getObj(sxid, xssxglid, lat, lng, title):
  19. obj = {}
  20. obj['cnz022'] = sxid
  21. obj['cnz058'] = xssxglid
  22. obj['cne640'] = lat
  23. obj['cne641'] = lng
  24. obj['cne642'] = title
  25. return json.dumps(obj,separators=(',',':'), ensure_ascii=False)
  26. def getTime():
  27. return int(round(time.time()*1000))
  28. def f_login(session):
  29. p = para.get()
  30. try:
  31. r = session.get("https://hrsspub.sz.gov.cn/jgxxfw/jgfw/sooLogin", params = {
  32. "para": p,
  33. "type": 1,
  34. "_": getTime()
  35. }, headers=getHeader())
  36. if r.text.find('"status":200') == -1:
  37. if r.text.find('系统异常'):
  38. print("[%s] %s" % (TODAY, '登录无效,请检查para'))
  39. else:
  40. print("[%s] %s" % (TODAY, '未知错误'))
  41. return False
  42. except Exception as e:
  43. print("[%s] %s" % (TODAY, e))
  44. return False
  45. else:
  46. return True
  47. def f_getKq(session):
  48. try:
  49. r = session.post("https://hrsspub.sz.gov.cn/jgxxfw/jgfw/ydfw/student/getKqdd", headers=getHeader())
  50. if r.text.find('"status":200') == -1:
  51. print("[%s] %s" % (TODAY, r.text))
  52. return False
  53. else:
  54. data = json.loads(r.text)
  55. 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]:
  56. 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']))
  57. else:
  58. print("[%s] %s" % (TODAY, data))
  59. print("[%s] %s" % (TODAY, '缺少部分信息,无法进行打卡'))
  60. return False
  61. except Exception as e:
  62. print("[%s] %s" % (TODAY, e))
  63. return False
  64. def f_submitKq(session, data):
  65. try:
  66. r = session.get('https://hrsspub.sz.gov.cn/jgxxfw/jgfw/ydfw/student/addKqjl', params = {
  67. "xskqjlxxDTO": data,
  68. "_": getTime()
  69. }, headers=getHeader())
  70. print("[%s] 服务端数据:%s" % (TODAY, r.text))
  71. d = json.loads(r.text)
  72. if 'status' in d:
  73. if d['status'] == 200 or d['status'] == 300:
  74. return True
  75. except Exception as e:
  76. print("[%s] %s" % (TODAY, e))
  77. return False
  78. return False
  79. def getToday():
  80. return str(datetime.datetime.now().date())
  81. def getRandomTime():
  82. d_start_time = datetime.datetime.strptime(TODAY+" %d:%d:00" % (config.START_TIME[0], config.START_TIME[1]), '%Y-%m-%d %H:%M:%S')
  83. d_end_time = datetime.datetime.strptime(TODAY+" %d:%d:59" % (config.END_TIME[0], config.END_TIME[1]), '%Y-%m-%d %H:%M:%S')
  84. i_start_time = int(time.mktime(d_start_time.timetuple()))
  85. i_end_time = int(time.mktime(d_end_time.timetuple()))
  86. return datetime.datetime.fromtimestamp(random.randint(i_start_time, i_end_time))
  87. def f_start():
  88. global TODAY_SUCCESS
  89. session = requests.session()
  90. success = f_login(session)
  91. if not success:
  92. return False
  93. TODAY_SUCCESS = f_getKq(session)
  94. print("[%s] %s %s" % (TODAY, ("成功" if TODAY_SUCCESS else "失败"), datetime.datetime.now()))
  95. return TODAY_SUCCESS
  96. def f_loop():
  97. global TODAY, TODAY_SUCCESS, TODAY_EXEC_TIME
  98. while True:
  99. if not config.check_rule():
  100. if not TODAY_SUCCESS or not TODAY == getToday():
  101. TODAY = getToday()
  102. TODAY_SUCCESS = True
  103. print("[%s] 今日无需打卡" % TODAY)
  104. time.sleep(5)
  105. continue
  106. now = datetime.datetime.now()
  107. if TODAY_EXEC_TIME is None and not TODAY_SUCCESS: # 首次运行
  108. TODAY_SUCCESS = False
  109. TODAY_EXEC_TIME = datetime.datetime.strptime(TODAY+" %d:%d:00" % (config.END_TIME[0], config.END_TIME[1]), '%Y-%m-%d %H:%M:%S')
  110. if TODAY_EXEC_TIME < now:
  111. print("[%s] 今日超过设置时间,将不打卡" % TODAY)
  112. TODAY_SUCCESS = True
  113. time.sleep(5)
  114. continue
  115. else:
  116. print("[%s] 开始打卡时间:现在" % TODAY)
  117. succ = f_start()
  118. if not succ: # 失败等待1分钟后重试
  119. TODAY_EXEC_TIME = None
  120. time.sleep(60)
  121. else:
  122. time.sleep(5)
  123. continue
  124. if not TODAY == getToday():
  125. TODAY = getToday()
  126. TODAY_SUCCESS = False
  127. TODAY_EXEC_TIME = getRandomTime()
  128. print("[%s] 开始打卡时间:%s" % (TODAY, TODAY_EXEC_TIME))
  129. end_time = datetime.datetime.strptime(TODAY+" %d:%d:59" % (config.END_TIME[0], config.END_TIME[1]), '%Y-%m-%d %H:%M:%S')
  130. if now >= end_time and not TODAY_SUCCESS: # 超过考勤时间
  131. print("[%s] 今日超过设置时间,将不打卡" % TODAY)
  132. TODAY_SUCCESS = True
  133. time.sleep(5)
  134. continue
  135. if now >= TODAY_EXEC_TIME and not TODAY_SUCCESS:
  136. succ = f_start()
  137. if not succ: # 失败等待1分钟后重试
  138. time.sleep(60)
  139. else:
  140. time.sleep(5)
  141. continue
  142. time.sleep(5)
  143. if __name__ == '__main__':
  144. TODAY = getToday()
  145. d_start_time = datetime.datetime.strptime(TODAY+" %d:%d:00" % (config.START_TIME[0], config.START_TIME[1]), '%Y-%m-%d %H:%M:%S')
  146. d_end_time = datetime.datetime.strptime(TODAY+" %d:%d:59" % (config.END_TIME[0], config.END_TIME[1]), '%Y-%m-%d %H:%M:%S')
  147. if not d_start_time <= d_end_time:
  148. print("[%s] %s" % (TODAY, 'config.py 时间区间错误'))
  149. sys.exit()
  150. f_loop()