249 lines
8.0 KiB
Python
249 lines
8.0 KiB
Python
|
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,
|
|||
|
)
|