有个特别恶心的地方就是打卡信息只能最多一次取七天的。所以要注意一下;  时间格式:2018-05-01

钉钉突然改接口了,直接获取是被拒绝了,加了分页限制,加了人数限制,头大,之前得方法不能用了,重新写了版,最多一次获取50个人的考勤,并且这些人的考勤记录一次只能获取50条,我想了个办法中心思想就是首先拆分公司人员的dingId的列表,拆成每50个一组,然后限制分页最大50个每页,50个人的打卡记录肯定大于最大限制,每次获取返回的考勤记录判断它给返回的hasMore是不是true是的话还将这50个人作为条件,偏移量加50,查询下一部分的考勤记录,如果是false则说明已经获取这50个人的全部数据,那么则将之后的50个人作为新的条件,继续以上判断,如果大家有更好的方法欢迎来留言,学习一下。环境是jdk 1.8,maven 3.5.4,tomcat 7.0.8

package ding;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import org.apache.http.HttpResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;public class DingRecordSyncController {private static String accessTokenUrl = "https://oapi.dingtalk.com/gettoken";//通用private static String corpId = "你公司自己的corpId,在钉钉管理员账号设置里面能看到";private static String corpSecret = "你公司自己的corpId,在钉钉管理员账号设置里面能看到";public static String getAccessToken() {Map<String,Object> map = new HashMap<>();map.put("corpid",corpId);map.put("corpsecret",corpSecret);return httpGetStringResult(accessTokenUrl, map);//获取access_token}public static String httpGetStringResult(String url,Map<String,Object> param){String content = null;CloseableHttpClient httpClient = HttpClients.createDefault();if(param != null && !param.isEmpty()){StringBuffer strparams = new StringBuffer();for (Map.Entry<String, Object> map : param.entrySet()) {strparams.append(map.getKey()).append("=").append(map.getValue().toString()).append("&");}strparams = strparams.deleteCharAt(strparams.length()-1);url = url + "?" + strparams;}HttpGet httpGet = new HttpGet(url);CloseableHttpResponse response = null;try {response = httpClient.execute(httpGet);HttpEntity entity = response.getEntity();content = EntityUtils.toString(entity,"UTF-8");} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if(null!=response){response.close();}} catch (IOException e) {e.printStackTrace();}}return content;}public static String doPost(String requestUrl,JSONObject json){HttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(requestUrl);post.setHeader("Content-Type", "application/json");post.addHeader("Authorization", "Basic YWRtaW46");String result = "";try {StringEntity s = new StringEntity(json.toString(), "utf-8");s.setContentEncoding(new BasicHeader("contentType","application/json"));post.setEntity(s);// 发送请求HttpResponse httpResponse = client.execute(post);// 获取响应输入流InputStream inStream = httpResponse.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));StringBuilder strber = new StringBuilder();String line = null;while ((line = reader.readLine()) != null)strber.append(line + "\n");inStream.close();result = strber.toString();System.out.println(result);if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {System.out.println("请求服务器成功,做相应处理");} else {System.out.println("请求服务端失败");}} catch (Exception e) {System.out.println("请求异常");throw new RuntimeException(e);}return result;}public static List<AttendanceQvo> getAttendances(List<AttendanceQvo> users, String workDateFrom, String workDateTo,String access_Token) {List list = Arrays.asList("121212121212121212","121212121212324345345","。。。自己公司的员工钉钉ID");int listSize=list.size();int toIndex = 50;for(int i = 0;i < list.size();i += 50){if(i+50 > listSize){        //作用为toIndex最后没有50条数据则剩余几条newList中就装几条toIndex = listSize-i;}List newList = list.subList(i,i + toIndex);Boolean hasMore = true;int offset = 0;//为了分页do{Map<String,Object> mapParam = new HashMap<>();mapParam.put("workDateFrom", workDateFrom);mapParam.put("workDateTo", workDateTo);mapParam.put("userIdList", newList);mapParam.put("offset", offset * 50);mapParam.put("limit", 50);String attendanceStr = getAttendance(mapParam, access_Token);JSONObject firstJson = JSONObject.parseObject(attendanceStr);hasMore = firstJson.getBoolean("hasMore");JSONArray recordFirst = firstJson.getJSONArray("recordresult");//当前部门下的userListfor(int j = 0;j < recordFirst.size(); j++) {JSONObject record = recordFirst.getJSONObject(j);AttendanceQvo attendanceQvo = new AttendanceQvo();attendanceQvo.setCheckType(record.getString("checkType"));attendanceQvo.setUserId(record.getString("userId"));attendanceQvo.setWorkDate(record.getLong("workDate"));attendanceQvo.setUserCheckTime(record.getLong("userCheckTime"));users.add(attendanceQvo);}if(hasMore) {//有下一页偏移量加一offset++;}} while (hasMore);}return users;}public static String getAttendance(Map<String, Object> map ,String access_token_str) {String dingDingAttendance = "https://oapi.dingtalk.com/attendance/list?access_token="+access_token_str;JSONObject jsonObject = new JSONObject();jsonObject.put("workDateFrom",map.get("workDateFrom"));jsonObject.put("workDateTo",map.get("workDateTo"));jsonObject.put("limit",map.get("limit"));jsonObject.put("offset",map.get("offset"));jsonObject.put("userIdList",map.get("userIdList"));return doPost(dingDingAttendance,jsonObject);//获取考勤记录}/* * @Description: -1是前一天, +1是后一天* @Date: 17:28 2018/5/29*/public static String getPreDayOrAfterDay(String current, int flag) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar calendar = Calendar.getInstance();//获取日历实例try {calendar.setTime(sdf.parse(current));} catch (ParseException e) {e.printStackTrace();}calendar.add(Calendar.DAY_OF_MONTH, flag);  //设置为前一天String yesterday = sdf.format(calendar.getTime());//获得前一天return yesterday;}public static void main(String[] args) {List<AttendanceQvo> users = new ArrayList<>();Date date = new Date();String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(date);String yesterday = getPreDayOrAfterDay(currentDate, -1);String workDateFrom = yesterday + " " + "06:00:00";String workDateTo = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);//当前时间String access_token_str = getAccessToken();//获取access_tokenJSONObject jsonStr = JSONObject.parseObject(access_token_str); //转json结构String access_Token = jsonStr.getString("access_token");//获取access_TokengetAttendances(users, workDateFrom,workDateTo, access_Token);//凌晨的System.out.println("获取从昨天六点到当前时间的打卡记录"+ Arrays.asList(users));}
}
accessTokenUrl  :  https://oapi.dingtalk.com/gettoken
 
@Data
public class AttendanceQvo implements Serializable{private String checkType;     //上下午private String userId;        //员工IDprivate long userCheckTime;//实际打卡时间private long workDate;      //工作日}

源码地址:源码地址。   需要源码的小伙伴请上此处下载

获取钉钉考勤机的打卡记录并且解析相关推荐

  1. java 接入门禁卡_javaweb项目获取大华门禁刷卡记录

    package com.dahua.module; import com.dahua.lib.NetSDKLib; import com.dahua.lib.ToolKits; import com. ...

  2. 华为OD机试真题 Java 实现【异常的打卡记录】【2023Q1 100分】

    一.题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据. 为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的收集打卡记录进行异常排查. 如果出现以下两 ...

  3. 钉钉API考勤打卡记录获取并存入数据库(python)

    前言: 钉钉有个开发平台,通过API可以开发自己企业内部应用,钉钉开发文档顺序写的有点乱,花了挺长时间才看懂,我写了一个python脚本来获取考勤记录,当然能做的不止这些,可以删除公司成员,修改部门, ...

  4. C#读取钉钉打卡记录(五)——获取打卡信息

    4. 获取打卡信息 访问地址:https://oapi.dingtalk.com/attendance/listRecord 参数:访问凭证.开始日期.结束日期.用户id列表 调用接口后,返回所有用户 ...

  5. 钉钉API考勤打卡记录获取(PHP + JS)

    前言: 钉钉有个开发平台,通过API可以开发自己企业内部应用,钉钉开发文档顺序写的有点乱,花了挺长时间才看懂,我建立一个php后端以及一个单独网页(不运行在钉钉上)来获取考勤记录,当然能做的不止这些, ...

  6. 【钉钉考勤打卡】--上传打卡记录

    有带毫秒的时间转时间戳请给我留言,我试了好多种还未成功! 一.钉钉2021年3月份新增了上传打卡记录的接口,这样就方便集成考勤系统.当然,也方便很多管理员"干坏事了"! 去网站上获 ...

  7. 赚四五百万,一款打卡作弊软件的 CEO 被判5年6个月!因破坏了钉钉系统获取用户真实地理位置...

    ‍ ‍上面这个公号,是我的一个备用号,平时我也会发一些很短.很生活的图片.文字,也会推荐看到的好书.节目.电影等. 1 发现商机 昨天看到这个案例,蛮唏嘘的,特别对于我们技术人创业来讲,也算是提了一个 ...

  8. .Net获取公司所有员工前一天钉钉考勤记录

    /// <summary>/// 部门数据返回及状态码/// </summary>public class DingDeptMessage{/// <summary> ...

  9. 钉钉企业内部应用 - 获取考勤打卡结果

    本文是根据钉钉官方文档归纳所出,最后有 PHP 测试成功的 demo. 概述 钉钉登录是基于 OAuth2.0 协议标准构建的钉钉 OAuth2.0 授权登录系统. 在进行钉钉 OAuth2.0 授权 ...

  10. C#读取钉钉打卡记录(一)——准备

    一. 前提条件 1.手机安装钉钉,并拥有管理者的权限. 2.打开浏览器,登录钉钉开发平台-钉钉管理后台,点击应用开发-企业内部开发,如图: 点击创建应用按钮,创建H5或小程序应用,创建成功后,就会自动 ...

最新文章

  1. ArrayList, LinkedList , Vector
  2. iphone开发之数据库CoreData
  3. 《流畅的Python》一副扑克牌中的难点
  4. 【转载】DL图片预处理
  5. jsp的<a>标签中怎么传递参数
  6. Pyqt5 多标签_ESL电子货架标签方案
  7. 远程登录另一个mysql 数据库_Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中...
  8. 折线图 放大_第二个折线图(Line Plot)的示例代码
  9. 使用 matlab 数字图像处理(五)—— 双线性插值(Bilinear Interpolation)
  10. ZOJ 3880 Demacia of the Ancients
  11. 软件测试工程师的职业技能分析
  12. 微信支付 django
  13. Android 扫描Scard卡所有的图片
  14. 汽车电子——常见的英文缩写(更新中)
  15. CL210管理存储--管理临时和持久存储+章节实验
  16. 云服务器ECS网卡多队列优化
  17. Alpine执行bash
  18. 一道3G门户的面试题
  19. QQ邮箱如何获得邮我代码
  20. Java使用luhn校验算法实现银行卡号合法性校验获取银行卡号所属银行

热门文章

  1. 如何新建一个css到html,新建一个css样式
  2. 论fastadmin里面token加密方式
  3. 散列(哈希)函数的python实现。
  4. 【力扣·每日一题】507. 完美数 (C++ 模拟 数的因子)
  5. 综述类论文怎么写引言和结语?
  6. TextStudio,调用CJK包不产生中文,以及Cannot find font gbk49 in map file的解决方案
  7. 计算机里电子 邮件格式,邮箱格式怎么写?
  8. 安卓手机root流程
  9. 计算机软件能删除吗,怎么彻底清除电脑软件鲁大师?卸载对系统有影响吗?
  10. maven报错:Failure to transfer xxx.jar from xxx was cached in the local repository.