package com.java3y.austin.handler.handler.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiMessageCorpconversationRecallRequest;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiMessageCorpconversationRecallResponse;
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.LogParam;
import com.java3y.austin.common.domain.TaskInfo;
import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount;
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.handler.BaseHandler;
import com.java3y.austin.handler.handler.Handler;
import com.java3y.austin.support.config.SupportThreadPoolConfig;
import com.java3y.austin.support.domain.MessageTemplate;
import com.java3y.austin.support.utils.AccountUtils;
import com.java3y.austin.support.utils.LogUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* 钉钉消息自定义机器人 消息处理器
* <p>
* https://open.dingtalk.com/document/group/custom-robot-access
*
* @author 3y
*/
@Slf4j
@Service
public class DingDingWorkNoticeHandler extends BaseHandler implements Handler {
@Autowired
private AccountUtils accountUtils;
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private LogUtils logUtils;
public DingDingWorkNoticeHandler() {
channelCode = ChannelType.DING_DING_WORK_NOTICE.getCode();
}
private static final String SEND_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2";
private static final String RECALL_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/recall";
private static final String DING_DING_RECALL_KEY_PREFIX = "RECALL_";
private static final String RECALL_BIZ_TYPE = "DingDingWorkNoticeHandler#recall";
@Override
public boolean handler(TaskInfo taskInfo) {
try {
DingDingWorkNoticeAccount account = accountUtils.getAccount(taskInfo.getSendAccount(), SendAccountConstant.DING_DING_WORK_NOTICE_ACCOUNT_KEY, SendAccountConstant.DING_DING_WORK_NOTICE_PREFIX, DingDingWorkNoticeAccount.class);
OapiMessageCorpconversationAsyncsendV2Request request = assembleParam(account, taskInfo);
String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount());
OapiMessageCorpconversationAsyncsendV2Response response = new DefaultDingTalkClient(SEND_URL).execute(request, accessToken);
// 发送成功后记录TaskId,用于消息撤回(支持当天的)
if (response.getErrcode() == 0) {
redisTemplate.opsForList().leftPush(DING_DING_RECALL_KEY_PREFIX + taskInfo.getMessageTemplateId(), String.valueOf(response.getTaskId()));
redisTemplate.expire(DING_DING_RECALL_KEY_PREFIX + taskInfo.getMessageTemplateId(), (DateUtil.endOfDay(new Date()).getTime() - DateUtil.current()) / 1000, TimeUnit.SECONDS);
return true;
}
// 常见的错误 应当 关联至 AnchorState,由austin后台统一透出失败原因
log.error("DingDingWorkNoticeHandler#handler fail!result:{},params:{}", JSON.toJSONString(response), JSON.toJSONString(taskInfo));
} catch (Exception e) {
log.error("DingDingWorkNoticeHandler#handler fail!{},params:{}", Throwables.getStackTraceAsString(e), taskInfo);
}
return false;
}
/**
* 拼装参数
*
* @param account
* @param taskInfo
*/
private OapiMessageCorpconversationAsyncsendV2Request assembleParam(DingDingWorkNoticeAccount account, TaskInfo taskInfo) {
OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
DingDingWorkContentModel contentModel = (DingDingWorkContentModel) taskInfo.getContentModel();
try {
// 接收者相关
if (AustinConstant.SEND_ALL.equals(CollUtil.getFirst(taskInfo.getReceiver()))) {
req.setToAllUser(true);
} else {
req.setUseridList(StringUtils.join(taskInfo.getReceiver(), StrUtil.C_COMMA));
}
req.setAgentId(Long.parseLong(account.getAgentId()));
OapiMessageCorpconversationAsyncsendV2Request.Msg message = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
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.getMediaId());
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(contentMod
没有合适的资源?快使用搜索试试~ 我知道了~
austin-消息推送平台
共268个文件
java:232个
xml:11个
yml:10个
需积分: 21 2 下载量 8 浏览量
2022-11-12
13:51:22
上传
评论 1
收藏 306KB ZIP 举报
温馨提示
消息推送平台,推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。 所使用的技术栈包括:SpringBoot、SpringDataJPA、MySQL、Docker、docker-compose、Kafka、Redis、Apollo、prometheus、Grafana、GrayLog、Flink、Xxl-job、Echarts等等
资源推荐
资源详情
资源评论
收起资源包目录
austin-消息推送平台 (268个子文件)
redis.conf 178B
example.csv 677B
Dockerfile 306B
.gitignore 415B
DingDingWorkNoticeHandler.java 11KB
EnterpriseWeChatRobotParam.java 9KB
DataServiceImpl.java 9KB
CronTaskServiceImpl.java 8KB
FeiShuRobotParam.java 7KB
MessageTemplateController.java 7KB
PushHandler.java 7KB
EnterpriseWeChatHandler.java 7KB
DingDingRobotHandler.java 6KB
MessageTemplateServiceImpl.java 6KB
SmsHandler.java 6KB
AssembleAction.java 6KB
OkHttpUtils.java 5KB
RedisUtils.java 5KB
TencentSmsScript.java 5KB
FeiShuRobotHandler.java 5KB
EnterpriseWeChatRobotHandler.java 5KB
TencentSmsReceipt.java 4KB
YunPianSmsScript.java 4KB
FlowControlFactory.java 4KB
ReadFileUtils.java 4KB
ConvertMap.java 4KB
MiniProgramAccountServiceImpl.java 4KB
AccountUtils.java 4KB
AlipayMiniProgramAccountServiceImpl.java 4KB
OfficialAccountServiceImpl.java 4KB
ReceiverStart.java 4KB
XxlJobUtils.java 4KB
SendServiceImplTest.java 4KB
DingDingRobotParam.java 4KB
AbstractLazyPending.java 3KB
RefreshGeTuiAccessTokenHandler.java 3KB
CrowdBatchTaskPending.java 3KB
SendMessageType.java 3KB
Receiver.java 3KB
TaskHandlerImpl.java 3KB
AfterParamCheckAction.java 3KB
EmailHandler.java 3KB
SendAccountConstant.java 3KB
RefreshDingDingAccessTokenHandler.java 3KB
SimpleLimitService.java 3KB
AustinSink.java 3KB
OkHttpConfiguration.java 3KB
ProcessController.java 3KB
PipelineConfig.java 3KB
SendServiceImpl.java 3KB
BasicResultVO.java 3KB
CronAsyncThreadPoolConfig.java 3KB
ShieldServiceImpl.java 3KB
MaterialServiceImpl.java 2KB
ChannelType.java 2KB
SlideWindowLimitService.java 2KB
SendMqAction.java 2KB
MessageTemplate.java 2KB
MiniProgramAccountHandler.java 2KB
AlipayMiniProgramAccountHandler.java 2KB
PreParamCheckAction.java 2KB
ChannelAccountController.java 2KB
DataController.java 2KB
SendPushParam.java 2KB
ConsumeServiceImpl.java 2KB
ThreadPoolExecutorShutdownDefinition.java 2KB
DingDingWorkReceipt.java 2KB
NightShieldLazyPendingHandler.java 2KB
OfficialAccountHandler.java 2KB
ContentHolderUtil.java 2KB
XxlJobInfo.java 2KB
BaseHandler.java 2KB
EchartsVo.java 2KB
NacosUtils.java 2KB
MaterialController.java 2KB
DingDingWorkContentModel.java 2KB
LogUtils.java 2KB
AustinService.java 2KB
DingDingRobotContentModel.java 2KB
Task.java 2KB
SwaggerConfiguration.java 2KB
AbstractDeduplicationService.java 2KB
AustinBootStrap.java 2KB
EventBusSendMqServiceImpl.java 2KB
MessageReceipt.java 2KB
EnterpriseWeChatContentModel.java 2KB
TaskPendingHolder.java 2KB
KafkaSendMqServiceImpl.java 2KB
XxlJobConfig.java 2KB
YunPianSendResult.java 2KB
LettuceRedisUtils.java 2KB
ConfigServiceImpl.java 2KB
TaskInfoUtils.java 2KB
RocketMqRecallReceiver.java 2KB
RefreshTokenController.java 2KB
RocketMqBizReceiver.java 2KB
DeduplicationRuleService.java 1KB
ChannelAccountServiceImpl.java 1KB
FrequencyDeduplicationService.java 1KB
HandlerThreadPoolConfig.java 1KB
共 268 条
- 1
- 2
- 3
资源评论
m0_72731342
- 粉丝: 2
- 资源: 1832
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功