接入 飞书机器人

master
3y 3 years ago
parent 7ea71af0a4
commit 7399f78092

@ -54,6 +54,12 @@ public class SendAccountConstant {
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 FeiShuRobotAccount {
/**
* webhook
*/
private String webhook;
}

@ -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,12 +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"),
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","text"),
VOICE("20", "语音", null, "voice",null),
VIDEO("30", "视频", null, null,null),
NEWS("40", "图文", "feedCard", null,"news"),
TEXT_CARD("50", "文本卡片", null, null,null),
FILE("60", "文件", null, "file","file"),
MINI_PROGRAM_NOTICE("70", "小程序通知", null, null,null),
MARKDOWN("80", "markdown", "markdown", "markdown","markdown"),
TEMPLATE_CARD("90", "模板卡片", null, null,"template_card"),
IMAGE("100", "图片", null, "image","image"),
LINK("110", "链接消息", "link", "link",null),
ACTION_CARD("120", "跳转卡片消息", "actionCard", "action_card",null),
OA("130", "OA消息", null, "oa",null),
MP_NEWS("140", "图文消息(mpnews)", null, 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")
;
@ -49,6 +51,11 @@ public enum SendMessageType {
*/
private String enterpriseWeChatRobotType;
/**
*
*/
private String feiShuRobotType;
/**
* codeType
@ -94,5 +101,18 @@ public enum SendMessageType {
}
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,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) {
}
}
Loading…
Cancel
Save