From 76a8c7dc2e6dee4b0b667da713a28194dc4046c3 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 25 Apr 2020 23:18:30 +0800 Subject: [PATCH] v1.3.0 --- Cargo.toml | 2 +- README.md | 20 ++++++++++++++++++++ src/lib.rs | 33 +++++++++++++++++++++++++++++++-- tests/test_wechatwork.rs | 13 +++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 tests/test_wechatwork.rs diff --git a/Cargo.toml b/Cargo.toml index 6444583..e263e6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dingtalk" -version = "1.2.1" +version = "1.3.0" authors = ["Hatter Jiang "] edition = "2018" description = "DingTalk Robot Util, Send text/markdown/link messages using DingTalk robot, 钉钉机器人" diff --git a/README.md b/README.md index 86d1012..67e8c49 100644 --- a/README.md +++ b/README.md @@ -88,9 +88,29 @@ dt.send_message(&DingTalkMessage::new_action_card("action card 002", "action car ).await?; ``` +#### JSON Config + +DingTalk config: +```json +{ + "access_token": "", + "sec_token": "" +} +``` + +WeChat Work config: +```json +{ + "type": "wechat", + "access_token": "" +} +``` + #### Changelog +* v1.3.0 + * Suports WeChat Work now, add type `"type": "wechat"`, supports method `DingTalk::send_text` * v1.2.1 * Remove `maplit` crate * v1.2.0 diff --git a/src/lib.rs b/src/lib.rs index 47079fc..5675542 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,6 +28,20 @@ const CONTENT_TYPE: &str = "Content-Type"; const APPLICATION_JSON_UTF8: &str = "application/json; charset=utf-8"; const DEFAULT_DINGTALK_ROBOT_URL: &str = "https://oapi.dingtalk.com/robot/send"; +const DEFAULT_WECHAT_WORK_ROBOT_URL: &str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send"; + +/// Send Dingtalk or WeChatWork message +#[derive(Clone, Copy, Debug)] +pub enum DingTalkType { + + DingTalk, + + WeChatWork, +} + +impl Default for DingTalkType { + fn default() -> Self { DingTalkType::DingTalk } +} /// `DingTalk` is a simple SDK for DingTalk webhook robot /// @@ -45,6 +59,7 @@ const DEFAULT_DINGTALK_ROBOT_URL: &str = "https://oapi.dingtalk.com/robot/send"; /// ``` #[derive(Default)] pub struct DingTalk<'a> { + pub dingtalk_type: DingTalkType, pub default_webhook_url: &'a str, pub access_token: &'a str, pub sec_token: &'a str, @@ -208,13 +223,24 @@ impl <'a> DingTalk<'a> { if !json_value.is_object() { return Err(Box::new(Error::new(ErrorKind::Other, format!("JSON format erorr: {}", json)))); } + let type_str = json_value["type"].as_str().unwrap_or_default().to_lowercase(); + let dingtalk_type = match type_str.as_str() { + "wechat" | "wechatwork" => DingTalkType::WeChatWork, + _ => DingTalkType::DingTalk, + }; - let default_webhook_url = Self::string_to_a_str(json_value["default_webhook_url"].as_str().unwrap_or(DEFAULT_DINGTALK_ROBOT_URL)); + let default_webhook_url = Self::string_to_a_str(json_value["default_webhook_url"].as_str().unwrap_or_else( + || match dingtalk_type { + DingTalkType::DingTalk => DEFAULT_DINGTALK_ROBOT_URL, + DingTalkType::WeChatWork => DEFAULT_WECHAT_WORK_ROBOT_URL, + } + )); let access_token = Self::string_to_a_str(json_value["access_token"].as_str().unwrap_or_default()); let sec_token = Self::string_to_a_str(json_value["sec_token"].as_str().unwrap_or_default()); let direct_url = Self::string_to_a_str(json_value["direct_url"].as_str().unwrap_or_default()); Ok(DingTalk { + dingtalk_type, default_webhook_url, access_token, sec_token, @@ -383,7 +409,10 @@ impl <'a> DingTalk<'a> { signed_url.push('?'); } - signed_url.push_str("access_token="); + match self.dingtalk_type { + DingTalkType::DingTalk => signed_url.push_str("access_token="), + DingTalkType::WeChatWork => signed_url.push_str("key="), + } signed_url.push_str(&urlencoding::encode(self.access_token)); if !self.sec_token.is_empty() { diff --git a/tests/test_wechatwork.rs b/tests/test_wechatwork.rs new file mode 100644 index 0000000..302cedd --- /dev/null +++ b/tests/test_wechatwork.rs @@ -0,0 +1,13 @@ +use dingtalk::*; + +#[test] +fn run_all_tests_wechat_work() { + tokio_test::block_on(_test_send_wechat_work()).unwrap(); +} + +async fn _test_send_wechat_work() -> XResult<()> { + let dt = DingTalk::from_file("~/.wechat-work-token.json")?; + dt.send_text("test message 001 ---------------------").await?; + Ok(()) +} +