利用 Python 获取钉钉的考勤数据

1,105 阅读1分钟

大家好,本期和大家分享一篇获取钉钉考勤数据的python代码~ 不少公司现在已经在使用钉钉来进行考勤了,官方也给出相应的API,本期和大家一起实现用python获取公司的考勤数据,主要参考了官方文档:

editor.mdnice.com/?outId=8bf3…

前期准备

我们首先要获取到钉钉账号的AppSecret和AppKey,这在我们的后台可以查看到,参考:

open.dingtalk.com/document/or…

步骤

  1. 获取token
  2. 获取指定日期内进行打卡的员工
  3. 获取参与打卡的员工的详细打卡数据

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'))[1if
                                       user_info_json.get(attendance_one.get('userId'))[1else '',
                                       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()