{"id":22960229,"url":"https://github.com/erzbir/numeron","last_synced_at":"2026-03-12T09:28:06.268Z","repository":{"id":63457489,"uuid":"567432636","full_name":"Erzbir/Numeron","owner":"Erzbir","description":"基于 Mirai 框架的 QQ 机器人项目, 支持多 bot, 可作脚手架快速开发","archived":false,"fork":false,"pushed_at":"2024-11-24T05:54:26.000Z","size":6428,"stargazers_count":18,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-05T06:49:42.479Z","etag":null,"topics":["annotations","java","kotlin","mirai","mirai-bot","mirai-core","qqbot","reflect","reflection","springboot"],"latest_commit_sha":null,"homepage":"https://erzbir.com","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Erzbir.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-11-17T19:28:19.000Z","updated_at":"2024-07-10T06:18:31.000Z","dependencies_parsed_at":"2024-12-14T18:35:51.206Z","dependency_job_id":"4d58ea4e-34ca-4c57-bb1c-023e8ecd6f20","html_url":"https://github.com/Erzbir/Numeron","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/Erzbir/Numeron","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Erzbir%2FNumeron","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Erzbir%2FNumeron/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Erzbir%2FNumeron/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Erzbir%2FNumeron/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Erzbir","download_url":"https://codeload.github.com/Erzbir/Numeron/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Erzbir%2FNumeron/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260915857,"owners_count":23082036,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["annotations","java","kotlin","mirai","mirai-bot","mirai-core","qqbot","reflect","reflection","springboot"],"created_at":"2024-12-14T18:31:37.867Z","updated_at":"2026-03-12T09:28:01.222Z","avatar_url":"https://github.com/Erzbir.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Numeron\n\n- [Numeron](#numeron)\n    - [介绍:](#介绍)\n        - [模块:](#模块)\n        - [实现的功能:](#plugin-模块实现的功能)\n    - [说明:](#说明)\n        - [只使用 bot 功能:](#只使用-bot-功能)\n        - [脚手架使用](#脚手架使用)\n            - [@Handler 使用:](#handler使用)\n            - [@Filter 使用:](#filter-使用)\n            - [@Permission 使用](#permission-使用)\n            - [用@Command生成指令表:](#command-生成指令表)\n            - [用@Menu生成图片菜单:](#menu-生成图片菜单)\n    - [开发计划:](#开发计划)\n    - [联系方式:](#联系方式)\n\n## 介绍:\n\n这是一个使用 mirai-core 开发的 qqBot, 添加了注解风格编程\n\n这个项目目前打算做成通用 bot 框架, 与具体的 bot 协议框架解耦\n\n有很多没有写进文档, 很多类也没有注释, 待补充......\n\n### 模块:\n\n- core: 脚手架(消息过滤和监听注册实现)\n- api: 监听注册等 api\n- mirai-bot: mirai 的实现 (计划做成适配器)\n- boot: 定义程序的启动\n- menu: 图片菜单生成\n- plugin: 实现的 bot 功能 (实际上应该作为此项目的一个子模块)\n- console: 控制台(待开发)和插件加载\n- utils: 一些通用工具\n\n因为打算与具体的 bot 框架分离, 结构可能会出现较大变化\n\n## plugin 模块实现的功能:\n\n- 消息回复\n- @禁言, qq号禁言\n- 全体禁言\n- 黑名单检测\n- 违禁词检测\n- 精准问答\n- 防撤回\n- 入群欢迎/退群反馈\n- 代码和命令执行, 支持JavaScript/Python/Shell\n- 群签到功能\n- 发送/help获取自动生成的命令表(在方法上加上 `@Command` 注解生成)\n- 对接openai\n    - 聊天\n    - 补全\n    - 问答\n    - 绘画\n- 游戏王查卡\n- rss订阅\n- 生成图片菜单目录\n\n## 说明:\n\n### 只使用 bot 功能:\n\n此部分由 mirai-core 提供底层实现\n\n第一次使用会使用控制台输入配置, 登陆后则会自动登陆, 提供多 bot 支持\n\n在 [mirai-bot](mirai-bot) 模块运行主函数即可\n\n\u003cb\u003e所有QQ机器人功能都写在[numeron-plugin](numeron-plugin)模块下\u003c/b\u003e\n\n### 脚手架使用:\n\n[@Component](numeron-api/src/main/java/com/erzbir/numeron/annotation/Component.java) 注解表示这个类需要注册到容器中\n[@Listener](numeron-api/src/main/java/com/erzbir/numeron/annotation/Listener.java) 注解表示这个类需要被当作 \"监听器\"\n注册到容器中\n\n如果作为脚手架使用, 必须使用 [numeron-boot](numeron-boot) 模块, 使用 `StarterController`\n将项目的启动类作为参数调用 `boot()` 方法\n\n```java\npublic class NumeronBotApplication {\n\n    public static void main(String[] args) {\n        StarterController starterController = new StarterController();\n        starterController.boot(NumeronBotApplication.class, NumeronBotApplication.class.getClassLoader());  // 调用 boot 方法初始化\n        BotServiceImpl.INSTANCE.loginAll();\n    }\n}\n```\n\n#### @Handler使用:\n\n\u003ccode\u003e[@Handler](numeron-api/src/main/java/com/erzbir/numeron/annotation/Handler.java)\u003c/code\u003e\n\n\u003e 将一个方法标记为监听回调, 监听的时间类型由参数决定\n\n\n此注解标注的方法由 \u003ccode\u003e[ListenerRegisterInter](numeron-api/src/main/java/com/erzbir/numeron/api/listener/ListenerRegisterInter.java)\u003c/code\u003e\n的实现类注册到 bot 框架监听\n\n```java\n\n@Listener\npublic class Test {\n\n    /**\n     * bot 收到群消息则会触发这个方法\n     */\n    @Handler\n    private void test(GroupMessageEvent event) {\n        event.getSubject().sendMessage(\"收到了群消息\");\n    }\n}\n```\n\n#### @Filter 使用:\n\n\u003ccode\u003e[@Filter](numeron-api/src/main/java/com/erzbir/numeron/annotation/Filter.java)\u003c/code\u003e\n\n此处参考了: [simple-robot](https://github.com/simple-robot/simpler-robot)\n\n此注解可以针对: 群 id, 事件发送者 id, bot id 以及消息事件的文本消息来进行规则过滤\n\n此注解可以实现简单的权限, 本项目提供了一个专门的权限过滤注解, 下文介绍\n\n```java\n\n@Listener\npublic class Test {\n\n    /**\n     * bot 收到群消息 \"hi\" 则会触发这个方法\n     */\n    @Handler\n    @Filter(\"hi\")\n    private void test(GroupMessageEvent event) {\n        event.getSubject().sendMessage(\"你好\");\n    }\n}\n```\n\n#### @Permission 使用:\n\n[@Permission](numeron-api/src/main/java/com/erzbir/numeron/annotation/Permission.java)\n\n此项目中提供了一个默认的权限实现, 也可以通过 spi\n实现 [PermissionService](numeron-api/src/main/java/com/erzbir/numeron/api/permission/PermissionService.java)\n接口实现自定义权限规则 (尚未开发完毕)\n\n```java\n\n@Listener\npublic class Test {\n\n    /**\n     * bot 收到主人发送的群消息 \"hi\" 则会触发这个方法\n     */\n    @Handler\n    @Filter(\"hi\")\n    @Permission(permission = PermissionType.MASTER)\n    private void test(GroupMessageEvent event) {\n        event.getSubject().sendMessage(\"主人你好\");\n    }\n}\n```\n\n#### @Command 生成指令表:\n此部分打算抽象一个 format 类负责格式化\n\n\u003ccode\u003e[@Command](numeron-api/src/main/java/com/erzbir/numeron/annotation/Command.java)\u003c/code\u003e\n\n```java\n\n@Listener\nclass Test {\n    @Command(\n            name = \"自动回复\",\n            dec = \"添加关键词回复\",\n            help = \"/learn ques answer\"\n    )\n    @Handler\n    @Filter(value = \"^/learn\\\\s+?.*?\\\\s+?.*\", matchType = MatchType.REGEX_MATCHES)\n    private void learn(MessageEvent e) {\n        String[] split = e.getMessage().contentToString().split(\"\\\\s+\");\n        if (split.length \u003c 3) {\n            return;\n        }\n        AutoReplyData.INSTANCE.add(split[1], split[2], e.getSender().getId());\n        e.getSubject().sendMessage(\"学会了\");\n    }\n\n    @Command(\n            name = \"自动回复\",\n            dec = \"删除关键词回复\",\n            help = \"/forget ques\"\n    )\n    @Handler\n    @Filter(value = \"^/forget\\\\s+\\\\S+\", matchType = MatchType.REGEX_MATCHES)\n    private void forget(MessageEvent e) {\n        String s = e.getMessage().contentToString().replaceAll(\"\\\\s+\", \"\");\n        if (s.isEmpty()) {\n            return;\n        }\n        AutoReplyData.INSTANCE.remove(s);\n        e.getSubject().sendMessage(\"忘掉了\");\n    }\n}\n```\n\n### @Menu 生成图片菜单:\n\n此部分打算抽象一个 format 类负责格式化\n\n\u003ccode\u003e[@Menu](numeron-menu/src/main/java/com/erzbir/numeron/menu/Menu.java)\u003c/code\u003e\n\n\n\u003e 有 @Command 会为这个 menu 生成帮助\n\n```java\n\n@Listener\n@Menu(name = \"学习对话\")\nclass Test {\n    @Command(\n            name = \"自动回复\",\n            dec = \"添加关键词回复\",\n            help = \"/learn ques answer\"\n    )\n    @Handler\n    @Filter(value = \"^/learn\\\\s+?.*?\\\\s+?.*\", matchType = MatchType.REGEX_MATCHES)\n    private void learn(MessageEvent e) {\n        String[] split = e.getMessage().contentToString().split(\"\\\\s+\");\n        if (split.length \u003c 3) {\n            return;\n        }\n        AutoReplyData.INSTANCE.add(split[1], split[2], e.getSender().getId());\n        e.getSubject().sendMessage(\"学会了\");\n    }\n\n    @Command(\n            name = \"自动回复\",\n            dec = \"删除关键词回复\",\n            help = \"/forget ques\"\n    )\n    @Handler\n    @Filter(value = \"^/forget\\\\s+\\\\S+\", matchType = MatchType.REGEX_MATCHES)\n    private void forget(MessageEvent e) {\n        String s = e.getMessage().contentToString().replaceAll(\"\\\\s+\", \"\");\n        if (s.isEmpty()) {\n            return;\n        }\n        AutoReplyData.INSTANCE.remove(s);\n        e.getSubject().sendMessage(\"忘掉了\");\n    }\n}\n```\n\n## 开发计划:\n\n- [ ] 群管理功能\n- [ ] console控制台\n- [ ] 与 bot 框架解耦\n- [x] 功能热加载\n- [x] 插件模式\n\n## 联系方式:\n\nemail:\n\n- erzbir@mail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferzbir%2Fnumeron","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferzbir%2Fnumeron","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferzbir%2Fnumeron/lists"}