python 读取钉钉考勤数据

之前通过python读取钉钉考勤数据,在网上查了很多资源,也有很多完整的代码,但实际运行情况并不好,所以这次把在网上踩得坑着重讲解一下

整体代码如下

# -*- coding: utf-8 -*-
import dingtalka.api
import pandas as pd
import  datetime as dt
import numpy as np
import pymysqldef getaccseetoken():request = dingtalka.api.OapiGettokenRequest("https://oapi.dingtalk.com/gettoken")request.appkey="appkey"request.appsecret="appsecret"f = request.getResponse()access_token = f['access_token']print(access_token)return access_tokendef get_userid_pro(access_token):user_dept=[] #获部门下所有的部门节点userid_name=[] #获取部门下所有人员id信息userid_id=[]request= dingtalka.api.OapiV2DepartmentListsubidRequest("https://oapi.dingtalk.com/topapi/v2/department/listsubid")request.dept_id='XXXXX'  #获取优先级最大的部门节点dept_idmain = request.getResponse(access_token) #获取到部门节点下所有部门节点userid = list(dept_idmain['result']['dept_id_list'])user_dept.extend(userid)for dept in userid:request.dept_id = deptdept_idmain = request.getResponse(access_token)userid = list(dept_idmain['result']['dept_id_list'])user_dept.extend(userid)  # 获取部门下所有的部门节点,后续根据该节点读取部门人员id信息while len(userid)!=0:for j in userid:request.dept_id = jdept_idmain1 = request.getResponse(access_token)userid1 = list(dept_idmain1['result']['dept_id_list'])user_dept.extend(userid1)userid=userid1req = dingtalka.api.OapiV2UserListRequest("https://oapi.dingtalk.com/topapi/v2/user/list")req.cursor = 0req.size = 30req.order_field = "entry_asc"req.contain_access_limit =Falsereq.language = "zh_CN"for i in user_dept:req.dept_id = ig = req.getResponse(access_token)for j in  g['result']['list']:value=(j["userid"],j["dept_id_list"][0],j["name"])value1=j["userid"]userid_name.append(value)userid_id.append(value1)return userid_name,userid_iddef get_attendence_listrecord(userid, access_token, day):# 获取打卡详情request = dingtalka.api.OapiAttendanceListRecordRequest('https://oapi.dingtalk.com/attendance/list')request.workDateFrom = str(dt.datetime.now() - day * dt.timedelta(days=1))request.workDateTo = str(dt.datetime.now())request.userIdList = useridrequest.offset = 0request.limit = 50f = request.getResponse(access_token)h = []h.append(f)while ('hasMore',True) in f.items(): #判断是否有更多数值request.offset = request.offset+request.limitf = request.getResponse(access_token)h.append(f)return hdef get_value(userid_in, access,days):l = []users = []if len(userid_in)>50:start = 0end = 49while end<len(userid_in):users.append(userid_in[start:end])start +=49end = start+50users.append(userid_in[start:end])else:users.append(userid_in[0:len(userid_in)])for userid_in_in in users:reponse = get_attendence_listrecord(userid_in_in, access, day=days)for i in range(len(reponse)):for respose in reponse[i]['recordresult']:if respose['sourceType'] != 'SYSTEM':value = (respose['userId'], respose['checkType'], str(dt.datetime.fromtimestamp(int(respose['userCheckTime']) / 1000)),respose['locationResult'])l.append(value)return ldb = pymysql.connect(host='IP位置',port=端口号,user='账号',password='密码',db='数据库名称',charset="utf8")
cursor = db.cursor()def insert_username(access_token):query = """insert ignore into api_test_user (userid, dept_id,name) values (%s,%s,%s)"""value = get_userid_pro(access_token)for record in value:cursor.execute(query, record)db.commit()def insert(userid, access_token,days):query = """insert ignore into api_test (userid, duty,time,type) values (%s,%s,%s,%s)"""value = get_value(userid, access_token,days)for record in value:cursor.execute(query, record)db.commit()if __name__ == '__main__':access_token=getaccseetoken()useridname,userid=get_userid_pro(access_token)days=4 #4天前到目前时间的打卡考勤,时间不能超过7天l = get_value(userid, access_token,days)insert(userid, access_token,days)

接下来进行步骤拆解

获取accsstoken

首先钉钉账号为钉钉管理员账号,从钉钉后台获取appkey和appsecret

def getaccseetoken():request = dingtalka.api.OapiGettokenRequest("https://oapi.dingtalk.com/gettoken")request.appkey="appkey"request.appsecret="appsecret"f = request.getResponse()access_token = f['access_token']print(access_token)return access_token

获取部门节点下userID

由于一次性只能读取到50条记录,所以要进行切片处理

def get_userid_pro(access_token):user_dept=[] #获部门下所有的部门节点userid_name=[] #获取部门下所有人员id信息userid_id=[]request= dingtalka.api.OapiV2DepartmentListsubidRequest("https://oapi.dingtalk.com/topapi/v2/department/listsubid")request.dept_id='XXXXX'  #获取优先级最大的部门节点dept_idmain = request.getResponse(access_token) #获取到部门节点下所有部门节点userid = list(dept_idmain['result']['dept_id_list'])user_dept.extend(userid)for dept in userid:request.dept_id = deptdept_idmain = request.getResponse(access_token)userid = list(dept_idmain['result']['dept_id_list'])user_dept.extend(userid)  # 获取部门下所有的部门节点,后续根据该节点读取部门人员id信息while len(userid)!=0:for j in userid:request.dept_id = jdept_idmain1 = request.getResponse(access_token)userid1 = list(dept_idmain1['result']['dept_id_list'])user_dept.extend(userid1)userid=userid1req = dingtalka.api.OapiV2UserListRequest("https://oapi.dingtalk.com/topapi/v2/user/list")req.cursor = 0req.size = 30req.order_field = "entry_asc"req.contain_access_limit =Falsereq.language = "zh_CN"for i in user_dept:req.dept_id = ig = req.getResponse(access_token)for j in  g['result']['list']:value=(j["userid"],j["dept_id_list"][0],j["name"])value1=j["userid"]userid_name.append(value)userid_id.append(value1)return userid_name,userid_id

获取打卡记录

def get_attendence_listrecord(userid, access_token, day):# 获取打卡详情request = dingtalka.api.OapiAttendanceListRecordRequest('https://oapi.dingtalk.com/attendance/list')request.workDateFrom = str(dt.datetime.now() - day * dt.timedelta(days=1))request.workDateTo = str(dt.datetime.now())request.userIdList = useridrequest.offset = 0request.limit = 50f = request.getResponse(access_token)h = []h.append(f)while ('hasMore',True) in f.items(): #判断是否有更多数值request.offset = request.offset+request.limitf = request.getResponse(access_token)h.append(f)return h
def get_value(userid_in, access,days):l = []users = []if len(userid_in)>50:start = 0end = 49while end<len(userid_in):users.append(userid_in[start:end])start +=49end = start+50users.append(userid_in[start:end])else:users.append(userid_in[0:len(userid_in)])for userid_in_in in users:reponse = get_attendence_listrecord(userid_in_in, access, day=days)for i in range(len(reponse)):for respose in reponse[i]['recordresult']:if respose['sourceType'] != 'SYSTEM':value = (respose['userId'], respose['checkType'], str(dt.datetime.fromtimestamp(int(respose['userCheckTime']) / 1000)),respose['locationResult'])l.append(value)return l

将读取的考勤数据存入数据库中

db = pymysql.connect(host='IP位置',port=端口号,user='账号',password='密码',db='数据库名称',charset="utf8")
cursor = db.cursor()def insert_username(access_token):query = """insert ignore into api_test_user (userid, dept_id,name) values (%s,%s,%s)"""value = get_userid_pro(access_token)for record in value:cursor.execute(query, record)db.commit()def insert(userid, access_token,days):query = """insert ignore into api_test (userid, duty,time,type) values (%s,%s,%s,%s)"""value = get_value(userid, access_token,days)for record in value:cursor.execute(query, record)db.commit()

结束

python读取钉钉考勤数据相关推荐

  1. python读取mysql中表内数据_Python读取MySQL表数据的方法介绍

    这篇文章主要为大家详细介绍了Python如何读取MySQL数据库表数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Python读取MySQL数据库表数据的具体代码,供大家参 ...

  2. python读取csv表格的数据并用matplotlib画曲线图

    前言 python读取csv表格的数据并用matplotlib回曲线图 1.导入相关库 import matplotlib.pyplot as plt import pandas as pd impo ...

  3. python读取mysql中的数据_Python笔记:用Python读取MySQL中的数据

    Python处理数据分析的优势,很多人都知道(可以实现更复杂.更灵活的操作,包括数据预处理.数据可视化输出等),但是加载到Python中的数据,只是临时存储在内存中的一张虚拟表(退出之后就会被释放掉了 ...

  4. python 显示表格数据_python显示excel表格数据-怎么用python读取excel表格的数据

    怎么用python读取excel表格的数据 #导入包 import xlrd #设置路径 path='C:\\Users\\jyjh\\Desktop\\datap.xlsx' #打开 data=xl ...

  5. python读取excel某列数据

    文章目录 一.python读取excel某列数据 二.将读取的数据变为浮点数 一.python读取excel某列数据 import xlrdworksheet = xlrd.open_workbook ...

  6. 使用python读取excel中的数据,并绘制折线图

    使用python读取excel中的数据,并绘制折线图 做实验的时候采集到一些数据,从文本拷贝到excel,然后从十六进制转换成十进制.图表是分析数据的有利工具,使用python绘制出的图表简明美观.所 ...

  7. python开发的程序中以电子表格显示数据_使用 Python 读取电子表格中的数据实例详解...

    Python 是最流行.功能最强大的编程语言之一.由于它是自由开源的,因此每个人都可以使用.大多数 Fedora 系统都已安装了该语言.Python 可用于多种任务,其中包括处理逗号分隔值(CSV)数 ...

  8. python如何读取excel数据-使用Python读取电子表格中的数据

    Python 是最流行.功能最强大的编程语言之一.由于它是自由开源的,因此每个人都可以使用.大多数 Fedora 系统都已安装了该语言.Python 可用于多种任务,其中包括处理逗号分隔值(CSV)数 ...

  9. python 读取csv_Python实现CSV数据的读取--两种方法实现

    原博文 2016-08-22 16:42 − 方法一: 方法二: ... 相关推荐 2019-12-08 09:48 − CSV csv文件格式是一种通用的电子表格和数据库导入导出格式.最近我调用RP ...

  10. 如何使用python读取modbus/TCP协议数据

    文章目录 前言 一.modbus_tk是什么? 二.modbus_tk的使用步骤 三.使用modscan测试 四.32位无符号短整型数据转为64位float数据 五.总结 前言 在做项目的时候,需要使 ...

最新文章

  1. Codeforces Round #331 (Div. 2) A. Wilbur and Swimming Pool 水题
  2. hdu 2059(dp)
  3. 成为更优秀的开发人员:第二步-知道你的核心竞争力
  4. python循环经典例题_python练习题:循环打印嵌套列表
  5. PHP array_map()
  6. 它来了!IntelliJ IDEA 2020.1 稳定版发布
  7. netmiko可以连接的设备有哪些_气体报警器可以联动哪些设备
  8. C6748和音频ADC连接时候的TDM以及I2S格式问题
  9. 批处理向FTP上传指定属性的文件 批处理增量备份的例子
  10. 欧姆龙rxd指令讲解_欧姆龙plc的指令-机电之家网PLC技术网
  11. GitHub 上 10 个顶级开源项目,从基础到源码统统帮你搞定
  12. 移动端高度兼容iPhoneX
  13. 2022 年第十二届 MathorCup 高校数学建模挑战赛思路
  14. eclipse官网下载收费 怎么办?
  15. requests 已过时,初探协程与异步 http 框架 httpx
  16. 2018年10月OKR初步规划
  17. 大学生对网络直播的看法
  18. vscode 新建cpp文件_vscode怎样新建项目和文件 值得收藏
  19. Revit二次开发——Ribbon菜单的创建以及各种不同的button(按钮)的代码总结
  20. Chrome64位安装包下载

热门文章

  1. WdatePicker 诱发 “无法打开站点,已终止操作”错误
  2. VMware虚拟机启动报错,无法执行64位操作
  3. GAN·生成对抗网络——札记2-读《生成式对抗网络 GAN 的研究进展与展望》
  4. c语言输入星期的首字母,10、实现中英文的转换,输入汉语星期几,输出该星期的英文名。可以用指针数组处理字符串。C语言...
  5. 利用matlab实现驻波仿真
  6. 应对微软黑屏的解决办法
  7. C语言第零次作业总结
  8. 64位处理器_计算机微处理器介绍
  9. 济南女子学院计算机专业有哪些,山东女子学院专业涵盖8个学科门类,今年普本计划招2580人...
  10. java多文件文件压缩加密下载