最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年03月20日 09:45:32   作者:LYX6666  
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

零、前言

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

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

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

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

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

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

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

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

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

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

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

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)置類,也就是說,示例代碼并不能直接拿過來用:

查了一下,發(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 {
  //獲取時(shí)間戳
  Long timestamp = System.currentTimeMillis();
  //定義密鑰
  String secret = "this is secret";
  //把時(shí)間戳和密鑰拼接成字符串,中間加入一個(gè)換行符
  String stringToSign = timestamp + "\n" + secret;
  //聲明一個(gè)Mac對(duì)象,用來操作字符串
  Mac mac = Mac.getInstance("HmacSHA256");
  //初始化Mac對(duì)象,設(shè)置Mac對(duì)象操作的字符串是UTF-8類型,加密方式是SHA256
  mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
  //把字符串轉(zhuǎn)化成字節(jié)形式
  byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
  //新建一個(gè)Base64編碼對(duì)象
  Base64.Encoder encoder = Base64.getEncoder();
  //把上面的字符串進(jìn)行Base64加密后再進(jìn)行URL編碼
  String sign = URLEncoder.encode(new String(encoder.encodeToString(signData)),"UTF-8");
  //分別輸出時(shí)間戳和加密信息
  System.out.println(timestamp);
  System.out.println(sign);
 }
}

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

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

我們測試上述代碼的時(shí)候,可以手動(dòng)拼接URL,直接發(fā)起請(qǐng)求:
(URL一共有三個(gè)參數(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)了:

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

三、部署代碼

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

以前,筆者只用過前臺(tái)的HttpClient,對(duì)于后臺(tái)的HTTP工具并不了解。

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

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

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

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

粗略步驟如圖:

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

public class DingService {
 //請(qǐng)求地址以及access_token
 String Webhook = "https://oapi.dingtalk.com/robot/send?access_token=YOUR TOKEN";
 //密鑰
 String secret = "YOUR SECRET";

 /*
 ** 生成時(shí)間戳和驗(yàn)證信息
 */
 
 public String encode() throws Exception {
  //獲取時(shí)間戳
  Long timestamp = System.currentTimeMillis();
  //把時(shí)間戳和密鑰拼接成字符串,中間加入一個(gè)換行符
  String stringToSign = timestamp + "\n" + this.secret;
  //聲明一個(gè)Mac對(duì)象,用來操作字符串
  Mac mac = Mac.getInstance("HmacSHA256");
  //初始化,設(shè)置Mac對(duì)象操作的字符串是UTF-8類型,加密方式是SHA256
  mac.init(new SecretKeySpec(this.secret.getBytes("UTF-8"), "HmacSHA256"));
  //把字符串轉(zhuǎn)化成字節(jié)形式
  byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
  //新建一個(gè)Base64編碼對(duì)象
  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的請(qǐng)求頭,發(fā)送json字符串,編碼UTF-8
  httpPost.setHeader("Content-Type", "application/json;charset=utf8");
  //生成json對(duì)象傳入字符
  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請(qǐng)求的內(nèi)容
  httpPost.setEntity(entity);
  // 響應(yīng)模型
  CloseableHttpResponse response = null;
  try {
   // 由客戶端執(zhí)行(發(fā)送)Post請(qǐng)求
   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í)消息推送的功能并不難,只是由于初次接觸,需要查很多的文檔,在這個(gè)過程中,鍛煉了文本閱讀能力和獨(dú)立解決問題的能力。

參考資料

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

Spring RestTemplate介紹

Spring--Http請(qǐng)求--HttpClient

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

相關(guān)文章

  • Spring Boot整合Spring Security簡單實(shí)現(xiàn)登入登出從零搭建教程

    Spring Boot整合Spring Security簡單實(shí)現(xiàn)登入登出從零搭建教程

    這篇文章主要給大家介紹了關(guān)于Spring Boot整合Spring Security簡單實(shí)現(xiàn)登入登出從零搭建的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-09-09
  • Mybatis?plugin的使用及原理示例解析

    Mybatis?plugin的使用及原理示例解析

    這篇文章主要為大家介紹了?Mybatis?plugin的使用及原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 解析本地方法映射Java層的數(shù)據(jù)類型

    解析本地方法映射Java層的數(shù)據(jù)類型

    這篇文章給大家介紹了本地方法映射Java層的數(shù)據(jù)類型,包括基礎(chǔ)類型映射,引用類型映射等等,對(duì)java層數(shù)據(jù)類型映射相關(guān)知識(shí),感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-03-03
  • 使用bitset實(shí)現(xiàn)毫秒級(jí)查詢(實(shí)例講解)

    使用bitset實(shí)現(xiàn)毫秒級(jí)查詢(實(shí)例講解)

    下面小編就為大家?guī)硪黄褂胋itset實(shí)現(xiàn)毫秒級(jí)查詢(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • java實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    java實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    這篇文章主要介紹了java實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出的方法和具體示例代碼,非常的簡單實(shí)用,有需要的小伙伴可以參考下
    2016-04-04
  • Java實(shí)現(xiàn)文件上傳保存

    Java實(shí)現(xiàn)文件上傳保存

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件上傳保存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java基礎(chǔ)知識(shí)之BufferedReader流的使用

    Java基礎(chǔ)知識(shí)之BufferedReader流的使用

    這篇文章主要介紹了Java基礎(chǔ)知識(shí)之BufferedReader流的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Springboot中如何集成Druid

    Springboot中如何集成Druid

    Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,本篇主要講解一下?Springboot中如何集成?Druid?,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之學(xué)生管理系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之學(xué)生管理系統(tǒng)的實(shí)現(xiàn)

    只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實(shí)現(xiàn)學(xué)生管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-03-03
  • 解決Maven中關(guān)于依賴導(dǎo)入不進(jìn)的問題

    解決Maven中關(guān)于依賴導(dǎo)入不進(jìn)的問題

    這篇文章主要介紹了解決Maven中關(guān)于依賴導(dǎo)入不進(jìn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評(píng)論

太谷县| 顺平县| 砚山县| 宁河县| 清远市| 彰化县| 徐闻县| 方正县| 砚山县| 乡宁县| 和田县| 汝州市| 油尖旺区| 遂宁市| 三明市| 唐海县| 镇康县| 梁平县| 沈丘县| 乌兰察布市| 邳州市| 庆云县| 霍邱县| 介休市| 怀来县| 子洲县| SHOW| 柳河县| 临泉县| 晋江市| 兴国县| 南汇区| 鄂伦春自治旗| 日喀则市| 张掖市| 湘阴县| 无为县| 塘沽区| 左贡县| 应城市| 桃江县|