大家好,本期和大家分享一篇获取钉钉考勤数据的python代码~ 不少公司现在已经在使用钉钉来进行考勤了,官方也给出相应的API,本期和大家一起实现用python获取公司的考勤数据,主要参考了官方文档:
前期准备
我们首先要获取到钉钉账号的AppSecret和AppKey,这在我们的后台可以查看到,参考:
步骤
- 获取token
- 获取指定日期内进行打卡的员工
- 获取参与打卡的员工的详细打卡数据
import requests
import json
from datetime import datetime as dt
from datetime import timedelta
from collections import defaultdict
class DingTalk:
def __init__(self):
self.AppSecret = 'your appsecret'
self.AppKey = 'your appkey'
self.token_url = 'https://oapi.dingtalk.com/gettoken'
self.user_id_url = 'https://oapi.dingtalk.com/topapi/attendance/listschedule'
self.attendance_url = 'https://oapi.dingtalk.com/attendance/list'
self.user_name_url = 'https://oapi.dingtalk.com/topapi/v2/user/get'
self.token_params = "appkey=" + self.AppKey + "&appsecret=" + self.AppSecret
self.user_id_params = "access_token={token}&workDate={word_date}"
self.access_token = None
self.now = str(dt.strftime(dt.now(), '%Y-%m-%d %H:%M:%S'))
self.yesterday = dt.strftime(dt.now() - timedelta(days=1), '%Y-%m-%d %H:%M:%S')
def get_token(self):
"""
获取钉钉的token
:return:
"""
try:
response = requests.get(self.token_url, params=self.token_params)
self.access_token = json.loads(response.text).get('access_token')
except Exception as e:
print('获取token失败')
raise e
def get_user_id(self) -> list:
"""
获参与打卡的员工id
:return:
"""
user_id_params = self.user_id_params.format(token=self.access_token, word_date=self.yesterday)
response = requests.get(self.user_id_url, params=user_id_params)
user_id_json = json.loads(response.text)
user_id_list = list(set(list(map(lambda x: x.get("userid"), user_id_json.get('result').get('schedules')))))
return user_id_list
def get_attendance(self, user_id_list: list, user_info_json: dict):
"""
获取打卡时间
:param user_info_json:
:param user_id_list:
:return:
"""
offset = 0
flag = True
token_params = "access_token={token}".format(token=self.access_token)
attendance_all_list = []
while flag:
body = {
"workDateFrom": self.yesterday,
"workDateTo": self.now,
"userIdList": user_id_list,
"offset": offset,
"limit": 50
}
response = requests.post(self.attendance_url, params=token_params, json=body)
attendance_list = json.loads(response.text).get('recordresult')
for attendance_one in attendance_list:
attendance_one_list = [user_info_json.get(attendance_one.get('userId'))[0],
user_info_json.get(attendance_one.get('userId'))[1] if
user_info_json.get(attendance_one.get('userId'))[1] else '',
attendance_one.get('checkType'),
attendance_one.get('sourceType'),
dt.strftime(dt.fromtimestamp(int(attendance_one.get('userCheckTime')) / 1000),
'%Y-%m-%d %H:%M:%S')]
attendance_all_list.append(attendance_one_list)
if len(attendance_list) < 50:
flag = False
else:
offset = offset + 50
return attendance_all_list
def user_name(self, user_id_list):
"""
根据员工id获取员工的姓名,工号
:param user_id_list:
:return:
"""
token_params = "access_token={token}".format(token=self.access_token)
user_info_dict = defaultdict(list)
for user_id in user_id_list:
response = requests.post(self.user_name_url, params=token_params, json={
"language": "zh_CN",
"userid": user_id
})
user_name = json.loads(response.text).get('result').get('name')
job_number = json.loads(response.text).get('result').get('job_number')
user_info_dict.update({user_id: [user_name, job_number]})
return user_info_dict
def main():
dingding = DingTalk()
dingding.get_token()
# print(dingding.access_token)
user_id = dingding.get_user_id()
user_info = dingding.user_name(user_id)
attendance = dingding.get_attendance(user_id, user_info)
if __name__ == '__main__':
main()