# qqbot-starter **Repository Path**: wang-guanru/qqbot-starter ## Basic Information - **Project Name**: qqbot-starter - **Description**: QQ机器人springboot-starter - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-23 - **Last Updated**: 2026-01-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QQBot Starter 🤖 一个简单易用的Spring Boot Starter,用于快速集成QQ机器人API调用功能。 ## ✨ 特性 - **开箱即用** - 添加依赖即可使用,无需复杂配置 - **多机器人支持** - 一个项目可配置多个QQ机器人 - **完整消息类型** - 支持文本、图片、卡片、Markdown等消息类型 - **自动文件上传** - 图片消息支持URL自动上传 - **类型安全** - 强类型配置,IDE智能提示 - **设计模式优化** - 使用策略模式、建造者模式等,易于扩展 ## 📦 快速开始 ### 1. 添加依赖 ```xml com.github.rmyx qqbot-starter latest ``` ### 2. 配置文件 在 `application.yml` 中配置你的机器人信息: ```yaml qqbot: enabled: true default-bot: "bot1" # 默认使用的机器人 bots: bot1: # 机器人标识 appId: "你的AppId" appSecret: "你的AppSecret" botQQ: 123456789 name: "主机器人" bot2: appId: "另一个AppId" appSecret: "另一个AppSecret" botQQ: 987654321 name: "备用机器人" ``` ### 3. 使用示例 ```java @RestController public class BotController { @Autowired private QQBotClient qqBotClient; @GetMapping("/send-text") public String sendText() { // 使用默认机器人发送文本消息 return qqBotClient.sendTextMessage("Hello World!", "群组OpenId"); } } ``` ## 📋 功能详解 ### 群聊文本消息 ```java // 使用默认机器人 qqBotClient.sendTextMessage("消息内容", "群组OpenId"); // 指定机器人AppId qqBotClient.sendTextMessage("消息内容", "群组OpenId", "指定AppId"); // 通过指定的AppId发送 qqBotClient.sendTextMessage("消息内容", "群组OpenId", "102694979"); // 完整参数 qqBotClient.sendTextMessage("消息内容", "群组OpenId", "AppId", "回复消息Id", 序号); ``` ### 单聊文本消息 ```java // 使用默认机器人 qqBotClient.sendUserTextMessage("消息内容", "用户OpenId"); // 指定机器人AppId qqBotClient.sendUserTextMessage("消息内容", "用户OpenId", "指定AppId"); // 通过指定的AppId发送 qqBotClient.sendUserTextMessage("消息内容", "用户OpenId", "102694979"); // 完整参数 qqBotClient.sendUserTextMessage("消息内容", "用户OpenId", "AppId", "回复消息Id", 序号); ``` ### 群聊图片消息 ```java // 通过图片URL发送(推荐 - 自动上传) qqBotClient.sendImageByUrl("https://example.com/image.jpg", "图片描述", "群组OpenId"); // 指定机器人AppId qqBotClient.sendImageByUrl("https://example.com/image.jpg", "图片描述", "群组OpenId", "AppId"); // 使用已上传的媒体对象 Object media = uploadedMediaObject; qqBotClient.sendImageMessage(media, "图片描述", "群组OpenId"); // 通过指定的AppId发送 qqBotClient.sendImageByUrl("图片URL", "描述", "群组OpenId", "102694979"); ``` ### 单聊图片消息 ```java // 通过图片URL发送(推荐 - 自动上传) qqBotClient.sendUserImageByUrl("https://example.com/image.jpg", "图片描述", "用户OpenId"); // 指定机器人AppId qqBotClient.sendUserImageByUrl("https://example.com/image.jpg", "图片描述", "用户OpenId", "AppId"); // 使用已上传的媒体对象 Object media = uploadedMediaObject; qqBotClient.sendUserImageMessage(media, "图片描述", "用户OpenId"); // 通过指定的AppId发送 qqBotClient.sendUserImageByUrl("图片URL", "描述", "用户OpenId", "102694979"); ``` ### 群聊ARK卡片消息 ```java // 构建卡片参数 List params = Arrays.asList( new ArkModel.ArkParam("#TITLE#", "卡片标题"), new ArkModel.ArkParam("#DESC#", "卡片描述"), new ArkModel.ArkParam("#IMG#", "图片URL"), new ArkModel.ArkParam("#LINK#", "链接地址") ); // 发送群聊ARK卡片消息 qqBotClient.sendArkMessage(24, params, "群组OpenId"); ``` ### 单聊ARK卡片消息 ```java // 构建卡片参数 List params = Arrays.asList( new ArkModel.ArkParam("#TITLE#", "卡片标题"), new ArkModel.ArkParam("#DESC#", "卡片描述"), new ArkModel.ArkParam("#IMG#", "图片URL"), new ArkModel.ArkParam("#LINK#", "链接地址") ); // 发送单聊ARK卡片消息 qqBotClient.sendUserArkMessage(24, params, "用户OpenId"); ``` ### 群聊Markdown消息 ```java // 构建Markdown参数 List params = Arrays.asList( new MarkdownModel.MarkdownParam("key1", Arrays.asList("value1", "value2")) ); // 发送群聊Markdown消息(带键盘) qqBotClient.sendMarkdownMessage("模板Id", params, "键盘Id", "群组OpenId"); ``` ### 单聊Markdown消息 ```java // 构建Markdown参数 List params = Arrays.asList( new MarkdownModel.MarkdownParam("key1", Arrays.asList("value1", "value2")) ); // 发送单聊Markdown消息(带键盘) qqBotClient.sendUserMarkdownMessage("模板Id", params, "键盘Id", "用户OpenId"); ``` ### 高级用法 - 使用Builder构建复杂消息 ```java // 使用Builder构建文本消息 QQMessage textMessage = QQMessage.builder() .content("复杂消息内容") .msgType(MessageType.TEXT) .groupOpenId("群组OpenId") .appId("AppId") .msgId("回复的消息Id") .msgSeq(1) .build(); String messageId = qqBotClient.sendMessage(textMessage); // 使用Builder构建图片消息(通过URL) QQMessage imageMessage = QQMessage.builder() .content("图片描述") .msgType(MessageType.IMAGE) .groupOpenId("群组OpenId") .appId("AppId") .imageUrl("https://example.com/image.jpg") // 自动上传 .build(); qqBotClient.sendMessage(imageMessage); // 使用Builder构建图片消息(使用已上传media) QQMessage mediaMessage = QQMessage.builder() .content("图片描述") .msgType(MessageType.IMAGE) .groupOpenId("群组OpenId") .appId("AppId") .media(uploadedMediaObject) // 已上传的媒体对象 .build(); qqBotClient.sendMessage(mediaMessage); ``` ## 🔧 配置说明 ### 基础配置 | 配置项 | 说明 | 默认值 | 必填 | |--------|------|--------|------| | `qqbot.enabled` | 是否启用QQBot功能 | `true` | 否 | | `qqbot.default-bot` | 默认使用的机器人Key | 无 | 否 | ### 机器人配置 | 配置项 | 说明 | 必填 | |--------|------|------| | `qqbot.bots.[key].appId` | 机器人的AppId | 是 | | `qqbot.bots.[key].appSecret` | 机器人的AppSecret | 是 | | `qqbot.bots.[key].botQQ` | 机器人的QQ号 | 是 | | `qqbot.bots.[key].name` | 机器人名称(用于标识) | 否 | ### 完整配置示例 ```yaml qqbot: enabled: true default-bot: "main" bots: main: appId: "102692983" appSecret: "your-app-secret" botQQ: 3889603116 name: "主机器人" backup: appId: "102694979" appSecret: "backup-app-secret" botQQ: 3889605001 name: "备用机器人" ``` ## 🎯 最佳实践 ### 1. 多机器人场景 ```java @Service public class BotService { @Autowired private QQBotClient qqBotClient; public void sendNotification(String content, String groupId) { try { // 优先使用主机器人 qqBotClient.sendTextMessage(content, groupId, "102692983"); } catch (Exception e) { // 主机器人失败时使用备用机器人 qqBotClient.sendTextMessage(content, groupId, "102694979"); } } } ``` ### 2. 消息发送封装 ```java @Component public class MessageHelper { @Autowired private QQBotClient qqBotClient; public String sendRichMessage(String groupId, String title, String content, String imageUrl) { if (imageUrl != null) { return qqBotClient.sendImageByUrl(imageUrl, title + "\n" + content, groupId); } else { return qqBotClient.sendTextMessage(title + "\n" + content, groupId); } } } ``` ### 3. 异常处理 ```java @Service public class SafeBotService { @Autowired private QQBotClient qqBotClient; public boolean sendSafeMessage(String content, String groupId) { try { String messageId = qqBotClient.sendTextMessage(content, groupId); return messageId != null; } catch (Exception e) { log.error("发送消息失败: {}", e.getMessage()); return false; } } } ``` ## 🏗️ 架构设计 项目采用了多种设计模式: - **策略模式** - 不同消息类型使用不同的发送策略 - **建造者模式** - QQMessage支持Builder模式构建 - **模板方法模式** - AbstractMessageSender统一发送流程 - **依赖注入** - Spring IoC容器管理所有组件 ## 🐛 常见问题 ### Q: 提示找不到QQBotClient Bean? A: 确保配置文件正确,检查`qqbot.enabled=true` ### Q: Token获取失败? A: 检查AppId和AppSecret是否正确,网络是否正常 ### Q: 图片发送失败? A: 确保图片URL可访问,或检查上传的media对象格式 ### Q: 多机器人如何选择? A: 可以通过botKey指定,或设置default-bot ## 📄 许可证 MIT License ## 🤝 贡献 欢迎提交Issue和Pull Request! ## 📞 支持 如有问题,请提交Issue或联系作者。