钉钉机器人实现打卡提醒定时任务
文章目录
- 前言
- 一、需要准备什么?
- 二、使用步骤
- 1.开启自定义群机器人
- 2.使用钉钉开放平台的在线调试
- 三、代码实现
- 1.引入第三方钉钉jar包
- 2.测试机器人发送信息是否成功
- 3.获取部门用户userid和name
- 4.通过在线调试平台获取报表的自定义列
- 5.获取个人指定时间和批次的考勤数据
- 6.筛选出符合条件的数据
- 7.调用钉钉机器人发送信息的接口
- 8.开启定时任务
- 4、实现效果
- 5、最终成果
- 6、存在的问题
- 7、代码仓库
- 总结
尝试换一种风格写文章,用别人优秀模板,慢慢形成自己的优雅写作风格。
前言
我和小伙伴在这个假期在一个新场所学习,每天的考勤情况由钉钉打卡机进行统计。
一切看起来总是那么美好…
可是总有各种意外情况导致团队的考勤结果比较糟,比如:打卡机信号不好,扫脸识别打卡统计不上,忘记打卡,中午不回宿舍休息然后就木得打卡各种情况,于是新一款钉钉机器人考勤统计提醒机器人就在构想中诞生了。
一、需要准备什么?
- 开启自定义机器人的钉钉群
- 一个具体钉钉考勤报表统计权限的appkey和appsecret
- springboot,定时任务(我主要学习的是java,其他语言也可以,钉钉文档上十分全面)
- 最好配置redis
二、使用步骤
1.开启自定义群机器人
设置 --> 智能群助手 --> 添加机器人 --> 自定义(通过Webhook接入自定义服务)
安全设置的话可以看自己的需求,我这儿选择了加签
这儿的Webhook和加签密钥需要保存之后调用机器人发送信息的接口就是通过这两个参数
2.使用钉钉开放平台的在线调试
在线调试平台: 钉钉开放平台
这儿我们需要注意的几个接口请求:
1、获取企业内部应用的access_token
2、获取用户所在的分组群的部门用户详情 :
主要是获取userid和姓名,userid用来改用户考勤统计查询,姓名主要是向外展示,这儿为了避免频繁调用接口,优化筛选速度,使用的redis存储,只查询了一次。
3、考勤统计,获取报表列自定义,方便我们直接获取到某一个考勤数据。
4、获取报表列值
三、代码实现
1.引入第三方钉钉jar包
下载地址:https://developers.dingtalk.com/document/resourcedownload?pnamespace=app
2.测试机器人发送信息是否成功
我们可以自定义各种信息形式发送:查看详情
/*发送信息的接口*/void createSign(String msg) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException, ApiException {Long timestamp = System.currentTimeMillis();String secret = ding.getSecret();String stringToSign = timestamp + "\n" + secret;Mac mac = Mac.getInstance("HmacSHA256");mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
// System.out.println(sign);String url = "https://oapi.dingtalk.com/robot/send?access_token="+ ding.getToken() +"×tamp="+ timestamp +"&sign=" +sign;DingTalkClient client = new DefaultDingTalkClient(url);OapiRobotSendRequest request = new OapiRobotSendRequest();request.setMsgtype("text");OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();text.setContent(msg);request.setText(text);OapiRobotSendResponse response = client.execute(request);}
3.获取部门用户userid和name
// 初始化获取用户信息并存到redis中public void getDepUser(String accessToken) {// 调用获取部门用户详情的接口try {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/list");OapiV2UserListRequest req = new OapiV2UserListRequest();req.setDeptId(492458960L);req.setCursor(0L);req.setSize(100L); // 这是一个分页,因为我群人数也就50人所以就不多次处理了OapiV2UserListResponse rsp = client.execute(req, accessToken);System.out.println(rsp.getBody());redisUtils.set("userInfo",rsp.getBody(),-1);log.info("【userInfo】:{}",rsp.getBody());} catch (ApiException e) {e.printStackTrace();}}
4.通过在线调试平台获取报表的自定义列
5.获取个人指定时间和批次的考勤数据
// 考勤报表接口(个人信息)public String getColumnVal(String userid, String columnIdList, String fromDate,String token) {try {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();req.setUserid(userid);req.setColumnIdList(columnIdList);req.setFromDate(StringUtils.parseDateTime(fromDate));req.setToDate(StringUtils.parseDateTime(fromDate));OapiAttendanceGetcolumnvalResponse rsp = client.execute(req, token);
// System.out.println(rsp.getBody());log.info(rsp.getBody());JSONObject jsonObject = JSON.parseObject(rsp.getBody());JSONObject jsonObject1 = JSON.parseObject(jsonObject.get("result").toString());JSONArray jsonObject2 = JSON.parseArray(jsonObject1.get("column_vals").toString());JSONObject jsonObject3 = JSON.parseObject(jsonObject2.get(0).toString());JSONArray jsonObject4 = JSON.parseArray(jsonObject3.get("column_vals").toString());JSONObject jsonObject5 = JSON.parseObject(jsonObject4.get(0).toString());
// System.out.println(jsonObject1);
// System.out.println(jsonObject5.get("value"));return jsonObject5.get("value").toString();} catch (ApiException e) {e.printStackTrace();return null;}}
6.筛选出符合条件的数据
@Overridepublic List<CardStatus> getDepUserListUpdate() {// token过期的话获取tokenif (!redisUtils.hasKey("token")) accessToken.getAccessToken();// 如果redis中没有用户信息,则获取用户信息if (!redisUtils.hasKey("userInfo")) getDepUser(redisUtils.get("token").toString());List<CardStatus> userUpdate = getUserUpdate();System.out.println(userUpdate.toString());List<CardStatus> cardStatuses = new ArrayList<>();for (CardStatus cardStatus : userUpdate) {if (!cardStatus.getStatus().equals("正常")) {cardStatuses.add(cardStatus);}}return cardStatuses;}
7.调用钉钉机器人发送信息的接口
8.开启定时任务
@Scheduled(cron="0 55 07 * * ?") // 每天7点55分执行一次@Scheduled(cron="0 05 08 * * ?") // 同上类似@Scheduled(cron="0 55 13 * * ?")@Scheduled(cron="0 05 14 * * ?")@Scheduled(cron="0 55 19 * * ?")@Scheduled(cron="0 05 20 * * ?")
4、实现效果
5、最终成果
胜利
6、存在的问题
1、没有关联请假的数据(自定义获取到的报表列中有,娱乐时间写来玩的,就没有太严格)
2、周日freetime空闲时间没有考虑(数据筛选可以多加层空判断或者改变定时任务的执行)
7、代码仓库
gitee地址:https://gitee.com/mfei8/dingding/tree/develop/
总结
团队中每一个人的表现都影响着整个团体,纪律的保持得益于每个人的努力,当遇到问题解决困难的地方时,不妨换一个思路,利用现有的资源让大家乐于改善配合,其实忘记打卡往往相互提醒一句的事情,这个方法就是让大家有条件相互提醒,开玩笑一句
钉钉机器人实现打卡提醒定时任务相关推荐
- 易班自动打卡+钉钉机器人消息提醒
(一)声明 本文仅供学习交流使用,如有发热.感冒.咳嗽请及时根据当地疫情防控办法及时上报 (二)需求 首先,我双手支持和配合学校相关疫情防控政策. 其次,每天重复劳动让我们软件专业情何以堪.说干就干, ...
- python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}
相关文章和数据源: python自动化高效办公第二期,带你项目实战[一]{excel数据处理.批量化生成word模板.pdf和ppt等自动化操作} Python自动化办公--Pandas玩转Excel ...
- 利用python编写钉钉机器人工作日提醒
1.需求说明 需要在工作日向部门钉钉群发送特定信息,本次是每日待办任务更新,同时有明天地区的天气预报以及打工寄语 2.获取钉钉机器人 在项目群中获取钉钉机器人, 主要是获取Webhook值,通过Web ...
- 监测网页内容变化,推送钉钉机器人提醒
钉钉群提供自定义机器人接口,可以调用该接口向群内发送消息. 1.这里以电脑版钉钉为例,首先打开钉钉软件,创建一个新的聊天群. 2.打开钉钉群管理菜单,添加一个自定义机器人. 3.给群机器人设定一个名字 ...
- linux 硬件告警信息,shell 操作钉钉机器人实现告警提醒
我们知道,之前的运维告警多通过mail 等方式通知到相应的人员,难以实现随时随地的查看.随着手机app的发展,很多告警开始发送到im软件上去.目前比较常用的是发送到微信和钉钉上,今天我们将重点放在钉钉 ...
- 配置 Hi提醒 让直播提醒机器人消息在主播开播自动推送消息到钉钉群
今天我们来配置Hi提醒 实现指定主播开播时推送直播提醒消息到钉钉群 主要实现是创建好钉钉群机器人,然后推送信息时选择钉钉就行了. 该通道配置完成后可推送信息至你的钉钉群中,一次配置持久使用. 直接看操 ...
- 钉钉机器人智能提醒_如何设置钉钉群通知
## 一.功能说明: 独创通过**钉钉群**或**企业微信群**实时通知 1.通知软件异常状态,如:微信掉线,联盟离线,授权过期等 2.手动提现审核通知(提现走手动,每一笔都会自动通知管理员) 3.自 ...
- 【测试团队管理】Node版钉钉飞书机器人提醒团队成员每日缺陷状态
一.场景 日常一般会通过jira bug面板筛选条件筛选出bug,如:经办人.状态.标签等,但这需要人为主动去筛选搜索,如果有一个定时每日钉钉群.飞书群提醒每个人截止当日bug情况就比较直观,对测试团 ...
- python钉钉自动打卡_用Python来实现钉钉自动打卡并发送邮件短信提醒
用Python来实现钉钉自动打卡并发送邮件短信提醒 自从用钉钉打卡,老忘记打,只会python语言,所以用Python写了一个自动跑的脚本,每天定时跑.这样就避免忘记了. 之后把adb.exe所在的文 ...
最新文章
- 多分类 数据不平衡的处理 lightgbm
- 解惑:学.Net还是学Java?
- Kmeans++、Mini-Batch Kmeans、Bisecting Kmeans、K中心点(K-Medoids)算法、K众数聚类、核K均值聚类
- 人机智能既不是人类智能,也不是人工智能
- quake3使用指南(转载)
- 增强使用功能的Steam开源工具箱一枚
- php cookie expires,php cookie类(设置、获取、删除cookie值)
- Android之 如何解决ScrollView 和ListView滑动冲突的问题如何解决ScrollView can host only one direct child
- 当我们谈AI时,到底该谈什么?
- docker内存阀值_kubernetes调度之资源耗尽处理配置
- SQL Server中的空间SQL数据类型
- DIY斑竹管理初稿的确定
- Script的加载方法小结
- 10. Browser 对象 - Location 对象(2)
- windows 查看ttf字体
- python经济统计学论文_Python商务与经济统计学-1
- 无限联盟服务器,无限乱斗正式上线,全服服务器被网友挤爆!LOL重回巅峰状态!...
- HDFS的StartupProgress启动跟踪分析
- CentOS官网 安装包下载
- ArcGIS小知识(八)——坡降、流动方向、剖面线、弯曲系数、河系密度、补给长度比