如何获取钉钉考勤机详细打卡记录信息?
- 内容介绍
- 文章标签
- 相关推荐
本文共计769个文字,预计阅读时间需要4分钟。
原文链接:https://blog.csdn.net/ccmedu/article/details/80667327
某些恶意地区会限制打卡信息,只能最多获取七天的。因此,请注意;
时间格式:2018-05-01突然改接口了,直接获取是被拒的。
原文链接:blog.csdn.net/ccmedu/article/details/80667327
有个特别恶心的地方就是打卡信息只能最多一次取七天的。所以要注意一下; 时间格式: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.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 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_token
JSONObject jsonStr = JSONObject.parseObject(access_token_str); //转json结构
String access_Token = jsonStr.getString("access_token");//获取access_Token
getAttendances(users, workDateFrom,workDateTo, access_Token);//凌晨的
System.out.println("获取从昨天六点到当前时间的打卡记录"+ Arrays.asList(users));
}
}
accessTokenUrl : oapi.dingtalk.com/gettoken
@Data
public class AttendanceQvo implements Serializable{
private String checkType; //上下午
private String userId; //员工ID
private long userCheckTime;//实际打卡时间
private long workDate; //工作日
}
本文共计769个文字,预计阅读时间需要4分钟。
原文链接:https://blog.csdn.net/ccmedu/article/details/80667327
某些恶意地区会限制打卡信息,只能最多获取七天的。因此,请注意;
时间格式:2018-05-01突然改接口了,直接获取是被拒的。
原文链接:blog.csdn.net/ccmedu/article/details/80667327
有个特别恶心的地方就是打卡信息只能最多一次取七天的。所以要注意一下; 时间格式: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.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 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_token
JSONObject jsonStr = JSONObject.parseObject(access_token_str); //转json结构
String access_Token = jsonStr.getString("access_token");//获取access_Token
getAttendances(users, workDateFrom,workDateTo, access_Token);//凌晨的
System.out.println("获取从昨天六点到当前时间的打卡记录"+ Arrays.asList(users));
}
}
accessTokenUrl : oapi.dingtalk.com/gettoken
@Data
public class AttendanceQvo implements Serializable{
private String checkType; //上下午
private String userId; //员工ID
private long userCheckTime;//实际打卡时间
private long workDate; //工作日
}

