钉钉机器人实现打卡提醒定时任务
文章目錄
- 前言
- 一、需要準(zhǔn)備什么?
- 二、使用步驟
- 1.開啟自定義群機(jī)器人
- 2.使用釘釘開放平臺(tái)的在線調(diào)試
- 三、代碼實(shí)現(xiàn)
- 1.引入第三方釘釘jar包
- 2.測試機(jī)器人發(fā)送信息是否成功
- 3.獲取部門用戶userid和name
- 4.通過在線調(diào)試平臺(tái)獲取報(bào)表的自定義列
- 5.獲取個(gè)人指定時(shí)間和批次的考勤數(shù)據(jù)
- 6.篩選出符合條件的數(shù)據(jù)
- 7.調(diào)用釘釘機(jī)器人發(fā)送信息的接口
- 8.開啟定時(shí)任務(wù)
- 4、實(shí)現(xiàn)效果
- 5、最終成果
- 6、存在的問題
- 7、代碼倉庫
- 總結(jié)
嘗試換一種風(fēng)格寫文章,用別人優(yōu)秀模板,慢慢形成自己的優(yōu)雅寫作風(fēng)格。
前言
我和小伙伴在這個(gè)假期在一個(gè)新場所學(xué)習(xí),每天的考勤情況由釘釘打卡機(jī)進(jìn)行統(tǒng)計(jì)。
一切看起來總是那么美好…
可是總有各種意外情況導(dǎo)致團(tuán)隊(duì)的考勤結(jié)果比較糟,比如:打卡機(jī)信號(hào)不好,掃臉識(shí)別打卡統(tǒng)計(jì)不上,忘記打卡,中午不回宿舍休息然后就木得打卡各種情況,于是新一款釘釘機(jī)器人考勤統(tǒng)計(jì)提醒機(jī)器人就在構(gòu)想中誕生了。
一、需要準(zhǔn)備什么?
二、使用步驟
1.開啟自定義群機(jī)器人
設(shè)置 --> 智能群助手 --> 添加機(jī)器人 --> 自定義(通過Webhook接入自定義服務(wù))
安全設(shè)置的話可以看自己的需求,我這兒選擇了加簽
這兒的Webhook和加簽密鑰需要保存之后調(diào)用機(jī)器人發(fā)送信息的接口就是通過這兩個(gè)參數(shù)
2.使用釘釘開放平臺(tái)的在線調(diào)試
在線調(diào)試平臺(tái): 釘釘開放平臺(tái)
這兒我們需要注意的幾個(gè)接口請(qǐng)求:
1、獲取企業(yè)內(nèi)部應(yīng)用的access_token
2、獲取用戶所在的分組群的部門用戶詳情 :
主要是獲取userid和姓名,userid用來改用戶考勤統(tǒng)計(jì)查詢,姓名主要是向外展示,這兒為了避免頻繁調(diào)用接口,優(yōu)化篩選速度,使用的redis存儲(chǔ),只查詢了一次。
3、考勤統(tǒng)計(jì),獲取報(bào)表列自定義,方便我們直接獲取到某一個(gè)考勤數(shù)據(jù)。
4、獲取報(bào)表列值
三、代碼實(shí)現(xiàn)
1.引入第三方釘釘jar包
下載地址:https://developers.dingtalk.com/document/resourcedownload?pnamespace=app
2.測試機(jī)器人發(fā)送信息是否成功
我們可以自定義各種信息形式發(fā)送:查看詳情
/*發(fā)送信息的接口*/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) {// 調(diào)用獲取部門用戶詳情的接口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); // 這是一個(gè)分頁,因?yàn)槲胰喝藬?shù)也就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.通過在線調(diào)試平臺(tái)獲取報(bào)表的自定義列
5.獲取個(gè)人指定時(shí)間和批次的考勤數(shù)據(jù)
// 考勤報(bào)表接口(個(gè)人信息)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.篩選出符合條件的數(shù)據(jù)
@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.調(diào)用釘釘機(jī)器人發(fā)送信息的接口
8.開啟定時(shí)任務(wù)
@Scheduled(cron="0 55 07 * * ?") // 每天7點(diǎn)55分執(zhí)行一次@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、實(shí)現(xiàn)效果
5、最終成果
勝利
6、存在的問題
1、沒有關(guān)聯(lián)請(qǐng)假的數(shù)據(jù)(自定義獲取到的報(bào)表列中有,娛樂時(shí)間寫來玩的,就沒有太嚴(yán)格)
2、周日freetime空閑時(shí)間沒有考慮(數(shù)據(jù)篩選可以多加層空判斷或者改變定時(shí)任務(wù)的執(zhí)行)
7、代碼倉庫
gitee地址:https://gitee.com/mfei8/dingding/tree/develop/
總結(jié)
團(tuán)隊(duì)中每一個(gè)人的表現(xiàn)都影響著整個(gè)團(tuán)體,紀(jì)律的保持得益于每個(gè)人的努力,當(dāng)遇到問題解決困難的地方時(shí),不妨換一個(gè)思路,利用現(xiàn)有的資源讓大家樂于改善配合,其實(shí)忘記打卡往往相互提醒一句的事情,這個(gè)方法就是讓大家有條件相互提醒,開玩笑一句
總結(jié)
以上是生活随笔為你收集整理的钉钉机器人实现打卡提醒定时任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何撰写论文的研究现状
- 下一篇: 第三次比赛 感想