本文档介绍如何在 Pig 框架中集成钉钉和企业微信机器人,实现消息通知功能。支持单机器人、多机器人配置,以及动态切换机器人等功能。

快速集成

1. 引入依赖

在项目中引入 Dinger 依赖:

<dependency>
    <groupId>com.pig4cloud.plugin</groupId>
    <artifactId>dinger-spring-boot-starter</artifactId>
    <version>0.0.1</version>
</dependency>

2. 配置机器人

在配置文件中添加机器人配置:

spring:
  dinger:
    project-id: ${spring.application.name}
    dingers:
      # 使用钉钉机器人,请根据自己机器人配置信息进行修改
      dingtalk:
        tokenId: tokenId 
        secret: secret

3. 使用示例

在代码中使用 Dinger 发送消息:

@Component
public class AppInit implements InitializingBean {
    @Autowired
    private DingerSender dingerSender;
    
    @Override
    public void afterPropertiesSet() throws Exception {
        // 发送 text 类型消息
        dingerSender.send(
                MessageSubType.TEXT,
                DingerRequest.request("Hello World, Hello Dinger")
        );

        // 发送 markdown 类型消息
        dingerSender.send(
                MessageSubType.MARKDOWN,
                DingerRequest.request("Hello World, Hello Dinger", "启动通知")
        );
    }
}

混合使用钉钉和企业微信机器人

1. 配置多机器人

在配置文件中同时配置钉钉和企业微信机器人:

spring:
  dinger:
    project-id: ${spring.application.name}
    # 默认使用企业微信
    default-dinger: wetalk
    dingers:
      # 使用钉钉机器人,请根据自己机器人配置信息进行修改
      dingtalk:
        tokenId: tokenId
        secret: secret
      # 使用企业微信机器人,请根据自己机器人配置信息进行修改
      wetalk:
        token-id: token-id

2. 使用示例

在代码中指定发送目标:

@Component
public class AppInit implements InitializingBean {
    @Autowired
    private DingerSender dingerSender;
    
    @Override
    public void afterPropertiesSet() throws Exception {
        // 指定发送给默认 Dinger(详见配置 spring.dinger.default-dinger 参数值)
        dingerSender.send(MessageSubType.TEXT, DingerRequest.request("Hello World, Hello Dinger"));
        // 指定发送给钉钉
        dingerSender.send(DingerType.DINGTALK, MessageSubType.MARKDOWN, DingerRequest.request("Hello World, Hello Dinger", "启动通知"));
    }
}

动态配置机器人

对于同一个消息体,可以同时发送给钉钉机器人和企业微信机器人。

1. 配置示例

spring:
  dinger:
    project-id: ${spring.application.name}
    # 默认使用钉钉
    default-dinger: dingtalk
    dingers:
      # 使用钉钉机器人,请根据自己机器人配置信息进行修改
      dingtalk:
        tokenId: tokenId
        secret: secret
      # 使用企业微信机器人,请根据自己机器人配置信息进行修改
      wetalk:
        token-id: token-id

2. 使用示例

@RestController
@Slf4j
public class DemoController {
    @Autowired
    private UserDinger userDinger;
    
    @Value("${spring.dinger.dingers.wetalk.tokenId}")
    private String wetalkToken;
    
    @GetMapping("/send")
    public Response send() {
        // 发送给钉钉群
        DingerResponse dingSuccess = userDinger.success("pig");
        log.info(objectMapper.writeValueAsString(dingSuccess));

        // 动态配置企业微信机器人信息
        DingerHelper.assignDinger(DingerType.WETALK, wetalkToken, false);
        // 发送给企业微信群
        DingerResponse weSuccess = userDinger.success("pig");
        log.info(objectMapper.writeValueAsString(weSuccess));
        
        return Response.success();
    }
}

多机器人配置

由于钉钉和企业微信有消息发送频率限制(每个机器人每分钟最多发送 20 条),这种限制可能导致消息发送失败。多机器人配置就是为了解决这种情况。

1. 全局配置方式

在启动类上启用多机器人配置:

@SpringBootApplication
// 启用多机器人配置功能
@EnableMultiDinger(
    // 启用钉钉多机器人配置
    @MultiDinger(
        dinger = DingerType.DINGTALK, 
        handler = DingTalkMultiHandler.class
    )
)
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

2. Dinger 级别配置

在 Dinger 接口上配置多机器人:

// 为 UserDinger 配置多机器人功能
@MultiHandler(
    @MultiDinger(
        dinger = DingerType.DINGTALK, 
        handler = DingTalkMultiHandler.class)
)
public interface UserDinger {
    @DingerText(value = "恭喜用户${loginName}登录成功!")
    DingerResponse success(@Parameter("loginName") String userName);

    @DingerMarkdown(
        value = "#### 用户登录通知\n - 用户 Id: ${userId}\n - 用户名: ${userName}",
        title = "用户登录反馈"
    )
    DingerResponse failed(long userId, String userName);
}

3. 支持的算法处理器

系统默认提供以下算法处理器:

处理器描述
DefaultHandler返回默认使用的机器人账号
DingerHandler消息频率限制算法(默认每分钟 20 条)
RandomHandler随机选择算法
RoundRobinHandler轮询算法

可以通过启动参数修改消息频率限制:-Dmulti.dinger.minute.limit.count=10

♥️ 获取支持

遇到问题?

如果您在使用过程中遇到任何问题、有功能建议或需求,请点击此卡片前往 Gitee 仓库提交 Issue。