import sys import requests import time import json import random # 定义的全局变量 LOGIN_NAME = "dl-renmeng" LOGIN_PASSWD = "1111" IS_WORK_DAY = 0 def get_clock_in_data(clock_in_time): """根据当前的小时,返回打卡的入参""" print("当前时间-小时:", clock_in_time.tm_hour) # 定义时间类型 time_type_one = ["00:00", "09:00", "18:00", "23:59"] time_type_two = ["00:00:00", "09:00:00", "18:00:00", "23:59:59"] clock_in_data = {} if clock_in_time.tm_hour > 9: # 下午打卡 clock_in_data = { "time": time_type_one[2], "belongtime": time_type_one[2], "canSignTime": time_type_one[3], "signTime": time.strftime("%H:%M:%S", clock_in_time), "date": time.strftime("%Y-%m-%d", clock_in_time), "belongdate": time.strftime("%Y-%m-%d", clock_in_time), "datetime": f'{time.strftime("%Y-%m-%d", clock_in_time)} {time_type_two[2]}', "signSectionTime": f'{time.strftime("%Y-%m-%d", clock_in_time)} {time_type_two[3]}', "signSection": f'{time.strftime("%Y-%m-%d", clock_in_time)} {time_type_two[0]}#{time.strftime("%Y-%m-%d", struct_time)} {time_type_two[3]}', "min": "359", "workmins": "480", "type": "off", "across": "0", "islastsign": "1", "isYellow": "1", "isPunchOpen": "1", "isacross": "0", "pre": "0", "active": "0", "needSign": "0", "reSign": "1", "min_next": "-1", "signfrom": "e9pc", "serialid": "1", "signAcross": "0", "signAcross_next": "0", "signbelong": "今天", "signbelongspan": "今天", } else: # 上午打卡 clock_in_data = { "time": time_type_one[1], "belongtime": time_type_one[1], "canSignTime": time_type_one[0], "date": time.strftime("%Y-%m-%d", clock_in_time), "belongdate": time.strftime("%Y-%m-%d", clock_in_time), "datetime": f'{time.strftime("%Y-%m-%d", clock_in_time)} {time_type_two[1]}', "signSectionTime": f'{time.strftime("%Y-%m-%d", clock_in_time)} {time_type_two[0]}', "signSection": f'{time.strftime("%Y-%m-%d", clock_in_time)} {time_type_two[0]}#{time.strftime("%Y-%m-%d", struct_time)} {time_type_two[3]}', "min": "540", "workmins": "480", "isfirstsign": "1", "type": "on", "across": "0", "islastsign": "1", "isYellow": "0", "isPunchOpen": "1", "isacross": "0", "pre": "0", "active": "1", "needSign": "1", "min_next": "-1", "serialid": "1", "signAcross": "0", "signAcross_next": "0", } return clock_in_data def trusty_sleep(sleep_time): """睡觉方法""" print(f"开始休眠:{sleep_time} 秒") start = time.time() while time.time() - start < sleep_time: time.sleep(sleep_time - (time.time() - start)) struct_time = time.localtime(time.time()) # 得到结构化时间格式 now_time = time.strftime("%Y%m%d", struct_time) # now_time = 20220131 print("当前时间:", now_time) url = f"https://api.apihubs.cn/holiday/get?field=workday&date={now_time}&workday=1&cn=1&size=31" print("获取工作日信息url:", url) print("开始发送请求----->>>>>>") request_result = requests.get(url) print("请求结果返回----->>>>>>", request_result) # 请求返回成功 if request_result.status_code == 200: # 解析json is_work = json.loads(request_result.text) # 数据获取成功 if is_work["code"] == 0: data_list = is_work["data"]["list"][0] if is_work["data"]["list"] else [] IS_WORK_DAY = data_list["workday"] if data_list else 0 print("当前日期是否是工作日(1:是,0:否):", IS_WORK_DAY) if IS_WORK_DAY == 1: header = { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36", "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", } print("开始OA登录----->>>") login_form_data = { "loginid": LOGIN_NAME, "langid": "7", } login_form_url = "http://oa.njhgroup.cn/api/hrm/login/getLoginForm" login_form_result = requests.post( login_form_url, headers=header, data=login_form_data ) print(requests.utils.dict_from_cookiejar(login_form_result.cookies)) randcode = json.loads(login_form_result.text)["qrcode"]["loginkey"] print("获取randcode结果---->>>", randcode) login_data = { "loginid": LOGIN_NAME, "userpassword": LOGIN_PASSWD, "logintype": "1", "isie": "false", } login_cookie = login_form_result.cookies # 开始进行OA登录 oa_login_url = "http://oa.njhgroup.cn/api/hrm/login/checkLogin" login_result = requests.post( oa_login_url, headers=header, data=login_data, cookies=requests.utils.dict_from_cookiejar(login_form_result.cookies), ) print(requests.utils.dict_from_cookiejar(login_result.cookies)) print(login_result.text) print("OA登录结束----->>>", login_result.text) # 休眠10秒 time.sleep(10) print("OA开始刷新randcode----->>>") ts = int(round(time.time() * 1000)) refresh_code_url = f"http://oa.njhgroup.cn/rsa/weaver.rsa.GetRsaInfo?ts={ts}" refresh_code_result = requests.get(refresh_code_url, headers=header) print(refresh_code_result.cookies) print("OA刷新randcode结束----->>>") # 组装最后的cookie clock_in_cookie = requests.utils.dict_from_cookiejar( login_form_result.cookies) clock_in_cookie.update( requests.utils.dict_from_cookiejar(refresh_code_result.cookies) ) clock_in_cookie.update( requests.utils.dict_from_cookiejar(login_result.cookies)) print("开始检查当日是否请假----->>>") check_is_work_url = ( "http://oa.njhgroup.cn/api/kq/myattendance/getHrmKQMonthReportInfo" ) check_is_work_result = requests.post( check_is_work_url, headers=header, data={ "typevalue": time.strftime("%Y-%m", struct_time), "loaddata": "1", "type": "2", }, cookies=clock_in_cookie, ).text # 解析json is_work = json.loads(check_is_work_result) print("结束检查当日是否请假----->>>") print(f"{struct_time.tm_mday}") isWorkDay = is_work["result"][f"{struct_time.tm_mday}"]["isWorkDay"] workflow = len(is_work["result"][f"{struct_time.tm_mday}"]["workflow"]) print(f"今天是否是工作日:{isWorkDay},今天是否请假:{workflow}") needSign = False if isWorkDay and workflow <= 0: needSign = True else: print("今日有请假,不打卡~!") sys.exit() check_is_need_sign_url = "http://oa.njhgroup.cn/api/hrm/kq/attendanceButton/getButtons" check_is_need_sign_result = requests.post( check_is_need_sign_url, headers=header, cookies=clock_in_cookie, ).text check_is_need_sign_timeline = json.loads(check_is_need_sign_result)["timeline"] # 0代表不需要打卡 need_sign = 0 # sign_time 为空也代表不需要打卡 sign_time = "" if struct_time.tm_hour < 9: # 上午走第一个集合,上午卡 need_sign = check_is_need_sign_timeline[0]["needSign"] if "signTime" in check_is_need_sign_timeline[0]: sign_time = check_is_need_sign_timeline[0]["signTime"] print(f"上午打卡情况:---{need_sign} ----- {sign_time} --- {len(sign_time)}") else: # 下午走第二个集合,下午卡 need_sign = check_is_need_sign_timeline[1]["needSign"] if "signTime" in check_is_need_sign_timeline[1]: sign_time = check_is_need_sign_timeline[1]["signTime"] print(f"下午打卡情况:---{need_sign} ----- {sign_time} --- {len(sign_time)}") # 可以打卡 if need_sign == "1" and len(sign_time) == 0: needSign = True else: print("已经打卡,无需再打~!") sys.exit() # 检查是否已经打过卡,如果没有,则继续 if needSign: # 开始打卡,如果是下午,则休眠一下再打卡 if struct_time.tm_hour > 9: # 休眠 5分-15分 trusty_sleep(random.randint(300, 900)) print("OA开始打卡----->>>") # clock_in_cookie["__randcode__"] = # 刷新时间 struct_time = time.localtime(time.time()) sign_time = time.strftime("%H:%M:%S", struct_time) get_clock_in_data(struct_time) clock_in_url = "http://oa.njhgroup.cn/api/hrm/kq/attendanceButton/punchButton" print( "OA打卡结束----->>>", requests.post( clock_in_url, headers=header, data=get_clock_in_data(struct_time), cookies=clock_in_cookie, ).text, )