Merge branch 'master' into vip

master
3y 3 years ago
commit 58fc132d31

@ -154,12 +154,14 @@ curl -XPOST "127.0.0.1:8080/send" -H 'Content-Type: application/json' -d '{"co
- [x] 接入微信服务号渠道(已有pull request代码)
- [x] 接入微信小程序渠道(已有pull request代码)
- [x] 接入PUSH渠道
- [x] 接入云片短信渠道,并短信支持流量配置,拉取腾讯云短信回执
- [x] 完成接入钉钉机器人渠道所有类型的消息
- [ ] 总体架构已完成,持续做基础建设和优化代码
**近期更新时间**5月9
**近期更新时间**6月3
**近期更新功能**接入个推PUSH安卓发送推送消息
**近期更新功能**完成接入钉钉机器人渠道所有类型的消息
## 项目交流

@ -7,17 +7,15 @@ import lombok.NoArgsConstructor;
/**
* @author 3y
* +
*
* <p>
* https://open.dingtalk.com/document/group/custom-robot-access
* <p>
* https://open.dingtalk.com/document/orgapp-server/asynchronous-sending-of-enterprise-session-messages
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class DingDingContentModel extends ContentModel {
public class DingDingRobotContentModel extends ContentModel {
/**
*
@ -62,13 +60,4 @@ public class DingDingContentModel extends ContentModel {
* "[{\"picUrl\":\"https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png\",\"title\":\"{$title1}\",\"url\":\"https://www.dingtalk.com/\"},{\"picUrl\":\"https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png\\t\",\"title\":\"时代的火车向前开2\",\"url\":\"https://www.dingtalk.com/\"}]"}
*/
private String feedCards;
/**
* 使ID
*/
private String mediaId;
// ...
}

@ -0,0 +1,79 @@
package com.java3y.austin.common.dto.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 3y
*
* <p>
* https://open.dingtalk.com/document/orgapp-server/asynchronous-sending-of-enterprise-session-messages
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class DingDingWorkContentModel extends ContentModel {
/**
*
*/
private String sendType;
/**
* markdownActionCard
*/
private String content;
/**
* markdownActionCard
*/
private String title;
/**
* ActionCard
*/
private String btnOrientation;
/**
* ActionCardjson
* [{"title":"一个按钮","action_url":"https://www.taobao.com"},{"title":"两个按钮","action_url":"https://www.tmall.com"}]
*/
private String btns;
/**
* URL
*/
private String url;
/**
* URL
*/
private String picUrl;
/**
* 使ID
*/
private String mediaId;
/**
*
*/
private String duration;
/**
* OA
* {"bgcolor":"FFBBBBBB","text":"头部标题"}
*/
private String head;
/**
* OA
* {"title":"正文标题","form":[{"key":"姓名:","value":"张三"},{"key":"年龄:","value":"20"},{"key":"身高:","value":"1.8米"},{"key":"体重:","value":"130斤"},{"key":"学历:","value":"本科"},{"key":"爱好:","value":"打球、听音乐"}],"rich":{"num":"15.6","unit":"元"},"content":"大段文本大段文本大段文本大段文本大段文本大段文本","image":"@lADOADmaWMzazQKA","file_count":"3","author":"李四 "}
*/
private String body;
}

@ -24,8 +24,8 @@ public enum ChannelType {
OFFICIAL_ACCOUNT(50, "OfficialAccounts(服务号)", OfficialAccountsContentModel.class, "official_accounts"),
MINI_PROGRAM(60, "miniProgram(小程序)", MiniProgramContentModel.class, "mini_program"),
ENTERPRISE_WE_CHAT(70, "EnterpriseWeChat(企业微信)", EnterpriseWeChatContentModel.class, "enterprise_we_chat"),
DING_DING_ROBOT(80, "dingDingRobot(钉钉机器人)", DingDingContentModel.class, "ding_ding_robot"),
DING_DING_WORK_NOTICE(90, "dingDingWorkNotice(钉钉工作通知)", DingDingContentModel.class, "ding_ding_work_notice"),
DING_DING_ROBOT(80, "dingDingRobot(钉钉机器人)", DingDingRobotContentModel.class, "ding_ding_robot"),
DING_DING_WORK_NOTICE(90, "dingDingWorkNotice(钉钉工作通知)", DingDingWorkContentModel.class, "ding_ding_work_notice"),
;
/**

@ -14,27 +14,37 @@ import lombok.ToString;
@AllArgsConstructor
public enum SendMessageType {
TEXT("10", "文本", "text"),
VOICE("20", "语音", null),
VIDEO("30", "视频", null),
NEWS("40", "图文", "feedCard"),
TEXT_CARD("50", "文本卡片", null),
FILE("60", "文件", null),
MINI_PROGRAM_NOTICE("70", "小程序通知", null),
MARKDOWN("80", "markdown", "markdown"),
TEMPLATE_CARD("90", "模板卡片", null),
IMAGE("100", "图片", null),
LINK("110", "链接消息", "link"),
ACTION_CARD("120", "跳转卡片消息", "actionCard"),
TEXT("10", "文本", "text", "text"),
VOICE("20", "语音", null, "voice"),
VIDEO("30", "视频", null, null),
NEWS("40", "图文", "feedCard", null),
TEXT_CARD("50", "文本卡片", null, null),
FILE("60", "文件", null, "file"),
MINI_PROGRAM_NOTICE("70", "小程序通知", null, null),
MARKDOWN("80", "markdown", "markdown", "markdown"),
TEMPLATE_CARD("90", "模板卡片", null, null),
IMAGE("100", "图片", null, "image"),
LINK("110", "链接消息", "link", "link"),
ACTION_CARD("120", "跳转卡片消息", "actionCard", "action_card"),
OA("130", "OA消息", null, "oa"),
;
private String code;
private String description;
/**
*
*/
private String dingDingRobotType;
/**
*
*/
private String dingDingWorkType;
/**
* codeType
* codeType
*
* @param code
* @return
@ -48,5 +58,20 @@ public enum SendMessageType {
return null;
}
/**
* codeType
*
* @param code
* @return
*/
public static String getDingDingWorkTypeByCode(String code) {
for (SendMessageType value : SendMessageType.values()) {
if (value.getCode().equals(code)) {
return value.getDingDingWorkType();
}
}
return null;
}
}

@ -4,13 +4,12 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.google.common.base.Throwables;
import com.java3y.austin.common.constant.AustinConstant;
import com.java3y.austin.common.constant.SendAccountConstant;
import com.java3y.austin.common.domain.TaskInfo;
import com.java3y.austin.common.dto.account.DingDingRobotAccount;
import com.java3y.austin.common.dto.model.DingDingContentModel;
import com.java3y.austin.common.dto.model.DingDingRobotContentModel;
import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.common.enums.SendMessageType;
import com.java3y.austin.handler.domain.dingding.DingDingRobotParam;
@ -74,7 +73,7 @@ public class DingDingRobotHandler extends BaseHandler implements Handler {
}
// 消息类型以及内容相关
DingDingContentModel contentModel = (DingDingContentModel) taskInfo.getContentModel();
DingDingRobotContentModel contentModel = (DingDingRobotContentModel) taskInfo.getContentModel();
DingDingRobotParam param = DingDingRobotParam.builder().at(atVo)
.msgtype(SendMessageType.getDingDingRobotTypeByCode(contentModel.getSendType()))
.build();

@ -11,8 +11,11 @@ import com.java3y.austin.common.constant.AustinConstant;
import com.java3y.austin.common.constant.SendAccountConstant;
import com.java3y.austin.common.domain.TaskInfo;
import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount;
import com.java3y.austin.common.dto.model.DingDingContentModel;
import com.java3y.austin.common.dto.model.DingDingRobotContentModel;
import com.java3y.austin.common.dto.model.DingDingWorkContentModel;
import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.common.enums.SendMessageType;
import com.java3y.austin.handler.domain.dingding.DingDingRobotParam;
import com.java3y.austin.handler.handler.BaseHandler;
import com.java3y.austin.handler.handler.Handler;
import com.java3y.austin.support.utils.AccountUtils;
@ -22,6 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
/**
*
* <p>
@ -73,7 +78,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler {
*/
private OapiMessageCorpconversationAsyncsendV2Request assembleParam(DingDingWorkNoticeAccount account, TaskInfo taskInfo) {
OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
DingDingContentModel contentModel = (DingDingContentModel) taskInfo.getContentModel();
DingDingWorkContentModel contentModel = (DingDingWorkContentModel) taskInfo.getContentModel();
try {
// 接收者相关
if (AustinConstant.SEND_ALL.equals(CollUtil.getFirst(taskInfo.getReceiver()))) {
@ -83,13 +88,64 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler {
}
req.setAgentId(Long.parseLong(account.getAgentId()));
// 内容相关
OapiMessageCorpconversationAsyncsendV2Request.Msg message = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
message.setMsgtype("text");
OapiMessageCorpconversationAsyncsendV2Request.Text textObj = new OapiMessageCorpconversationAsyncsendV2Request.Text();
textObj.setContent(contentModel.getContent());
message.setText(textObj);
message.setMsgtype(SendMessageType.getDingDingWorkTypeByCode(contentModel.getSendType()));
// 根据类型设置入参
if (SendMessageType.TEXT.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.Text textObj = new OapiMessageCorpconversationAsyncsendV2Request.Text();
textObj.setContent(contentModel.getContent());
message.setText(textObj);
}
if (SendMessageType.IMAGE.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.Image image = new OapiMessageCorpconversationAsyncsendV2Request.Image();
image.setMediaId(contentModel.getMediaId());
message.setImage(image);
}
if (SendMessageType.VOICE.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.Voice voice = new OapiMessageCorpconversationAsyncsendV2Request.Voice();
voice.setMediaId(contentModel.getMediaId());
voice.setDuration(contentModel.getDuration());
message.setVoice(voice);
}
if (SendMessageType.FILE.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.File file = new OapiMessageCorpconversationAsyncsendV2Request.File();
file.setMediaId(contentModel.getMediaId());
message.setFile(file);
}
if (SendMessageType.LINK.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.Link link = new OapiMessageCorpconversationAsyncsendV2Request.Link();
link.setText(contentModel.getContent());
link.setTitle(contentModel.getTitle());
link.setPicUrl(contentModel.getPicUrl());
link.setMessageUrl(contentModel.getUrl());
message.setLink(link);
}
if (SendMessageType.MARKDOWN.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.Markdown markdown = new OapiMessageCorpconversationAsyncsendV2Request.Markdown();
markdown.setText(contentModel.getContent());
markdown.setTitle(contentModel.getTitle());
message.setMarkdown(markdown);
}
if (SendMessageType.ACTION_CARD.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.ActionCard actionCard = new OapiMessageCorpconversationAsyncsendV2Request.ActionCard();
actionCard.setTitle(contentModel.getTitle());
actionCard.setMarkdown(contentModel.getContent());
actionCard.setBtnOrientation(contentModel.getBtnOrientation());
actionCard.setBtnJsonList(JSON.parseArray(contentModel.getBtns(), OapiMessageCorpconversationAsyncsendV2Request.BtnJsonList.class));
message.setActionCard(actionCard);
}
if (SendMessageType.ACTION_CARD.getCode().equals(contentModel.getSendType())) {
OapiMessageCorpconversationAsyncsendV2Request.OA oa = new OapiMessageCorpconversationAsyncsendV2Request.OA();
oa.setMessageUrl(contentModel.getUrl());
oa.setHead(JSON.parseObject(contentModel.getHead(), OapiMessageCorpconversationAsyncsendV2Request.Head.class));
oa.setBody(JSON.parseObject(contentModel.getBody(), OapiMessageCorpconversationAsyncsendV2Request.Body.class));
message.setOa(oa);
}
req.setMsg(message);
} catch (Exception e) {
log.error("assembleParam fail:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo));

@ -21,13 +21,13 @@ public class AccountUtils {
private Config config;
/**
* (key:smsAccount)[{"sms_10":{"url":"sms.tencentcloudapi.com","region":"ap-guangzhou","secretId":"AKIDhDUUDfrmQnvmMfhSw95lCMEqBF1WljQq","secretKey":"B4h39yWnnX0C6k7D2btue7JErDJ8gxyi","smsSdkAppId":"1400592125","templateId":"1182097","signName":"Java3y公众号","supplierId":10,"supplierName":"腾讯云"}},{"sms_20":{"url":"https://sms.yunpian.com/v2/sms/tpl_batch_send.json","apikey":"ca55d4c856d72e5d589361c4511b5cd7","tpl_id":"5236082","supplierId":20,"supplierName":"云片"}}]
* (key:emailAccount)[{"email_10":{"host":"smtp.qq.com","port":465,"user":"403686131@qq.com","pass":"","from":"403686131@qq.com"}}]
* (key:enterpriseWechatAccount)[{"enterprise_wechat_10":{"corpId":"wwf87603333e00069c","corpSecret":"-IFWxS2222QxzPIorNVUQn144444D915DM","agentId":10044442,"token":"rXROB3333Kf6i","aesKey":"MKZtoFxHIM44444M7ieag3r9ZPUsl"}}]
* (key:dingDingRobotAccount) [{"ding_ding_robot_10":{"secret":"SEC996d8d9d4768aded74114faae924f229229de444475a1c295d64fedf","webhook":"https://oapi.dingtalk.com/robot/send?access_token=8d03b644ffb6534b203d87333367328b0c3003d164715d2c6c6e56"}}]
* (key:dingDingWorkNoticeAccount) [{"ding_ding_work_notice_10":{"appKey":"dingh6yyyyyyycrlbx","appSecret":"tQpvmkR863333yyyyyHP3QHyyyymy9Ao1yoL1oQX5Nlx_fYLLLlpPJWHvWKbTu","agentId":"152333383622"}}]
* (key:officialAccount) [{"official_10":{"appId":"wxecb4693d2eef1ea7","secret":"6240870f4d91701640d769ba20120821","templateId":"JHUk6eE9T5Ts7a5JO3ZQqkBBrZBGn5C9iIiKNDQsk-Q","url":"http://weixin.qq.com/download","miniProgramId":"xiaochengxuappid12345","path":"index?foo=bar"}}]
* (key:miniProgramAccount) [{"mini_program_10":{"appId":"wxecb4693d2eef1ea7","appSecret":"6240870f4d91701640d769ba20120821","templateId":"JHUk6eE9T5Ts7a5JO3ZQqkBBrZBGn5C9iIiKNDQsk-Q","grantType":"client_credential","miniProgramState":"trial","page":"index?foo=bar"}}]
* (key:smsAccount)[{"sms_10":{"url":"sms.tencentcloudapi.com","region":"ap-guangzhou","secretId":"AKIDhDxxxxxxxx1WljQq","secretKey":"B4hwww39yxxxrrrrgxyi","smsSdkAppId":"1423123125","templateId":"1182097","signName":"Java3y公众号","supplierId":10,"supplierName":"腾讯云"}},{"sms_20":{"url":"https://sms.yunpian.com/v2/sms/tpl_batch_send.json","apikey":"caffff8234234231b5cd7","tpl_id":"523333332","supplierId":20,"supplierName":"云片"}}]
* (key:emailAccount)[{"email_10":{"host":"smtp.qq.com","port":465,"user":"4032222131@qq.com","pass":"","from":"4036333131@qq.com"}}]
* (key:enterpriseWechatAccount)[{"enterprise_wechat_10":{"corpId":"wwf87603333e00069c","corpSecret":"-IFWxS2222QxzPIorNV11144D915DM","agentId":10044442,"token":"rXROB3333Kf6i","aesKey":"MKZtoFxHIM44444M7ieag3r9ZPUsl"}}]
* (key:dingDingRobotAccount) [{"ding_ding_robot_10":{"secret":"SEC9222d4768aded74114faae92229de422222fedf","webhook":"https://oapi.dingtalk.com/robot/send?access_token=8d03b6442222203d87333367328b0c3003d164715d2c6c6e56"}}]
* (key:dingDingWorkNoticeAccount) [{"ding_ding_work_notice_10":{"appKey":"dingh6yyyyyyycrlbx","appSecret":"tQpvmkR863333yyyyyHP3QHyyyymy9Ao1yoL1oQX5NsdfsWHvWKbTu","agentId":"1523123123183622"}}]
* (key:officialAccount) [{"official_10":{"appId":"wxecb4693d2eef1ea7","secret":"624asdfsa1640d769ba20120821","templateId":"JHUk6eE9T5Ts7asdfsadfiKNDQsk-Q","url":"http://weixin.qq.com/download","miniProgramId":"xiaochengxuappid12345","path":"index?foo=bar"}}]
* (key:miniProgramAccount) [{"mini_program_10":{"appId":"wxecb4693d2eef1ea7","appSecret":"6240870f4d91701640d769ba20120821","templateId":"JHUk6eE9T5TasdfCrQsk-Q","grantType":"client_credential","miniProgramState":"trial","page":"index?foo=bar"}}]
*/
public <T> T getAccount(Integer sendAccount, String apolloKey, String prefix, Class<T> clazz) {
String accountValues = config.getProperty(apolloKey, AustinConstant.APOLLO_DEFAULT_VALUE_JSON_ARRAY);

@ -74,7 +74,7 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
<version>1.2.83</version>
</dependency>
<!--腾讯sdk(目前用在短信上)-->

Loading…
Cancel
Save