钉钉机器人实现打卡提醒定时任务
文章目錄
- 前言
- 一、需要準備什么?
- 二、使用步驟
- 1.開啟自定義群機器人
- 2.使用釘釘開放平臺的在線調試
- 三、代碼實現
- 1.引入第三方釘釘jar包
- 2.測試機器人發送信息是否成功
- 3.獲取部門用戶userid和name
- 4.通過在線調試平臺獲取報表的自定義列
- 5.獲取個人指定時間和批次的考勤數據
- 6.篩選出符合條件的數據
- 7.調用釘釘機器人發送信息的接口
- 8.開啟定時任務
- 4、實現效果
- 5、最終成果
- 6、存在的問題
- 7、代碼倉庫
- 總結
嘗試換一種風格寫文章,用別人優秀模板,慢慢形成自己的優雅寫作風格。
前言
我和小伙伴在這個假期在一個新場所學習,每天的考勤情況由釘釘打卡機進行統計。
一切看起來總是那么美好…
可是總有各種意外情況導致團隊的考勤結果比較糟,比如:打卡機信號不好,掃臉識別打卡統計不上,忘記打卡,中午不回宿舍休息然后就木得打卡各種情況,于是新一款釘釘機器人考勤統計提醒機器人就在構想中誕生了。
一、需要準備什么?
二、使用步驟
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/
總結
團隊中每一個人的表現都影響著整個團體,紀律的保持得益于每個人的努力,當遇到問題解決困難的地方時,不妨換一個思路,利用現有的資源讓大家樂于改善配合,其實忘記打卡往往相互提醒一句的事情,這個方法就是讓大家有條件相互提醒,開玩笑一句
總結
以上是生活随笔為你收集整理的钉钉机器人实现打卡提醒定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何撰写论文的研究现状
- 下一篇: Java课后题第十二章:12.18(添加