日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

瀏覽:141日期:2022-06-18 11:52:36

零、前言

上一次做消息推送,是微信公眾號的定時消息通知。由于自己當(dāng)時的水平不夠,加上企鵝家的開發(fā)文檔普遍不太友好,導(dǎo)致根本看不懂文檔在寫什么,不得不去看第三方博客來學(xué)習(xí)公眾號的開發(fā)。這次就不一樣了,昨天剛看了一下,阿里的開發(fā)文檔比鵝廠要清晰的多,而且在同一功能上,使用了多種語言作為示例代碼,可以說很友好了。可能這就是阿里和鵝廠的區(qū)別吧...辣雞文檔和好文檔的區(qū)別...本著“授之以漁”的態(tài)度,寫了這篇文章,作為官方文檔的補(bǔ)充。

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

一、在群里添加機(jī)器人

在群設(shè)置的智能群助手中添加自定義機(jī)器人,它長這個樣子:

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

比較關(guān)鍵的一步,是進(jìn)行安全設(shè)置。加密方式一共有三種,既可以選擇一種也可以使用多種方式組合:

自定義關(guān)鍵詞 加簽 IP地址

各種加密方式的介紹,詳見官網(wǎng):https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

為了讓博客起到效果,我們選擇相對安全、也比較難的加簽方式。選擇加簽之后,把密鑰復(fù)制出來,然后就可以點(diǎn)確定了。

二、構(gòu)建請求地址和內(nèi)容

先看看官方文檔怎么描述加簽的:

第一步,把timestamp+'n'+密鑰當(dāng)做簽名字符串,使用HmacSHA256算法計(jì)算簽名,然后進(jìn)行Base64 encode,最后再把簽名參數(shù)再進(jìn)行urlEncode,得到最終的簽名(需要使用UTF-8字符集)。第二步,把 timestamp和第一步得到的簽名值拼接到URL中。

官方的解釋很高大上,其實(shí)原理很簡單,就是把機(jī)器人密鑰加密后,放在URL的參數(shù)中,所以我們需要分別獲取時間戳和密鑰,組合一下,加密一下,再拼接一下就好了,如圖:

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

I have a Pen, I have an Apple,Oh~ Applepen~

官方給出了這樣的示例代碼:

import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;import java.net.URLEncoder;public class Test { public static void main(String[] args) throws Exception { Long timestamp = System.currentTimeMillis(); String secret = 'this is secret'; 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); }}

然而,org.apache.commons.codec.binary.Base64不是Java的內(nèi)置類,也就是說,示例代碼并不能直接拿過來用:

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

查了一下,發(fā)現(xiàn)Java8中內(nèi)置的java.util已經(jīng)包含了Base64,因此用它替換掉原來的codec,無需再引入第三方包:

import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;import java.net.URLEncoder;public class ding { public static void main(String[] args) throws Exception { //獲取時間戳 Long timestamp = System.currentTimeMillis(); //定義密鑰 String secret = 'this is secret'; //把時間戳和密鑰拼接成字符串,中間加入一個換行符 String stringToSign = timestamp + 'n' + secret; //聲明一個Mac對象,用來操作字符串 Mac mac = Mac.getInstance('HmacSHA256'); //初始化Mac對象,設(shè)置Mac對象操作的字符串是UTF-8類型,加密方式是SHA256 mac.init(new SecretKeySpec(secret.getBytes('UTF-8'), 'HmacSHA256')); //把字符串轉(zhuǎn)化成字節(jié)形式 byte[] signData = mac.doFinal(stringToSign.getBytes('UTF-8')); //新建一個Base64編碼對象 Base64.Encoder encoder = Base64.getEncoder(); //把上面的字符串進(jìn)行Base64加密后再進(jìn)行URL編碼 String sign = URLEncoder.encode(new String(encoder.encodeToString(signData)),'UTF-8'); //分別輸出時間戳和加密信息 System.out.println(timestamp); System.out.println(sign); }}

用最笨的方法,在終端執(zhí)行一下看看:

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

成功輸出了時間戳和驗(yàn)證信息。

我們測試上述代碼的時候,可以手動拼接URL,直接發(fā)起請求:(URL一共有三個參數(shù):access_token、timestamp、sign,需要換成自己的,也就是上面終端輸出的結(jié)果)

//替換參數(shù)后,在終端執(zhí)行curl ’https://oapi.dingtalk.com/robot/send?access_token=70c168d03e73728ef36abea63c3c10048cbd054913cfeb&timestamp=1584607421017&sign=gJ3l4mhnlMuHxK1qFUx1kKUSdjuCNntsdG%2Bv%2BTCrLQM%3D’ -H ’Content-Type: application/json’ -d ’{'msgtype': 'text', 'text': { 'content': '我就是我, 是不一樣的煙火' }, 'sign': 'gJ3l4mhnlMuHxK1qFUx1kKUSdjuCNntsdG%2Bv%2BTCrLQM%3D' }’

然后就出現(xiàn)了:

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

經(jīng)過測試,代碼正常運(yùn)行,接下來就是部署到生產(chǎn)環(huán)境了。

三、部署代碼

我們需要先找一下Spring如何發(fā)起HTTP請求。

以前,筆者只用過前臺的HttpClient,對于后臺的HTTP工具并不了解。

一開始嘗試用Spring內(nèi)置的RestTemplate,去網(wǎng)上查了它的用法,寫了一堆代碼,但怎么也不成功。由于從來沒用過RestTemplate,也沒耐心去看它的源碼,于是放棄。

后來,只能老老實(shí)實(shí)的用apache的httpClient,查了一下用法,雖然有點(diǎn)麻煩,很多操作沒法自動完成,但還算通俗易懂,而且它的包托管在Maven上,導(dǎo)入很方便。

<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.9</version></dependency>

httpClient的使用很靈活,這里使用的是POST方式,有一個參數(shù),發(fā)起POST請求時,必須將字符集編碼設(shè)置成UTF-8。

粗略步驟如圖:

SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

直接來一段稍微改一下就能用的代碼:

public class DingService { //請求地址以及access_token String Webhook = 'https://oapi.dingtalk.com/robot/send?access_token=YOUR TOKEN'; //密鑰 String secret = 'YOUR SECRET'; /* ** 生成時間戳和驗(yàn)證信息 */ public String encode() throws Exception { //獲取時間戳 Long timestamp = System.currentTimeMillis(); //把時間戳和密鑰拼接成字符串,中間加入一個換行符 String stringToSign = timestamp + 'n' + this.secret; //聲明一個Mac對象,用來操作字符串 Mac mac = Mac.getInstance('HmacSHA256'); //初始化,設(shè)置Mac對象操作的字符串是UTF-8類型,加密方式是SHA256 mac.init(new SecretKeySpec(this.secret.getBytes('UTF-8'), 'HmacSHA256')); //把字符串轉(zhuǎn)化成字節(jié)形式 byte[] signData = mac.doFinal(stringToSign.getBytes('UTF-8')); //新建一個Base64編碼對象 Base64.Encoder encoder = Base64.getEncoder(); //把上面的字符串進(jìn)行Base64加密后再進(jìn)行URL編碼 String sign = URLEncoder.encode(new String(encoder.encodeToString(signData)),'UTF-8'); System.out.println(timestamp); System.out.println(sign); String result = '&timestamp=' + timestamp + '&sign=' + sign; return result; }; /* param: message 要發(fā)送的信息 ** return: void 無返回值 ** 作用:把傳入的message發(fā)送給釘釘機(jī)器人*/ public void dingRequest(String message){ CloseableHttpClient httpClient = HttpClientBuilder.create().build(); String url = null; try { url = this.Webhook + this.encode(); } catch (Exception e) { e.printStackTrace(); } HttpPost httpPost = new HttpPost(url); //設(shè)置http的請求頭,發(fā)送json字符串,編碼UTF-8 httpPost.setHeader('Content-Type', 'application/json;charset=utf8'); //生成json對象傳入字符 JSONObject result = new JSONObject(); JSONObject text = new JSONObject(); text.put('content', message); result.put('text', text); result.put('msgtype', 'text'); String jsonString = JSON.toJSONString(result); StringEntity entity = new StringEntity(jsonString, 'UTF-8'); //設(shè)置http請求的內(nèi)容 httpPost.setEntity(entity); // 響應(yīng)模型 CloseableHttpResponse response = null; try { // 由客戶端執(zhí)行(發(fā)送)Post請求 response = httpClient.execute(httpPost); // 從響應(yīng)模型中獲取響應(yīng)實(shí)體 HttpEntity responseEntity = response.getEntity(); System.out.println('響應(yīng)狀態(tài)為:' + response.getStatusLine()); if (responseEntity != null) { System.out.println('響應(yīng)內(nèi)容長度為:' + responseEntity.getContentLength()); System.out.println('響應(yīng)內(nèi)容為:' + EntityUtils.toString(responseEntity)); } } catch (Exception e) { e.printStackTrace(); } finally { try { // 釋放資源 if (httpClient != null) { httpClient.close(); } if (response != null) { response.close(); } } catch (Exception e) { e.printStackTrace(); } } }}

總結(jié)

其實(shí)消息推送的功能并不難,只是由于初次接觸,需要查很多的文檔,在這個過程中,鍛煉了文本閱讀能力和獨(dú)立解決問題的能力。

參考資料

Java如何進(jìn)行Base64的編碼(Encode)與解碼(Decode)

Spring RestTemplate介紹

Spring--Http請求--HttpClient

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot 釘釘機(jī)器人消息推送內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: 釘釘
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美激情麻豆| 久久久久欧美精品| 国产美女高潮在线观看| 91亚洲精品视频在线观看| 在线天堂中文资源最新版| 在线人成日本视频| 国产综合色区在线观看| 精品成人免费一区二区在线播放| 婷婷色综合网| 在线一区av| 日韩理论视频| 91久久在线| 国产精品theporn| 日韩精品亚洲专区| 亚洲免费福利一区| 美腿丝袜亚洲三区| 在线综合亚洲| 国产一区二区三区精品在线观看| 亚洲天堂一区二区| 亚洲精品在线国产| 精品视频国产| 黄色不卡一区| 亚洲精品韩国| 88久久精品| 超碰在线99| 久久免费影院| 久久国产高清| 精品国产欧美日韩| 亚洲视频二区| 欧美 日韩 国产精品免费观看| 国产乱人伦丫前精品视频| 久久久久久久久久久妇女| 欧美一级一区| 私拍精品福利视频在线一区| 国产精品久久久久蜜臀| 秋霞影视一区二区三区| 亚洲一级二级| 激情不卡一区二区三区视频在线| 国产女优一区| 欧美特黄视频| 日韩高清中文字幕一区二区| 蜜桃久久久久久| 狠狠躁少妇一区二区三区| 黄色精品视频| 九一成人免费视频| 国产videos久久| 日韩精品永久网址| 亚洲欧美久久久| 欧美69视频| 婷婷国产精品| 日韩亚洲国产欧美| 91久久中文| 婷婷亚洲综合| 亚洲图片久久| 不卡专区在线| 自拍自偷一区二区三区| 色爱综合av| 国产精品sm| 亚洲精品韩国| 日韩中文在线电影| 国产一区二区三区黄网站| 国产一区国产二区国产三区| 欧美日韩国产高清| 久久尤物视频| 精品国产精品久久一区免费式 | 首页亚洲欧美制服丝腿| 亚洲午夜av| 久久亚洲二区| 98精品视频| 欧美一区二区三区久久精品| 欧美精品一线| 亚洲精品观看| 另类综合日韩欧美亚洲| 青青国产精品| 久久激情五月激情| 欧美日韩在线网站| 国产精品.xx视频.xxtv| 91精品国产自产在线丝袜啪| 国产精品香蕉| 国产美女精品| 日本不卡在线视频| 日本不卡视频在线| 中文字幕免费一区二区| 久久av在线| 国产美女久久| 午夜欧美视频| 日本精品影院| 成人午夜国产| 亚洲一级网站| 久久视频国产| 免费黄色成人| 狠狠躁少妇一区二区三区| 国产日韩高清一区二区三区在线| 99精品小视频| 国产美女精品视频免费播放软件| 少妇精品导航| 亚洲开心激情| 日韩精品导航| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 久久久精品国产**网站| 爽好多水快深点欧美视频| 日韩av一区二区三区| 黄色aa久久| 女主播福利一区| 亚洲理论在线| 欧美日本久久| 清纯唯美亚洲综合一区| 青青草精品视频| 91成人精品观看| 亚洲一区国产| 精品久久久久中文字幕小说| 高清不卡亚洲| 午夜国产精品视频免费体验区| 国产精品婷婷| 中文字幕成在线观看| 国产欧美视频在线| 国产美女高潮在线| 亚洲精品在线观看91| 蜜臀av在线播放一区二区三区| 欧美精品自拍| 久久精品官网| 成人福利av| 在线国产一区二区| 亚洲一区日韩在线| 亚洲国产福利| 精品中国亚洲| 久久99国产精品视频| 日本精品国产| 免费观看久久久4p| 美女毛片一区二区三区四区| 国产精品免费不| 国产日韩欧美| 欧美a在线观看| 久久久国产精品网站| 国产激情精品一区二区三区| 97久久亚洲| 国产福利资源一区| 精品91福利视频| 福利视频一区| 丝袜诱惑一区二区| 久久五月天小说| 欧美日韩国产探花| 欧美特黄a级高清免费大片a级| 免费精品国产| 视频一区免费在线观看| 亚洲黄色在线| 男女精品网站| 日本欧美在线| 国产日韩免费| 日韩成人三级| 日韩精品免费一区二区在线观看| 91精品婷婷色在线观看| 国产一区视频在线观看免费| 日韩欧乱色一区二区三区在线| 人人精品亚洲| 亚洲香蕉久久| 免费观看久久av| 亚洲综合电影| 国产精品宾馆| 老司机精品在线| 911精品国产| 九九综合在线| 日韩在线观看| 日韩国产欧美一区二区| 久久99精品久久久久久园产越南| 丝袜亚洲另类欧美| 亚洲激情欧美| 在线精品小视频| 女人天堂亚洲aⅴ在线观看| 韩国精品主播一区二区在线观看 | 国产一区二区三区视频在线| 日本va欧美va欧美va精品| 蜜臀久久久久久久| 中文无码久久精品| 最近国产精品视频| 在线精品福利| 99国产精品久久久久久久成人热| 在线视频观看日韩| 在线综合亚洲| 蜜桃久久av一区| 91精品丝袜国产高跟在线| 日韩av成人高清| 国产欧美另类| 国产日韩欧美一区二区三区| 国产精品伊人| 久久久久久色| 国产传媒在线观看| 国产精品一区二区中文字幕| 日本欧洲一区二区| 老司机久久99久久精品播放免费| 欧美性感美女一区二区 | 美女国产一区| 国产精品毛片在线| 麻豆亚洲精品| 亚洲另类av| 18国产精品| 精品国产18久久久久久二百| 红杏一区二区三区| 久久久久久婷| 四虎4545www国产精品|