# -*- coding: utf-8 -*-
import requests, logging, json, openpyxl, os, time
#官方下载SDK
import dingtalk.api
from datetime import datetime as dt
from datetime import timedelta
import xlsxwriter
import configparser
import datetimelogging.basicConfig(level=logging.DEBUG,format='%(asctime)s  line:%(lineno)d  %(levelname)s : %(message)s',datefmt=' %Y-%m-%d %H:%M:%S',filename=os.path.join(os.getcwd(), 'dingInfos2.log'),filemode='a')data_time = str(dt.now())
last_time = str(datetime.date.today() + datetime.timedelta(-1)) + ' 00:00:00'
last_time1 = str(datetime.date.today() + datetime.timedelta(-1)) + ' 24:00:00'
time1 = dt.now().strftime('%Y-%m-%d') + ' 11:00:00'
time2 = dt.now().strftime('%Y-%m-%d') + ' 09:00:00'
config = configparser.ConfigParser()
config.read(os.path.join(os.getcwd(), "config.ini"), "UTF-8")class Dingding():def __init__(self):self.appkey = config['***']['AppKey']self.appsecret = config['***']['AppSecret']self.access_token = self.getToken()self.userids = self.get_userid()def getToken(self):url = 'https://oapi.dingtalk.com/gettoken?appkey=' + self.appkey + '&appsecret=' + self.appsecretresponse = requests.get(url=url)result = response.json()try:access_token = result['access_token']logging.info('获取密钥成功')except Exception as e:errmsg = result['errmsg']logging.info(e, '\n', errmsg)access_token = ''return access_token#先获取所有IDdef get_userid(self):userids = []request = dingtalk.api.OapiSmartworkHrmEmployeeQueryonjobRequest("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob")request.status_list = "2,3,5,-1"request.offset = 0request.size = 50result = request.getResponse(self.access_token)userids.extend(result["result"]["data_list"])while "next_cursor" in result["result"]:request.offset = request.offset + request.sizeresult = request.getResponse(self.access_token)if result['errcode'] == 9006 or result['errcode'] == 9005:time.sleep(60)result = request.getResponse(self.access_token)userids.extend(result["result"]["data_list"])elif result['errcode'] == 90018:time.sleep(1)result = request.getResponse(self.access_token)userids.extend(result["result"]["data_list"])else:passuserids.extend(result['result']['data_list'])logging.info(userids)logging.info('获取部门userids成功')return userids#目前钉钉只支持从部门查取对应的工号def get_jobnum(self):uid_jnum = {}  # {"员工ID":"员工工号"}userids = self.useridsrequest = dingtalk.api.OapiUserGetDeptMemberRequest("https://oapi.dingtalk.com/user/get")request2 = dingtalk.api.OapiSmartworkHrmEmployeeListRequest("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/list")for uid in userids:try:request.userid = uidf = request.getResponse(self.access_token)if f['errcode'] == 9006 or f['errcode'] == 9005:time.sleep(60)f = request.getResponse(self.access_token)elif f['errcode'] == 90018:time.sleep(1)f = request.getResponse(self.access_token)else:passif 'jobnumber' in f:uid_jnum[f['userid']] = f['jobnumber']except :print(uid)request2.userid_list = uidtry:resp = request2.getResponse(self.access_token)print(resp)except Exception as e:logging.info("花名册获取请求报错:", e)if "result" in resp:if resp["result"][0]["field_list"]:for item in resp["result"][0]["field_list"]:try:if "field_name" in item:if item["field_name"] == "工号":uid_jnum[uid] = item["value"]except Exception as e:logging.info("获取姓名、工号报错:", e)logging.info('员工ID与工号对照字典已生成')return uid_jnum#获取打卡信息def get_attendence_listrecord(self, userids):day = 0request = dingtalk.api.OapiAttendanceListRecordRequest('https://oapi.dingtalk.com/attendance/list')if data_time < time2:request.workDateFrom = last_timerequest.workDateTo = last_time1else:request.workDateFrom = data_timerequest.workDateTo = data_timerequest.workDateTo = str(dt.now())request.userIdList = useridsrequest.offset = 0request.limit = 50f = request.getResponse(self.access_token)h = []h.append(f)while ('hasMore', True) in f.items():request.offset = request.offset + request.limit# request.limit += 49f = request.getResponse(self.access_token)h.append(f)return hdef get_value(self):TY = []uid_jnum = self.get_jobnum()userid_in = self.useridsusers = []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])print(users)for userid_in_in in users:reponse_all = self.get_attendence_listrecord(userid_in_in)if reponse_all[0]['errmsg'] != 'ok':reponse_all = self.get_attendence_listrecord(userid_in_in)for respose in reponse_all:try:for respose in respose['recordresult']:if respose['sourceType'] != 'SYSTEM':if uid_jnum[respose['userId']]:str_time = str(dt.fromtimestamp(int(respose['userCheckTime']) / 1000)).split(' ')value = (uid_jnum[respose['userId']], str_time[0], str_time[1])TY.append(value)except Exception as e:logging.info(e)logging.info('获取部门所有考勤结果成功')return list(set(TY))kq_ding = Dingding()
daka_result = kq_ding.get_value()shr_excel = os.path.join(os.getcwd(), 'dingdingData2.xlsx')
test_book = xlsxwriter.Workbook(shr_excel)
worksheet = test_book.add_worksheet(u'打卡记录导入')
row = 4
col = 0
worksheet.write(0, 0, u'实体名称')
worksheet.write(0, 1, u'原始打卡记录实体')
worksheet.write(1, 0, u'实体表')
worksheet.write(1, 1, 'T_HR_ATS_PunchCardRecord')
worksheet.write(2, 0, u'描述')
worksheet.write(2, 1, u'原始打卡记录实体')
worksheet.write(3, 0, u'考勤编号')
worksheet.write(3, 1, u'打卡日期')
worksheet.write(3, 2, u'打卡时间')
worksheet.write(3, 3, u'打卡位置')
for item in daka_result:if item[2] < '10:00:00':worksheet.write(row, col, item[0])worksheet.write(row, col+1, item[1])worksheet.write(row, col+2, item[2])row += 1else:if item[2] > '10:00:00':worksheet.write(row, col, item[0])worksheet.write(row, col+1, item[1])worksheet.write(row, col+2, item[2])row += 1
test_book.close()
logging.info('打卡记录已经写入完成')

从钉钉后台对接考勤打卡信息(仅供参考)相关推荐

  1. 西米支付:数字藏品支付通道,数字藏品对接支付接口相关知识(供参考)

    自2021年年末开始,数字藏品在我国持续火爆,数藏交易平台的数量已经达到500多家,而且还在以惊人的速度快速增多,剧测算,2026年我国数字藏品市场规模将达300亿元,众多互联网公司纷纷入局. 而构建 ...

  2. java后台监听器导出 后期还需优化仅供自己适用

    需求说明:公司要导出大量数据 平均在30w~100w左右,这个时候前台导入会超时在加上sql性能 这个时候可以用到后台导出,流程为 利用java监听器监听前端请求然后后端慢慢导入到exelce表格中, ...

  3. 钉钉怎么设置考勤打卡规则

    1.首先在电脑上登陆钉钉后台,然后点击如图所示的钉钉考勤打卡 钉钉后怎么设置考勤打卡规则? 2.比如一个公司生产型企业 互联网部门上班时间是 周一到周五上班时间 8:30-5:30 周六上班 8:30 ...

  4. 钉钉考勤与企业系统对接

    公司最近企业系统要与钉钉考勤打卡数据对接,所以需要拿到钉钉上月员工的考勤打卡数据.配置了spring定时任务,任务类步骤如下: 引入钉钉相关JAR包 一:获得tooken 1.需要公司钉钉管理员给开发 ...

  5. Java对接钉钉开发第三方H5微应用详细教程

    文章转载自:钉钉开发第三方H5微应用入门详细教程[ISV][免登流程][授权码][HTTP回调推送][识别用户身份][获取用户信息] - 世间草木 - 博客园 (by lnexin@aliyun.co ...

  6. 钉钉运用php技术流程图,钉钉操作流程图

    <钉钉操作流程图>由会员分享,可在线阅读,更多相关<钉钉操作流程图(17页珍藏版)>请在人人文库网上搜索. 1.钉钉操作流程范围,人事行政,目录,01,02,03,04,人员电 ...

  7. 钉钉开发第三方H5微应用入门详细教程[ISV][免登流程][授权码][HTTP回调推送][识别用户身份][获取用户信息]...

    转载请注明原文地址:https://www.cnblogs.com/applerosa/p/11509512.html (by lnexin@aliyun.com 世间草木) 此教程注意点: 适用于第 ...

  8. 钉钉通知-调用钉钉发送企业内部消息开发

    首先,我们要明确需求:自己的系统需要发送通知消息到用户,接收消息用户为同一企业内的人员,选用短信可能涉及到费用问题,故可以选用钉钉或者企业微信,在此我使用钉钉进行发送消息. 调用钉钉发送企业内部消息: ...

  9. MEM/MBA 复试准备(07)远程面试准备-钉钉

    特殊说明:本文主要以苹果手机和苹果电脑为例进行说明和解读,对于android和windows电脑的伙伴 主要是供参考,流程与步骤类似. 1 复试注意事项 第二机位(在考生背面拍摄的设 备)必须关闭该设 ...

最新文章

  1. failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
  2. linux查看服务器设备信息命令dmidecode
  3. 每日一博 - 使用环形队列实现高效的延时消息
  4. POJ 1577 Falling Leaves (子母二叉树,给出叶子节点的删除序列,求前序遍历)
  5. js,jquery获取页面元素距离浏览器工作区顶端的距离
  6. Windows8.1系统下让VS2012编译运行IIS Express 64位 调试器
  7. 哈希表及哈希冲突解决办法
  8. C语言 | 语句概述
  9. TCP的流模式与UDP的报文模式对比
  10. python拆开tuple为多个值传入函数(tuple拆包)
  11. html中灰色怎么写,css如何实现置灰不可点
  12. Java中类与对象的定义与使用
  13. 【PTA】7-9 句子首字母变大写(python)
  14. linux 删除用户 currently logged in,userdel删除用户失败提示:userdel: user * is currently logged in 解决方法...
  15. 无法启动计算机丢失xinput1,电脑丢失xinput13.dll怎么办?计算机丢失XINPUT1_3.dll解决办法...
  16. 我的世界Faithful Java_我的世界:原来我们都被骗了,这才Minecraft真实的样貌
  17. 北风设计模式课程---里氏代换原则
  18. 携程并了去哪儿,互联网业7:2:1法则几成定律
  19. Python|判断闰年与平年
  20. 【买卖股票的最佳时机】

热门文章

  1. 基础图像处理 python+opencv
  2. 恐龙为何不发明计算机,为什么恐龙没有产生智慧文明,而人类文明反而如此发达?...
  3. FLASH烧写(简单概括)
  4. 离散实验一 油管铺设 (求最小生成树的Prim算法的实际应用)
  5. 如何为豆瓣FM写一个chrome的歌词插件
  6. 非科班基础知识三座大山:网络,操作系统,数据库
  7. Python编写一个函数,计算一个整数各个数字之和
  8. PayPal支付集成到自己Web网站
  9. 由浅入深配置webpack4
  10. python程序设计,猜数游戏编程实践课程实验