Merge branch 'master' into vip

master
3y 3 years ago
commit 0cf052d737

@ -48,6 +48,18 @@ public class SendAccountConstant {
public static final String DING_DING_ROBOT_ACCOUNT_KEY = "dingDingRobotAccount";
public static final String DING_DING_ROBOT_PREFIX = "ding_ding_robot_";
/**
*
*/
public static final String ENTERPRISE_WECHAT_ROBOT_ACCOUNT_KEY = "enterpriseWechatAccountRobot";
public static final String ENTERPRISE_WECHAT_ROBOT_PREFIX = "enterprise_wechat_robot_";
/**
*
*/
public static final String FEI_SHU_ROBOT_ACCOUNT_KEY = "feiShuAccountRobot";
public static final String FEI_SHU_ROBOT_PREFIX = "fei_shu_robot_";
/**
*
*/

@ -0,0 +1,24 @@
package com.java3y.austin.common.dto.account;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*
* @author 3y
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EnterpriseWeChatRobotAccount {
/**
* webhook
*/
private String webhook;
}

@ -0,0 +1,24 @@
package com.java3y.austin.common.dto.account;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*
* @author 3y
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class FeiShuRobotAccount {
/**
* webhook
*/
private String webhook;
}

@ -60,7 +60,7 @@ public class EnterpriseWeChatContentModel extends ContentModel {
/**
* mpnews
* [{"title":"Title","thumb_media_id":"MEDIA_ID","author":"Author","content_source_url":"URL","content":"Content","digest":"Digest description"}]
* [{"title":"Title","thumb_media_id":"MEDIA_ID","author":"Author","content_source_url":"URL","content":"Content","digest":"Digest description"}]
*/
private String mpNewsArticle;
@ -74,12 +74,8 @@ public class EnterpriseWeChatContentModel extends ContentModel {
private String contentItems;
/**
* https://developer.work.weixin.qq.com/document/path/90372#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF
*/
}

@ -0,0 +1,44 @@
package com.java3y.austin.common.dto.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 3y
*
* <p>
* https://developer.work.weixin.qq.com/document/path/91770#%E6%96%87%E6%9C%AC%E7%B1%BB%E5%9E%8B
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EnterpriseWeChatRobotContentModel extends ContentModel {
/**
*
*/
private String sendType;
/**
*
*/
private String content;
/**
* Id
*/
private String mediaId;
/**
* [{"title":"中秋节礼品领取","description":"今年中秋节公司有豪礼相送","url":"www.qq.com","picurl":"http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png"}]
*/
private String articles;
/**
*
*/
private String imagePath;
}

@ -0,0 +1,50 @@
package com.java3y.austin.common.dto.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 3y
*
* <p>
* https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN#756b882f
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class FeiShuRobotContentModel extends ContentModel {
/**
*
*/
private String sendType;
/**
*
*/
private String content;
/**
*
*/
private String title;
/**
* Id
*/
private String mediaId;
/**
* [[{"tag":"text","text":"项目有更新: "},{"tag":"a","text":"请查看","href":"http://www.example.com/"},{"tag":"at","user_id":"ou_18eac8********17ad4f02e8bbbb"}]]
*/
private String postContent;
/**
*
*/
private String imagePath;
}

@ -21,11 +21,13 @@ public enum ChannelType {
PUSH(20, "push(通知栏)", PushContentModel.class, "push"),
SMS(30, "sms(短信)", SmsContentModel.class, "sms"),
EMAIL(40, "email(邮件)", EmailContentModel.class, "email"),
OFFICIAL_ACCOUNT(50, "OfficialAccounts(服务号)", OfficialAccountsContentModel.class, "official_accounts"),
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"),
ENTERPRISE_WE_CHAT(70, "enterpriseWeChat(企业微信)", EnterpriseWeChatContentModel.class, "enterprise_we_chat"),
DING_DING_ROBOT(80, "dingDingRobot(钉钉机器人)", DingDingRobotContentModel.class, "ding_ding_robot"),
DING_DING_WORK_NOTICE(90, "dingDingWorkNotice(钉钉工作通知)", DingDingWorkContentModel.class, "ding_ding_work_notice"),
ENTERPRISE_WE_CHAT_ROBOT(100, "enterpriseWeChat(企业微信机器人)", EnterpriseWeChatRobotContentModel.class, "enterprise_we_chat_robot"),
FEI_SHU_ROBOT(110, "feiShuRoot(飞书机器人)", FeiShuRobotContentModel.class, "fei_shu_robot"),
;
/**

@ -14,20 +14,22 @@ import lombok.ToString;
@AllArgsConstructor
public enum SendMessageType {
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"),
MP_NEWS("140", "图文消息(mpnews)", null, null),
TEXT("10", "文本", "text", "text","text","text"),
VOICE("20", "语音", null, "voice",null,null),
VIDEO("30", "视频", null, null,null,null),
NEWS("40", "图文", "feedCard", null,"news",null),
TEXT_CARD("50", "文本卡片", null, null,null,null),
FILE("60", "文件", null, "file","file",null),
MINI_PROGRAM_NOTICE("70", "小程序通知", null, null,null,null),
MARKDOWN("80", "markdown", "markdown", "markdown","markdown",null),
TEMPLATE_CARD("90", "模板卡片", null, null,"template_card",null),
IMAGE("100", "图片", null, "image","image","image"),
LINK("110", "链接消息", "link", "link",null,null),
ACTION_CARD("120", "跳转卡片消息", "actionCard", "action_card",null,"interactive"),
OA("130", "OA消息", null, "oa",null,null),
MP_NEWS("140", "图文消息(mpNews)", null, null,null,null),
RICH_TEXT("150", "富文本", null, null,null,"post"),
SHARE_CHAT("160", "群名片", null, null,null,"share_chat")
;
@ -44,6 +46,16 @@ public enum SendMessageType {
*/
private String dingDingWorkType;
/**
*
*/
private String enterpriseWeChatRobotType;
/**
*
*/
private String feiShuRobotType;
/**
* codeType
@ -75,5 +87,32 @@ public enum SendMessageType {
return null;
}
/**
* codeType
*
* @param code
* @return
*/
public static String getEnterpriseWeChatRobotTypeByCode(String code) {
for (SendMessageType value : SendMessageType.values()) {
if (value.getCode().equals(code)) {
return value.getEnterpriseWeChatRobotType();
}
}
return null;
}
/**
* codeType
*
* @param code
* @return
*/
public static String geFeiShuRobotTypeByCode(String code) {
for (SendMessageType value : SendMessageType.values()) {
if (value.getCode().equals(code)) {
return value.getFeiShuRobotType();
}
}
return null;
}
}

@ -0,0 +1,310 @@
package com.java3y.austin.handler.domain.feishu;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author 3y
*
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class FeiShuRobotParam {
/**
* msgType
*/
@JSONField(name = "msg_type")
private String msgType;
/**
* content
*/
@JSONField(name = "content")
private ContentDTO content;
/**
* card
*/
@JSONField(name = "card")
private CardDTO card;
/**
* ContentDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class ContentDTO {
/**
* text
*/
@JSONField(name = "text")
private String text;
/**
* post
*/
@JSONField(name = "post")
private PostDTO post;
/**
* shareChatId
*/
@JSONField(name = "share_chat_id")
private String shareChatId;
/**
* imageKey
*/
@JSONField(name = "image_key")
private String imageKey;
/**
* PostDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class PostDTO {
/**
* zhCn
*/
@JSONField(name = "zh_cn")
private ZhCnDTO zhCn;
/**
* ZhCnDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class ZhCnDTO {
/**
* title
*/
@JSONField(name = "title")
private String title;
/**
* content
*/
@JSONField(name = "content")
private List<List<ContentDTO.PostDTO.ZhCnDTO.PostContentDTO>> content;
/**
* ContentDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class PostContentDTO {
/**
* tag
*/
@JSONField(name = "tag")
private String tag;
/**
* text
*/
@JSONField(name = "text")
private String text;
/**
* href
*/
@JSONField(name = "href")
private String href;
/**
* userId
*/
@JSONField(name = "user_id")
private String userId;
}
}
}
}
/**
* CardDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class CardDTO {
/**
* config
*/
@JSONField(name = "config")
private ConfigDTO config;
/**
* elements
*/
@JSONField(name = "elements")
private List<ElementsDTO> elements;
/**
* header
*/
@JSONField(name = "header")
private HeaderDTO header;
/**
* ConfigDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class ConfigDTO {
/**
* wideScreenMode
*/
@JSONField(name = "wide_screen_mode")
private Boolean wideScreenMode;
/**
* enableForward
*/
@JSONField(name = "enable_forward")
private Boolean enableForward;
}
/**
* HeaderDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class HeaderDTO {
/**
* title
*/
@JSONField(name = "title")
private TitleDTO title;
/**
* TitleDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class TitleDTO {
/**
* content
*/
@JSONField(name = "content")
private String content;
/**
* tag
*/
@JSONField(name = "tag")
private String tag;
}
}
/**
* ElementsDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class ElementsDTO {
/**
* tag
*/
@JSONField(name = "tag")
private String tag;
/**
* text
*/
@JSONField(name = "text")
private TextDTO text;
/**
* actions
*/
@JSONField(name = "actions")
private List<ActionsDTO> actions;
/**
* TextDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class TextDTO {
/**
* content
*/
@JSONField(name = "content")
private String content;
/**
* tag
*/
@JSONField(name = "tag")
private String tag;
}
/**
* ActionsDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class ActionsDTO {
/**
* tag
*/
@JSONField(name = "tag")
private String tag;
/**
* text
*/
@JSONField(name = "text")
private TextDTO text;
/**
* url
*/
@JSONField(name = "url")
private String url;
/**
* type
*/
@JSONField(name = "type")
private String type;
/**
* value
*/
@JSONField(name = "value")
private ValueDTO value;
/**
* TextDTO
*/
@NoArgsConstructor
@Data
public static class TextDTO {
}
/**
* ValueDTO
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public static class ValueDTO {
}
}
}
}
}

@ -0,0 +1,58 @@
package com.java3y.austin.handler.domain.feishu;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 3y
*
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class FeiShuRobotResult {
/**
* extra
*/
@JSONField(name = "Extra")
private Object extra;
/**
* statusCode
*/
@JSONField(name = "StatusCode")
private Integer statusCode;
/**
* statusMessage
*/
@JSONField(name = "StatusMessage")
private String statusMessage;
/**
* code
*/
@JSONField(name = "code")
private Integer code;
/**
* msg
*/
@JSONField(name = "msg")
private String msg;
/**
* data
*/
@JSONField(name = "data")
private DataDTO data;
/**
* DataDTO
*/
@NoArgsConstructor
@Data
public static class DataDTO {
}
}

@ -0,0 +1,437 @@
package com.java3y.austin.handler.domain.wechat.robot;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
*
*
* https://open.dingtalk.com/document/group/custom-robot-access
*
* @author 3y
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EnterpriseWeChatRobotParam {
/**
* msgtype
*/
@JSONField(name = "msgtype")
private String msgType;
/**
* text
*/
@JSONField(name = "text")
private TextDTO text;
/**
* markdown
*/
@JSONField(name = "markdown")
private MarkdownDTO markdown;
/**
* markdown
*/
@JSONField(name = "image")
private ImageDTO image;
/**
* news
*/
@JSONField(name = "news")
private NewsDTO news;
/**
* file
*/
@JSONField(name = "file")
private FileDTO file;
/**
* templateCard
*/
@JSONField(name = "template_card")
private TemplateCardDTO templateCard;
/**
* TextDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class TextDTO {
/**
* content
*/
@JSONField(name = "content")
private String content;
/**
* mentionedList
*/
@JSONField(name = "mentioned_list")
private List<String> mentionedList;
/**
* mentionedMobileList
*/
@JSONField(name = "mentioned_mobile_list")
private List<String> mentionedMobileList;
}
/**
* MarkdownDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class MarkdownDTO {
/**
* content
*/
@JSONField(name = "content")
private String content;
}
/**
* ImageDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class ImageDTO {
/**
* base64
*/
@JSONField(name = "base64")
private String base64;
@JSONField(name = "md5")
private String md5;
}
/**
* NewsDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class NewsDTO {
/**
* articles
*/
@JSONField(name = "articles")
private List<ArticlesDTO> articles;
/**
* ArticlesDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class ArticlesDTO {
/**
* title
*/
@JSONField(name = "title")
private String title;
/**
* description
*/
@JSONField(name = "description")
private String description;
/**
* url
*/
@JSONField(name = "url")
private String url;
/**
* picurl
*/
@JSONField(name = "picurl")
private String picurl;
}
}
/**
* FileDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class FileDTO {
/**
* mediaId
*/
@JSONField(name = "media_id")
private String mediaId;
}
/**
* TemplateCardDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class TemplateCardDTO {
/**
* cardType
*/
@JSONField(name = "card_type")
private String cardType;
/**
* source
*/
@JSONField(name = "source")
private SourceDTO source;
/**
* mainTitle
*/
@JSONField(name = "main_title")
private MainTitleDTO mainTitle;
/**
* emphasisContent
*/
@JSONField(name = "emphasis_content")
private EmphasisContentDTO emphasisContent;
/**
* quoteArea
*/
@JSONField(name = "quote_area")
private QuoteAreaDTO quoteArea;
/**
* subTitleText
*/
@JSONField(name = "sub_title_text")
private String subTitleText;
/**
* horizontalContentList
*/
@JSONField(name = "horizontal_content_list")
private List<HorizontalContentListDTO> horizontalContentList;
/**
* jumpList
*/
@JSONField(name = "jump_list")
private List<JumpListDTO> jumpList;
/**
* cardAction
*/
@JSONField(name = "card_action")
private CardActionDTO cardAction;
/**
* SourceDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class SourceDTO {
/**
* iconUrl
*/
@JSONField(name = "icon_url")
private String iconUrl;
/**
* desc
*/
@JSONField(name = "desc")
private String desc;
/**
* descColor
*/
@JSONField(name = "desc_color")
private Integer descColor;
}
/**
* MainTitleDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class MainTitleDTO {
/**
* title
*/
@JSONField(name = "title")
private String title;
/**
* desc
*/
@JSONField(name = "desc")
private String desc;
}
/**
* EmphasisContentDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class EmphasisContentDTO {
/**
* title
*/
@JSONField(name = "title")
private String title;
/**
* desc
*/
@JSONField(name = "desc")
private String desc;
}
/**
* QuoteAreaDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class QuoteAreaDTO {
/**
* type
*/
@JSONField(name = "type")
private Integer type;
/**
* url
*/
@JSONField(name = "url")
private String url;
/**
* appid
*/
@JSONField(name = "appid")
private String appid;
/**
* pagepath
*/
@JSONField(name = "pagepath")
private String pagepath;
/**
* title
*/
@JSONField(name = "title")
private String title;
/**
* quoteText
*/
@JSONField(name = "quote_text")
private String quoteText;
}
/**
* CardActionDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class CardActionDTO {
/**
* type
*/
@JSONField(name = "type")
private Integer type;
/**
* url
*/
@JSONField(name = "url")
private String url;
/**
* appid
*/
@JSONField(name = "appid")
private String appid;
/**
* pagepath
*/
@JSONField(name = "pagepath")
private String pagepath;
}
/**
* HorizontalContentListDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class HorizontalContentListDTO {
/**
* keyname
*/
@JSONField(name = "keyname")
private String keyname;
/**
* value
*/
@JSONField(name = "value")
private String value;
/**
* type
*/
@JSONField(name = "type")
private Integer type;
/**
* url
*/
@JSONField(name = "url")
private String url;
/**
* mediaId
*/
@JSONField(name = "media_id")
private String mediaId;
}
/**
* JumpListDTO
*/
@NoArgsConstructor
@Data
@Builder
@AllArgsConstructor
public static class JumpListDTO {
/**
* type
*/
@JSONField(name = "type")
private Integer type;
/**
* url
*/
@JSONField(name = "url")
private String url;
/**
* title
*/
@JSONField(name = "title")
private String title;
/**
* appid
*/
@JSONField(name = "appid")
private String appid;
/**
* pagepath
*/
@JSONField(name = "pagepath")
private String pagepath;
}
}
}

@ -0,0 +1,106 @@
package com.java3y.austin.handler.handler.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Throwables;
import com.java3y.austin.common.constant.SendAccountConstant;
import com.java3y.austin.common.domain.TaskInfo;
import com.java3y.austin.common.dto.account.EnterpriseWeChatRobotAccount;
import com.java3y.austin.common.dto.model.EnterpriseWeChatRobotContentModel;
import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.common.enums.SendMessageType;
import com.java3y.austin.handler.domain.wechat.robot.EnterpriseWeChatRobotParam;
import com.java3y.austin.handler.handler.BaseHandler;
import com.java3y.austin.handler.handler.Handler;
import com.java3y.austin.support.domain.MessageTemplate;
import com.java3y.austin.support.utils.AccountUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
/**
*
*
* @author 3y
*/
@Slf4j
@Service
public class EnterpriseWeChatRobotHandler extends BaseHandler implements Handler {
@Autowired
private AccountUtils accountUtils;
public EnterpriseWeChatRobotHandler() {
channelCode = ChannelType.ENTERPRISE_WE_CHAT_ROBOT.getCode();
}
@Override
public boolean handler(TaskInfo taskInfo) {
try {
EnterpriseWeChatRobotAccount account = accountUtils.getAccount(taskInfo.getSendAccount(), SendAccountConstant.ENTERPRISE_WECHAT_ROBOT_ACCOUNT_KEY, SendAccountConstant.ENTERPRISE_WECHAT_ROBOT_PREFIX, EnterpriseWeChatRobotAccount.class);
EnterpriseWeChatRobotParam enterpriseWeChatRobotParam = assembleParam(taskInfo);
String result = HttpRequest.post(account.getWebhook()).header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue())
.body(JSON.toJSONString(enterpriseWeChatRobotParam))
.timeout(2000)
.execute().body();
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.getInteger("errcode") != 0) {
return true;
}
log.error("EnterpriseWeChatRobotHandler#handler fail! result:{},params:{}", JSON.toJSONString(jsonObject), JSON.toJSONString(taskInfo));
} catch (Exception e) {
log.error("EnterpriseWeChatRobotHandler#handler fail!e:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo));
}
return false;
}
private EnterpriseWeChatRobotParam assembleParam(TaskInfo taskInfo) {
EnterpriseWeChatRobotContentModel contentModel = (EnterpriseWeChatRobotContentModel) taskInfo.getContentModel();
EnterpriseWeChatRobotParam param = EnterpriseWeChatRobotParam.builder()
.msgType(SendMessageType.getEnterpriseWeChatRobotTypeByCode(contentModel.getSendType())).build();
if (SendMessageType.TEXT.getCode().equals(contentModel.getSendType())) {
param.setText(EnterpriseWeChatRobotParam.TextDTO.builder().content(contentModel.getContent()).build());
}
if (SendMessageType.MARKDOWN.getCode().equals(contentModel.getSendType())) {
param.setMarkdown(EnterpriseWeChatRobotParam.MarkdownDTO.builder().content(contentModel.getContent()).build());
}
if (SendMessageType.IMAGE.getCode().equals(contentModel.getSendType())) {
FileReader fileReader = new FileReader(contentModel.getImagePath());
byte[] bytes = fileReader.readBytes();
param.setImage(EnterpriseWeChatRobotParam.ImageDTO.builder().base64(Base64.encode(bytes))
.md5(DigestUtil.md5Hex(bytes)).build());
}
if (SendMessageType.FILE.getCode().equals(contentModel.getSendType())) {
param.setFile(EnterpriseWeChatRobotParam.FileDTO.builder().mediaId(contentModel.getMediaId()).build());
}
if (SendMessageType.NEWS.getCode().equals(contentModel.getSendType())) {
List<EnterpriseWeChatRobotParam.NewsDTO.ArticlesDTO> articlesDTOS = JSON.parseArray(contentModel.getArticles(), EnterpriseWeChatRobotParam.NewsDTO.ArticlesDTO.class);
param.setNews(EnterpriseWeChatRobotParam.NewsDTO.builder().articles(articlesDTOS).build());
}
if (SendMessageType.TEMPLATE_CARD.getCode().equals(contentModel.getSendType())) {
//
}
return param;
}
@Override
public void recall(MessageTemplate messageTemplate) {
}
}

@ -0,0 +1,106 @@
package com.java3y.austin.handler.handler.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Throwables;
import com.java3y.austin.common.constant.SendAccountConstant;
import com.java3y.austin.common.domain.TaskInfo;
import com.java3y.austin.common.dto.account.EnterpriseWeChatRobotAccount;
import com.java3y.austin.common.dto.account.FeiShuRobotAccount;
import com.java3y.austin.common.dto.model.EnterpriseWeChatRobotContentModel;
import com.java3y.austin.common.dto.model.FeiShuRobotContentModel;
import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.common.enums.SendMessageType;
import com.java3y.austin.handler.domain.feishu.FeiShuRobotParam;
import com.java3y.austin.handler.domain.feishu.FeiShuRobotResult;
import com.java3y.austin.handler.domain.wechat.robot.EnterpriseWeChatRobotParam;
import com.java3y.austin.handler.handler.BaseHandler;
import com.java3y.austin.handler.handler.Handler;
import com.java3y.austin.support.domain.MessageTemplate;
import com.java3y.austin.support.utils.AccountUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
*
*
* @author 3y
*/
@Slf4j
@Service
public class FeiShuRobotHandler extends BaseHandler implements Handler {
@Autowired
private AccountUtils accountUtils;
public FeiShuRobotHandler() {
channelCode = ChannelType.FEI_SHU_ROBOT.getCode();
}
@Override
public boolean handler(TaskInfo taskInfo) {
try {
FeiShuRobotAccount account = accountUtils.getAccount(taskInfo.getSendAccount(), SendAccountConstant.FEI_SHU_ROBOT_ACCOUNT_KEY, SendAccountConstant.FEI_SHU_ROBOT_PREFIX, FeiShuRobotAccount.class);
FeiShuRobotParam feiShuRobotParam = assembleParam(taskInfo);
String result = HttpRequest.post(account.getWebhook())
.header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue())
.body(JSON.toJSONString(feiShuRobotParam))
.timeout(2000)
.execute().body();
FeiShuRobotResult feiShuRobotResult = JSON.parseObject(result, FeiShuRobotResult.class);
if (feiShuRobotResult.getStatusCode() == 0) {
return true;
}
log.error("FeiShuRobotHandler#handler fail! result:{},params:{}", JSON.toJSONString(feiShuRobotResult), JSON.toJSONString(taskInfo));
} catch (Exception e) {
log.error("FeiShuRobotHandler#handler fail!e:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo));
}
return false;
}
private FeiShuRobotParam assembleParam(TaskInfo taskInfo) {
FeiShuRobotContentModel contentModel = (FeiShuRobotContentModel) taskInfo.getContentModel();
FeiShuRobotParam param = FeiShuRobotParam.builder()
.msgType(SendMessageType.geFeiShuRobotTypeByCode(contentModel.getSendType())).build();
if (SendMessageType.TEXT.getCode().equals(contentModel.getSendType())) {
param.setContent(FeiShuRobotParam.ContentDTO.builder().text(contentModel.getContent()).build());
}
if (SendMessageType.RICH_TEXT.getCode().equals(contentModel.getSendType())) {
List<FeiShuRobotParam.ContentDTO.PostDTO.ZhCnDTO.PostContentDTO> postContentDTOS = JSON.parseArray(contentModel.getPostContent(), FeiShuRobotParam.ContentDTO.PostDTO.ZhCnDTO.PostContentDTO.class);
List<List<FeiShuRobotParam.ContentDTO.PostDTO.ZhCnDTO.PostContentDTO>> postContentList = new ArrayList<>();
postContentList.add(postContentDTOS);
FeiShuRobotParam.ContentDTO.PostDTO postDTO = FeiShuRobotParam.ContentDTO.PostDTO.builder()
.zhCn(FeiShuRobotParam.ContentDTO.PostDTO.ZhCnDTO.builder().title(contentModel.getTitle()).content(postContentList).build())
.build();
param.setContent(FeiShuRobotParam.ContentDTO.builder().post(postDTO).build());
}
if (SendMessageType.SHARE_CHAT.getCode().equals(contentModel.getSendType())) {
param.setContent(FeiShuRobotParam.ContentDTO.builder().shareChatId(contentModel.getMediaId()).build());
}
if (SendMessageType.IMAGE.getCode().equals(contentModel.getSendType())) {
param.setContent(FeiShuRobotParam.ContentDTO.builder().imageKey(contentModel.getMediaId()).build());
}
if (SendMessageType.ACTION_CARD.getCode().equals(contentModel.getSendType())) {
//
}
return param;
}
@Override
public void recall(MessageTemplate messageTemplate) {
}
}

@ -68,6 +68,7 @@ public abstract class AbstractLazyPending<T> {
// 判断是否停止当前线程
if (stop && CollUtil.isEmpty(tasks)) {
executorService.shutdown();
break;
}
} catch (Exception e) {
@ -75,7 +76,7 @@ public abstract class AbstractLazyPending<T> {
}
}
});
executorService.shutdown();
}
/**

Loading…
Cancel
Save