91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot實現釘釘機器人消息推送的示例代碼

發布時間:2020-09-18 01:31:14 來源:腳本之家 閱讀:182 作者:LYX6666 欄目:編程語言

零、前言

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

SpringBoot實現釘釘機器人消息推送的示例代碼

一、在群里添加機器人

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

SpringBoot實現釘釘機器人消息推送的示例代碼

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

  • 自定義關鍵詞
  • 加簽
  • IP地址

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

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

二、構建請求地址和內容

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

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

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

SpringBoot實現釘釘機器人消息推送的示例代碼

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

SpringBoot實現釘釘機器人消息推送的示例代碼

查了一下,發現Java8中內置的java.util已經包含了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對象,設置Mac對象操作的字符串是UTF-8類型,加密方式是SHA256
  mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
  //把字符串轉化成字節形式
  byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
  //新建一個Base64編碼對象
  Base64.Encoder encoder = Base64.getEncoder();
  //把上面的字符串進行Base64加密后再進行URL編碼
  String sign = URLEncoder.encode(new String(encoder.encodeToString(signData)),"UTF-8");
  //分別輸出時間戳和加密信息
  System.out.println(timestamp);
  System.out.println(sign);
 }
}

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

SpringBoot實現釘釘機器人消息推送的示例代碼

成功輸出了時間戳和驗證信息。

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

//替換參數后,在終端執行
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"
  }'

然后就出現了:

SpringBoot實現釘釘機器人消息推送的示例代碼

經過測試,代碼正常運行,接下來就是部署到生產環境了。

三、部署代碼

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

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

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

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

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

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

粗略步驟如圖:

SpringBoot實現釘釘機器人消息推送的示例代碼

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

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

 /*
 ** 生成時間戳和驗證信息
 */
 
 public String encode() throws Exception {
  //獲取時間戳
  Long timestamp = System.currentTimeMillis();
  //把時間戳和密鑰拼接成字符串,中間加入一個換行符
  String stringToSign = timestamp + "\n" + this.secret;
  //聲明一個Mac對象,用來操作字符串
  Mac mac = Mac.getInstance("HmacSHA256");
  //初始化,設置Mac對象操作的字符串是UTF-8類型,加密方式是SHA256
  mac.init(new SecretKeySpec(this.secret.getBytes("UTF-8"), "HmacSHA256"));
  //把字符串轉化成字節形式
  byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
  //新建一個Base64編碼對象
  Base64.Encoder encoder = Base64.getEncoder();
  //把上面的字符串進行Base64加密后再進行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 要發送的信息
 ** return: void 無返回值
 ** 作用:把傳入的message發送給釘釘機器人*/

 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);
  //設置http的請求頭,發送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");
  //設置http請求的內容
  httpPost.setEntity(entity);
  // 響應模型
  CloseableHttpResponse response = null;
  try {
   // 由客戶端執行(發送)Post請求
   response = httpClient.execute(httpPost);
   // 從響應模型中獲取響應實體
   HttpEntity responseEntity = response.getEntity();
   System.out.println("響應狀態為:" + response.getStatusLine());
   if (responseEntity != null) {
    System.out.println("響應內容長度為:" + responseEntity.getContentLength());
    System.out.println("響應內容為:" + 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();
   }
  }
 }
}

總結

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

參考資料

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

Spring RestTemplate介紹

Spring--Http請求--HttpClient

到此這篇關于SpringBoot實現釘釘機器人消息推送的示例代碼的文章就介紹到這了,更多相關SpringBoot 釘釘機器人消息推送內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芷江| 团风县| 四平市| 三穗县| 乌恰县| 深水埗区| 漠河县| 寿光市| 平度市| 许昌市| 会同县| 建德市| 怀柔区| 湄潭县| 宁阳县| 新营市| 虹口区| 嘉善县| 红河县| 盘锦市| 剑阁县| 梨树县| 辰溪县| 思茅市| 密云县| 杭州市| 江西省| 阿坝县| 龙陵县| 于田县| 东乌| 伊宁县| 平塘县| 仁化县| 禹城市| 鹿邑县| 土默特左旗| 翁牛特旗| 襄垣县| 甘谷县| 奉新县|