This commit is contained in:
2020-04-25 23:18:30 +08:00
parent 85cfeefbfa
commit 76a8c7dc2e
4 changed files with 65 additions and 3 deletions

View File

@@ -1,6 +1,6 @@
[package]
name = "dingtalk"
version = "1.2.1"
version = "1.3.0"
authors = ["Hatter Jiang <jht5945@gmail.com>"]
edition = "2018"
description = "DingTalk Robot Util, Send text/markdown/link messages using DingTalk robot, 钉钉机器人"

View File

@@ -88,9 +88,29 @@ dt.send_message(&DingTalkMessage::new_action_card("action card 002", "action car
).await?;
```
#### JSON Config
DingTalk config:
```json
{
"access_token": "<access token>",
"sec_token": "<sec token>"
}
```
WeChat Work config:
```json
{
"type": "wechat",
"access_token": "<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

View File

@@ -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() {

13
tests/test_wechatwork.rs Normal file
View File

@@ -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(())
}