维护花了一点时间,抱歉。。。。。。。。。
在本次攻击事件中暴露了一些网站安全性相关的问题。为了应对未来可能遭遇的各种类型的攻击。在这段时间里我们可能会进行各种安全相关的更新。
本次更新新增了发帖验证码系统,任何人发布新主题或者是回帖都需要完成验证码。
此外我们建立了MiraiForumGithub组织,开放了几个由我们编写的插件,欢迎大家提出意见或者是建议。如果无法通过论坛联系我们也可以通过组织联系我们。
请阅读: 论坛规则 常见问题QA 无法登录的临时处理方案
源代码和文档: mamoe/mirai, docs.mirai.mamoe.net
闲聊TG群: @mirai_mamoe, Gitter群 mamoe/mirai
“不好!这里要撑不下去了”
“A4 求救,A4 求救,A32 地区的沙雕数量超过阈值,即将突破防线!”
“什么!?啧。。”
“B8 已完成沙雕清除任务,现赶往 A32 地区”
“这样。。什么时候是个头啊。。”
如果想订阅本贴更新可以点击右上角铃铛🔔按钮
【持续时间】
1970.1.1 ~ 114514.12.31
【活动内容】
糟糕!沙雕小别墅遭到了从未知之处涌出的沙雕攻击,防御工事濒临崩溃,如果能用其他的方法击退它们的话。。
对了!沙雕图!
【参与方式】
在本贴中回复沙雕图,协助沙雕防御工事击退沙雕。
【活动奖励】
从其他 miraier 获取的沙雕图!是不是非常丰厚呢?
【注意事项】
遵守摸鱼区规则。
是沙雕图不是涩图!
【样例】
3c2dfb62-5555-4c00-a17b-d76715bf2088-image.png
目前个人搭建机器人进度 - 正在 window 下跑 mcl,在 Android 下用 sakura 做验证码操作, 提示 code 45.
不想一步一步的踩坑了,第三方验证服务什么的还没研究, 自己搭不确定能不能一步到位。
希望有朋友帮忙搭一下 (预算有限,只能v50 红包,当交个朋友)
需求是
主机长期运行 qq 机器人在线(几天重启一次也没关系) http 或者 ws 插件安装,可以让我用 node.js 编写机器人的收发逻辑处理。只需要协助帮忙搭建和登录运行机器人,其他任何业务逻辑都是这边处理的。
本人有服务器有主机,希望可以给个可靠的搭建路径和出错后直接的问题解决办法。
😋又更新了!!火树下载,体验最新内容!
提取码:oHoM,点击下载 DeepseekMirai[1.31](123云盘)
虽然是这一天更的新,但是还是希望没有人会开玩笑。
新增功能:
1.添加了聊天命令“%usage”,可以随时查看当前会话的总tokens使用量,将enableTokenCounting设置为True即可正常使用。(可能会稍微影响性能。)
2.自动骚扰!将chatMode更改成annoyingBot即可体验!!
3.“%model”命令改为了从配置文件(DsModelList.json)中加载模型,使用 %model 快捷名称 即可快速切换。首次使用自动创建deepseek的配置文件,可以自行添加修改。
4.可以在配置文件(DsModel.json)中修改到更多的api参数,比如说重复惩罚,但是请去官网的文档学习一下怎么配置哦!
5.优化了传给AI的用户信息,包含群名、群u是否是管理员、是否@bot等。
6.高仿的Mirai后台输出
修复问题:
1.“%apibalance” 又可以用了,虽然仅对deepseek的api起作用。
已知问题:
1.annoyingBot模式下不会响应任何命令,你执行其他mirai 命令的消息也有概率被获取
2.可执行文件比以前“更大”了
配置文件详解,兼任功能介绍:
{ "code": "0", "host": "你的api插件地址,只支持http/s协议,末尾要带斜杠/", "verifykeys": "你的api插件的密钥", "botqq": "绑定的机器人", "deepseekapiaddress": "https://api.deepseek.com", "deepseekapikey": "去Deepseek官网申请来的api密钥", "deepseekapimodel": "支持deepseek-chat和deepseek-reasoner", "requesttimeSleep": "(int)刷新消息延迟,默认为1秒,过长可能出问题," "enableTokenCounting":true, "是否开启“%usage”一键查token" "chatConfig": { "chatMode": "answerUser,已经支持answerUser(常规问答)和annoyingBot(自动骚扰)", "annoyingBotModeConfig": { "annoyingBotDefaultPrompt": "自动骚扰的默认提醒词,默认带的是骂人的", "hitChance": 60, "触发概率,范围1-100" "replyAlltime":[ "谁的触发概率是100%", 123456 ], "neverReply": [ "谁永远不会触发" 789012 ] }, "tipsA0": "没什么用(谁说json里写不了注释?)", "listenGroups": [ "监听群,两种模式均生效。" 123456, 789109 ], "listenFriends": [ "监听好友,两种模式均生效。" 10000, 10011 ], "blockuserList": [ "黑名单,仅常规模式生效,黑名单对管理员也有效。" 12345678 ], "showblockMessages": true,是否提醒被拉黑的用户 "atBot": false,触发是否需要@bot "atUser":false,回复中是否@触发者 "sendUserInfo": false,是否发送用户信息,仅群生效 "analyzeUserInfoPrompt": "",用来让AI识别并理解用户信息,且应用在回复中的提示词,两种聊天模式通用,会补在你的提示词的前面。 "ATmessagePrefixs": [],拆开长句时回复的那11个前缀,尽量不要动最后一个空 "adminMode":false,是否为白名单(管理员)模式 "breaklongSentence": true,把长句拆开,分开发送 "RadicalOptimization": false,所谓的“激进”优化,在拆开长句时生效。 "commandPrefix": { "answerUser": "%chat,触发提问的消息前缀,留空可以关闭触发前缀。", "adminQQs": [ "管理员QQ列表,第一位最牛逼。" 66666666666 ], "tipsA1": "以下命令只有管理员QQ可以触发,除了changePrompt、clearChatLog、memorySync之外的命令均需要首位管理员才能触发。", "changeModel": "%model,快速更改模型的命令前缀", "changePrompt": "%prompt,快速修改当前群/私聊提醒词的命令前缀", "clearChatLog": "%rmrf,删除当前会话聊天历史", "checkApiBalance": "%apibalance,查询已配置的API密钥的余额", "addBlackList": "%black,拉黑某用户的命令前缀", "memorySync": "%memory,大记忆恢复术(加载其他会话或保存的聊天历史)的命令前缀", "addGroupList": "%addg,添加检测群的命令前缀", "addFriendsList": "%addf,添加检测私聊的命令前缀", "memorySave":"%save,保存当前对话的命令前缀,没提供名字默认群号/私聊QQ号" "addAdmin":"%adda,添加管理员的命令前缀,只有管理员列表第一位能用" "checkTokens":"%usage,快速查询总token用量,但是有思维链的模型的思维链不会被计算" }, "defaultPrompt": "默认提醒词,没填就是猫娘咯" }, "savetime": 1743004265, "configVersion": 1.3 } 过往内容:没啥太大用了,点击展开即可查看。
... ================================ 2025-3-27更新:提取码:zJ3Z,点击下载 DeepseekMirai[1.2](123云盘)
稍微测试了一下,新功能全部好用!
配置文件内容更新:
请按照下方详解,重新修改配置文件
或查看修改详情:
太麻烦了,现在都是自动更新了!☺️
确保原有配置文件可读,运行第一次自动更新!
新增功能:
1.对于特别长特别长的回复做了一个"激进的"优化,同时设置breakLongSentence和RadicalOptimization为true即可体验!(其实就是优化了一下回复速度)
2.添加了可以把群友信息发送给AI的选项,设置sendUserInfo为true即可体验。该功能会自动把【群友群昵称(群友QQ号)】添加在发送给AI的内容的前面,并尝试修补提示词来让AI识别到用户的信息 (里面自带的可能不咋好用😭)
3.可以自定义设置在拆开的长句的前面的随机小前缀。(最后一位留空的是关闭拆开长句时的回复前缀,如果喜欢可以填上。)
修复问题:
1.每次升级后要手动更新配置文件,太麻烦了,改成自动升级了。
已知问题:
1"激进优化"下通1000问在回复中出现emoji会导致对话整个被截断,因为ds没问题所以怀疑是阿里的问题
2.在新运行自动创建配置文件的时候添加的管理员可能以str形式写入了配置文件,不知道会不会因此产生问题(?)
3.%apibalance用不了了,好像是验证出错。。
提取码:T61O,点击下载 DeepseekMirai[1.1]废.exe(123云盘)
提取码4NmD,点击下载 DeepseekMirai[1.1](123云盘)
更新的有点着急了(笑),没怎么测试,但是我猜应该没什么问题吧(叉腰)
配置文件内容更新:
请按照下方详解,重新修改配置文件
或查看修改详情:
在chatConfig里加入了atUser,和adminMode两个布尔值,
在chatConfig.commandPrefix里加入了addAdmin 文本值,默认为"%adda"
当你遇到TypeError: startswith first arg must be str or a tuple of str, not NoneType这样的问题,就是没有更新配置文件导致的
新增功能:
1.多人同时触发回复时会在回复内容中@触发者,并在拆开的长句的每一句前面都加上了随机的小前缀(共11种)
2.加入了白名单模式,如果开启将只回复所有群中的被配置的管理员,其他任何人无法触发,私聊不受影响。
3.加入快捷添加管理员的指令,默认前缀为"%adda"
4.(链接2)新增可以自定义temperature和max_tokens的配置文件
下次许愿什么功能呢?
修复问题:
1.当一次性收到太多的消息时会出现多提供参数的问题,导致没有一条消息被回复。
2.(链接2)当不拆开长句时开启atUser导致消息链没有被正确组装
提取码:qzhV,点击下载 DeepseekMirai-1.0.exe(123云盘)
(运行效果可能不太好,尽力了)
小提示:
1.将commandPrefix中的answerUser设置为空,同时打开atBot,可以做到@bot直接触发,无需其他前缀。私聊直接触发,无需@。
2.你可以去Deepseek官网的聊天页面,让它帮你生成人设,然后填到提醒词里,这样你就拥有了属于自己的"QQ智能体?"
3.如果愿意,可以加一下群哦 (虽然没啥人) ~ 1028466667
使用俺维护的GOCQ维护分支:https://github.com/ProtocolScience/AstralGocq
登录流程巨大优化(如果出现签名异常,可以修改config移除ws协议的签名,该属于实验性特性)
开源了一个没有完全过检测的版本,可以正常运行高版本的so文件,希望起到抛砖引玉,促进研究的作用 https://github.com/zhaodice/Astral-QSignigngnn
——出现CC攻击后的措施——当服务器负载较大时,优先拒绝消耗量较大的IP的请求,如需IP白名单请联系。
——服务器目前开放的版本——9.0.55-9.0.95
9.1.0-9.1.15
(这就是直连的下场,由于被打流量打成黑洞,已无法连接)
服务器地址(自2024-08,租赁1年时间):http://8.216.82.28/
服务器地址(主要A,cloudflare):https://qsign.trpgbot.com
服务器地址(CDN线路):http://qsign-v3.trpgbot.com
服务器地址(端口转发,月流限制1G):http://qsign.w1.luyouxia.net
服务器地址(主要B,huggingface):https://zyr15r-astralqsign.hf.space
——注意事项——新的key:miraibbs
对本贴内容做了门户:https://qsign-guide.trpgbot.com/
1.服务器已全部迁移至主服务器,处理了一下主机的散热器问题,现在性能应该足够了。
2.除了 qsign.trpgbot.com ,其他的都是它的镜像,如果有条件也可以自己反向代理
ANDROID_PAD
{ "apk_id": "com.tencent.mobileqq", "app_id": 537220362, "sub_app_id": 537220362, "app_key": "0S200MNJT807V3GE", "sort_version_name": "9.0.56.16830", "build_time": 1713424357, "apk_sign": "a6b745bf24a2c277527716f6f36eb68d", "sdk_version": "6.0.0.2560", "sso_version": 21, "misc_bitmap": 150470524, "main_sig_map": 34869472, "sub_sig_map": 66560, "dump_time": 1713424357, "qua": "V1_AND_SQ_9.0.56_6372_YYB_D", "protocol_type": 6 } Mirai - 傻瓜式插件直接安装插件即可正常登录 https://github.com/MrXiaoM/fpv/releases/tag/v1.13.1
(它属于 fix-protocol-version 插件的开发分支,因为功能相同所以可能冲突,一山不容二虎哦,使用时请注意禁用相关插件)
mirai KFCFactory.json 使用配置:
{ "9.0.56": { "base_url": "https://qsign.trpgbot.com", "type": "fuqiuluo/unidbg-fetch-qsign", "key": "miraibbs" } }同时请另存为 协议配置文件(ANDROID_PAD)的数据内容到 ANDROID_PAD.json ,数据内容上文已给出
控制台输入 protocol load ANDROID_PAD
即可用ANDROID_PAD协议登录你的QQ
gocq config.yml使用配置:
sign-servers: - url: 'http://8.216.82.28/' key: 'miraibbs' authorization: '-' - url: https://qsign.trpgbot.com/' key: 'miraibbs' authorization: '-' auto-register: true同时请另存为 协议配置文件(ANDROID_PAD)的数据内容到 /data/versions/6.json ,数据内容上文已给出
测试结果607af2d3-ed77-49ea-a9b5-b3ac8adb98c4.png
新注册的账号使用本sign,在24小时后仍未出现冻结现象,证明已经通关。
有任何问题欢迎进行交流讨论,最后感谢fuqiuluo提供的unidbg调用思路以及各位逆向工作者的支持。
https://blast.tv/counter-strikle/multiplayer
🌱 插件处于初期开发阶段 只实现了基础功能 | 有任何建议或者想法可以在issue中提出 🛠️安装&依赖前置 从Release中下载最新版本 将Zip文件解压并放入 %mirai文件根目录%/ 中 重新启动你的mirai-console 在群内输入 /开始猜选手 开始游戏 🛠️依赖前置(请安装到你搭建机器人的服务器上) mirai-skia-plugin Mirai-console 2.16版本或以上 Chat-Command 🚀代办清单 (可以订阅Release来获取更新) 制作完整版 🧐已拥有的功能 基本的猜选手小游戏实现 国旗显示支持 170个选手数据 🔑指令 /开始猜选手 /结束猜选手指令需要给予相关权限才可以使用
org.bcz.guesscs2proplayer:command.开始猜选手 org.bcz.guesscs2proplayer:command.结束猜选手 📷插件截图施工中
💡 选手数据整理为csv文件放置在/data/org.bcz.guesscs2proplayer/中 💡 目前使用的爬取方法为我自己的python项目,效果一般 💡如有较为完美的思路或者程序可以在issue中告诉我 💡prodown13:42:47 [INFO] iTX Technologies Mirai Console Loader version 2.1.2-61c8bd8
13:42:47 [INFO] Runtime: OpenJDK 64-Bit Server VM 17.0.14 (arch: 64)
13:42:47 [INFO] https://github.com/iTXTech/mirai-console-loader
13:42:47 [INFO] This program is licensed under GNU AGPL v3
13:42:48 [INFO] Mirai Console Loader Announcement:
Mirai Console Loader 公告栏
如果在图片上传的时候遇到问题请与我们联系 (需要提供图片文件源本)
- 如 Unsupported image type for ExternalResource * considering use gif/png/bmp/jpg format.
`- Tracker: https://github.com/mamoe/mirai/issues/new/choose
常用资源整合
`- https://mirai.mamoe.net/topic/653
MCL 已推出 2.1.0,更好的支持 Mirai 2.11 的插件系统,建议更新。
13:42:48 [INFO] Verifying "net.mamoe:mirai-console" v2.16.0
13:42:49 [INFO] Verifying "net.mamoe:mirai-console-terminal" v2.16.0
13:42:49 [INFO] Verifying "net.mamoe:mirai-core-all" v2.16.0
13:42:50 [INFO] Verifying "org.itxtech:mcl-addon" v2.1.1
2025-03-25 13:42:52 I/main: Starting mirai-console...
2025-03-25 13:42:52 I/main:
===================================[ Mirai console 2.16.0 ]===================================
| \ / \ \ | / \ |
| ▓▓\ / ▓▓\▓▓ ______ ______ \▓▓ ▓▓▓▓▓▓\ ______ _______ _______ ______ | ▓▓ ______
| ▓▓▓\ / ▓▓▓ / \ | | \ ▓▓ \▓▓/ | \ / / | ▓▓/
| ▓▓▓▓\ ▓▓▓▓ ▓▓ ▓▓▓▓▓▓\ \▓▓▓▓▓▓\ ▓▓ ▓▓ | ▓▓▓▓▓▓\ ▓▓▓▓▓▓▓\ ▓▓▓▓▓▓▓ ▓▓▓▓▓▓\ ▓▓ ▓▓▓▓▓▓
| ▓▓\▓▓ ▓▓ ▓▓ ▓▓ ▓▓ \▓▓/ ▓▓ ▓▓ ▓▓ | ▓▓ | ▓▓ ▓▓ | ▓▓\▓▓ | ▓▓ | ▓▓ ▓▓ ▓▓ ▓▓
| ▓▓ \▓▓▓| ▓▓ ▓▓ ▓▓ | ▓▓▓▓▓▓▓ ▓▓ ▓▓/ \ ▓▓__/ ▓▓ ▓▓ | ▓▓_\▓▓▓▓▓▓\ ▓▓__/ ▓▓ ▓▓ ▓▓▓▓▓▓▓▓
| ▓▓ \▓ | ▓▓ ▓▓ ▓▓ \▓▓ ▓▓ ▓▓\▓▓ ▓▓\▓▓ ▓▓ ▓▓ | ▓▓ ▓▓\▓▓ ▓▓ ▓▓\▓▓
\▓▓ \▓▓\▓▓\▓▓ \▓▓▓▓▓▓▓\▓▓ \▓▓▓▓▓▓ \▓▓▓▓▓▓ \▓▓ \▓▓\▓▓▓▓▓▓▓ \▓▓▓▓▓▓ \▓▓ \▓▓▓▓▓▓▓
2025-03-25 13:42:52 I/main: Backend: version 2.16.0, built on 2023-10-20 06:28:10.
2025-03-25 13:42:52 I/main: Frontend Terminal: version 2.16.0, provided by Mamoe Technologies
2025-03-25 13:42:52 I/main: Welcome to visit https://mirai.mamoe.net/
2025-03-25 13:43:00 I/plugin: Successfully loaded plugin mirai-api-http v2.10.0
2025-03-25 13:43:01 W/mirai-login-solver-sakura: default port 22333 already in use.
java.net.BindException: Address already in use: bind
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Unknown Source)
at java.base/sun.nio.ch.Net.bind(Unknown Source)
at java.base/sun.nio.ch.NioSocketImpl.bind(Unknown Source)
at java.base/java.net.ServerSocket.bind(Unknown Source)
at java.base/java.net.ServerSocket.bind(Unknown Source)
at mirai-login-solver-sakura-0.0.12.mirai2.jar//com.kasukusakura.mlss.slovbroadcast.SakuraTransmitDaemon.bootServer(SakuraTransmitDaemon.kt:73)
at mirai-login-solver-sakura-0.0.12.mirai2.jar//com.kasukusakura.mlss.slovbroadcast.SakuraTransmitDaemon.bootServer$default(SakuraTransmitDaemon.kt:66)
at mirai-login-solver-sakura-0.0.12.mirai2.jar//com.kasukusakura.mlss.console.ConsolePluginMain.onLoad(ConsolePluginMain.kt:50)
at net.mamoe.mirai.console.internal.plugin.JvmPluginInternal.internalOnLoad$mirai_console(JvmPluginInternal.kt:388)
at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.load(BuiltInJvmPluginLoaderImpl.kt:371)
at net.mamoe.mirai.console.internal.plugin.BuiltInJvmPluginLoaderImpl.load(BuiltInJvmPluginLoaderImpl.kt:40)
at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.load(JvmPluginLoader.kt)
at net.mamoe.mirai.console.plugin.jvm.JvmPluginLoader$BuiltIn.load(JvmPluginLoader.kt:54)
at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.loadPluginNoEnable(PluginManagerImpl.kt:100)
at net.mamoe.mirai.console.internal.plugin.PluginManagerImpl.loadAllPluginsUsingBuiltInLoaders$mirai_console(PluginManagerImpl.kt:164)
at net.mamoe.mirai.console.internal.MiraiConsoleImplementationBridge.doStart$mirai_console(MiraiConsoleImplementationBridge.kt:303)
at net.mamoe.mirai.console.MiraiConsoleImplementation$Companion.start(MiraiConsoleImplementation.kt:512)
at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon(MiraiConsoleTerminalLoader.kt:182)
at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.startAsDaemon$default(MiraiConsoleTerminalLoader.kt:181)
at net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader.main(MiraiConsoleTerminalLoader.kt:59)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at org.itxtech.mcl.Utility.bootJars(Utility.java:86)
at org.itxtech.mcl.Utility.bootJars(Utility.java:76)
at org.itxtech.mcl.Utility.bootMirai(Utility.java:98)
at org.itxtech.mcl.module.builtin.Boot.boot(Boot.java:113)
at org.itxtech.mcl.module.ModuleManager.phaseBoot(ModuleManager.java:123)
at org.itxtech.mcl.Loader.lambda$start$4(Loader.java:196)
at org.itxtech.mcl.Loader.tryCatching(Loader.java:151)
at org.itxtech.mcl.Loader.start(Loader.java:196)
at org.itxtech.mcl.Loader.main(Loader.java:84)
2025-03-25 13:43:01 I/plugin: Successfully loaded plugin mirai-login-solver-sakura v0.0.12
2025-03-25 13:43:01 I/trpgbot: 协议版本检查更新...
2025-03-25 13:43:02 I/trpgbot: ANDROID_PAD load from
file:///D:/summer/desktop/Miari_Console_Launcher/android_pad.json
2025-03-25 13:43:02 I/trpgbot: 注册服务...
2025-03-25 13:43:02 I/trpgbot: 服务配置文件:
file:///D:/summer/desktop/Miari_Console_Launcher/network.json
2025-03-25 13:43:02 W/trpgbot: 您正在使用远程签名服务,数据包将经过签名服务器,请勿添加不可信源
2025-03-25 13:43:02 W/EncryptService.alert: Encrypt service was loaded: trpgbot.NetworkServiceFactory(config=file:///D:/summer/desktop/Miari_Console_Launcher/network.json)
2025-03-25 13:43:02 W/EncryptService.alert: All outgoing message may be leaked by this service.
2025-03-25 13:43:02 W/EncryptService.alert: Use this service if and only if you trusted this service and the service provider.
2025-03-25 13:43:02 W/EncryptService.alert: Service details:
2025-03-25 13:43:02 W/EncryptService.alert: - Jvm Class: class xyz.cssxsh.mirai.tool.NetworkServiceFactory 2025-03-25 13:43:02 W/EncryptService.alert: - ClassLoader: JvmPluginClassLoader{trpgbot-1.13.5.mirai2.jar}
2025-03-25 13:43:02 W/EncryptService.alert: - Source: file:/D:/summer/desktop/Miari_Console_Launcher/plugins/trpgbot-1.13.5.mirai2.jar 2025-03-25 13:43:02 W/EncryptService.alert: - Protected Domain: ProtectionDomain (file:/D:/summer/desktop/Miari_Console_Launcher/plugins/trpgbot-1.13.5.mirai2.jar <no signer certificates>)
JvmPluginClassLoader{trpgbot-1.13.5.mirai2.jar}
<no principals>
java.security.Permissions@21527b8 (
("java.io.FilePermission" "D:\summer\desktop\Miari_Console_Launcher\plugins\trpgbot-1.13.5.mirai2.jar" "read")
)
2025-03-25 13:43:02 I/trpgbot: 正在运行 trpgbot.qsign v1.13.5
2025-03-25 13:43:02 I/trpgbot: 正在检查可用的签名服务器
2025-03-25 13:43:02 I/trpgbot.factory: 正在尝试连接 主服务器 https://qsign.trpgbot.com
2025-03-25 13:43:03 I/trpgbot.factory: 服务器 https://qsign.trpgbot.com 可用
2025-03-25 13:43:03 I/trpgbot.factory: 签名服务器推荐版本: 9.0.56
2025-03-25 13:43:03 I/trpgbot.factory: 支持签名+在仓库中的版本: 9.1.60, 9.1.55, 9.1.50, 9.1.5, 9.1.35, 9.1.30, 9.1.25, 9.1.20, 9.1.16, 9.1.15, 9.1.10, 9.1.0, 9.0.95, 9.0.90, 9.0.85, 9.0.81, 9.0.65, 9.0.60, 9.0.56
2025-03-25 13:43:03 I/trpgbot.factory: 配置指定的目标版本: latest
2025-03-25 13:43:03 I/trpgbot.factory: 已将 ANDROID_PAD 从本地配置自动升级至 9.0.56.16830
2025-03-25 13:43:03 I/plugin: Successfully loaded plugin trpgbot v1.13.5
2025-03-25 13:43:03 I/plugin: Successfully loaded plugin MCL Addon v2.1.1
2025-03-25 13:43:03 I/main: Prepared built-in commands: autoLogin, help, login, logout, permission, status, stop
2025-03-25 13:43:05 W/mirai-api-http: USING INITIAL KEY, please edit the key
2025-03-25 13:43:05 I/Mirai HTTP API: ********************************************************
2025-03-25 13:43:05 I/MahKtorAdapter[http,ws]: Autoreload is disabled because the development mode is off.
2025-03-25 13:43:05 I/MahKtorAdapter[http,ws]: Application started in 0.291 seconds.
2025-03-25 13:43:05 E/mirai-api-http: kotlinx.coroutines.JobCancellationException: LazyStandaloneCoroutine is cancelling; job=LazyStandaloneCoroutine{Cancelling}@65d7eea4
kotlinx.coroutines.JobCancellationException: LazyStandaloneCoroutine is cancelling; job=LazyStandaloneCoroutine{Cancelling}@65d7eea4
Caused by: java.net.BindException: Address already in use: bind
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Unknown Source)
at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(Unknown Source)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.ConnectUtilsJvmKt.bind(ConnectUtilsJvm.kt:35)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.TcpSocketBuilder.bind(TcpSocketBuilder.kt:45)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.TcpSocketBuilder.bind(TcpSocketBuilder.kt:29)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.TcpSocketBuilder.bind$default(TcpSocketBuilder.kt:25)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.server.cio.backend.HttpServerKt$httpServer$acceptJob$1.invokeSuspend(HttpServer.kt:48)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
2025-03-25 13:43:05 E/MahKtorAdapter[http,ws]: java.net.BindException: Address already in use: bind
java.net.BindException: Address already in use: bind
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Unknown Source)
at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(Unknown Source)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.ConnectUtilsJvmKt.bind(ConnectUtilsJvm.kt:35)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.TcpSocketBuilder.bind(TcpSocketBuilder.kt:45)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.TcpSocketBuilder.bind(TcpSocketBuilder.kt:29)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.network.sockets.TcpSocketBuilder.bind$default(TcpSocketBuilder.kt:25)
at mirai-api-http-2.10.0.mirai2.jar[shared]//io.ktor.server.cio.backend.HttpServerKt$httpServer$acceptJob$1.invokeSuspend(HttpServer.kt:48)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
2025-03-25 13:43:05 I/trpgbot: 当前各登录协议版本日期:
ANDROID_PHONE 8.9.58.11170 2023-05-19T11:35+08:00
ANDROID_PAD 9.0.56.16830 2024-04-18T15:12:37+08:00
ANDROID_WATCH 9.0.3 2022-03-23T10:14:56+08:00
IPAD 8.9.50.611 2023-02-16T15:10:14+08:00
MACOS 6.8.2.21241 2022-03-14T11:11:35+08:00
2025-03-25 13:43:05 I/MCL Addon: iTXTech MCL Version: 2.1.2-61c8bd8
2025-03-25 13:43:05 W/MCL Addon: iTXTech Soyuz 未安装,Soyuz MCL Handler 特性已禁用
2025-03-25 13:43:05 I/main: 4 plugin(s) enabled.
2025-03-25 13:43:05 I/main: Auto-login 1829881350, protocol: ANDROID_PAD, heartbeatStrategy: STAT_HB
2025-03-25 13:43:05 I/trpgbot.factory: 创建 EncryptService(id=1829881350), protocol=ANDROID_PAD(9.0.56) from file:///D:/summer/desktop/Miari_Console_Launcher/network.json
2025-03-25 13:43:05 I/trpgbot.factory: 正在尝试连接 主服务器 https://qsign.trpgbot.com
2025-03-25 13:43:06 I/trpgbot.factory: 服务器 https://qsign.trpgbot.com 可用
2025-03-25 13:43:06 I/trpgbot.factory: trpgbot from https://qsign.trpgbot.com 测试连接成功
{"code":0,"data":{"protocol":{"code":"6372","package_name":"com.tencent.mobileqq","qua":"V1_AND_SQ_9.0.56_6372_YYB_D","version":"9.0.56"},"stat":{"Speed":{"SIGN-OPM5":1044,"SIGN-OPS":3,"SIGN-OPM":232,"SIGN-OPM10":2088},"Call":{"Energy":9379,"Sign":70107},"Errors":{"Attack":868},"Performance":{"Energy":72,"Sign":849}},"instances":["0c1b","0c21-2","0c21","0c1b-3","0c21-5","0c1b-2","0c21-4","0c21-3","0c19","0c1f-2","0c1f"],"version":"1.2.4","support":["9.0.65","9.0.55","9.0.85","9.0.56","9.0.81","9.0.70","9.0.60","9.1.20","9.1.16","9.1.15","9.0.95","9.1.55","9.1.35","9.1.50","9.1.60","9.0.90","9.1.30","9.1.25","9.0.25","9.0.3","9.1.10","9.1.5","9.1.0"]}}
IAA 云天明 章北海 赵怡然内部签名
2025-03-25 13:43:06 W/trpgbot.factory: trpgbot key is empty
2025-03-25 13:43:07 I/trpgbot.adapter.http: Bot(1829881350) initialize by https://qsign.trpgbot.com
2025-03-25 13:43:08 I/trpgbot.adapter.http: Bot(1829881350) register, 注册成功。
2025-03-25 13:43:08 I/trpgbot.adapter.http: Bot(1829881350) initialize complete
2025-03-25 13:43:10 I/Bot.1829881350: Calculating type 2 PoW, it can take some time....
2025-03-25 13:43:10 I/Bot.1829881350: Got PoW result, cost: 107 ms
2025-03-25 13:43:44 I/Bot.1829881350: Login successful
2025-03-25 13:43:45 I/Bot.1829881350: Saved account secrets to local cache for fast login.
2025-03-25 13:43:45 I/Bot.1829881350: Login successful.
2025-03-25 13:43:45 V/Bot.1829881350: Event: BotOnlineEvent(bot=Bot(1829881350))
2025-03-25 13:43:45 I/Bot.1829881350: Bot login successful.
2025-03-25 13:43:45 I/main: Auto-login 3930700296, protocol: ANDROID_PAD, heartbeatStrategy: STAT_HB
2025-03-25 13:43:45 I/trpgbot.factory: 创建 EncryptService(id=3930700296), protocol=ANDROID_PAD(9.0.56) from file:///D:/summer/desktop/Miari_Console_Launcher/network.json
2025-03-25 13:43:45 I/trpgbot.factory: 正在尝试连接 主服务器 https://qsign.trpgbot.com
2025-03-25 13:43:48 I/trpgbot.factory: 服务器 https://qsign.trpgbot.com 可用
2025-03-25 13:43:48 I/trpgbot.factory: trpgbot from https://qsign.trpgbot.com 测试连接成功
{"code":0,"data":{"protocol":{"code":"6372","package_name":"com.tencent.mobileqq","qua":"V1_AND_SQ_9.0.56_6372_YYB_D","version":"9.0.56"},"stat":{"Speed":{"SIGN-OPM5":1032,"SIGN-OPS":3,"SIGN-OPM":225,"SIGN-OPM10":2091},"Call":{"Energy":9387,"Sign":70183},"Errors":{"Attack":868},"Performance":{"Energy":77,"Sign":49}},"instances":["0c1b","0c21-2","0c21","0c1b-3","0c21-5","0c1b-2","0c21-4","0c21-3","0c19","0c1f-2","0c1f"],"version":"1.2.4","support":["9.0.65","9.0.55","9.0.85","9.0.56","9.0.81","9.0.70","9.0.60","9.1.20","9.1.16","9.1.15","9.0.95","9.1.55","9.1.35","9.1.50","9.1.60","9.0.90","9.1.30","9.1.25","9.0.25","9.0.3","9.1.10","9.1.5","9.1.0"]}}
2025-03-25 13:43:48 V/Bot.1829881350: Event: AutoLoginEvent.Success(bot=1829881350, protocol=ANDROID_PAD, heartbeatStrategy=STAT_HB)
IAA 云天明 章北海 赵怡然内部签名
2025-03-25 13:43:48 W/trpgbot.factory: trpgbot key is empty
2025-03-25 13:43:48 I/trpgbot.adapter.http: Bot(3930700296) initialize by https://qsign.trpgbot.com
2025-03-25 13:43:54 I/trpgbot.adapter.http: Bot(3930700296) register, 注册成功。
2025-03-25 13:43:55 I/trpgbot.adapter.http: Bot(3930700296) initialize complete
2025-03-25 13:43:59 I/Bot.3930700296: Calculating type 2 PoW, it can take some time....
2025-03-25 13:43:59 I/Bot.3930700296: Got PoW result, cost: 18 ms
2025-03-25 13:44:11 I/trpgbot.adapter.http: Bot(3930700296) destroy, 销毁失败,该实例为公有实例,您没有权限进行销毁,请 确保你提供了正确的uin和qua/ver版本号
2025-03-25 13:44:11 E/main: net.mamoe.mirai.network.BotAuthorizationException: BotAuthorization(BotAuthorization.byPassword(<ERASED>)) threw an exception during authorization process. See cause below.
net.mamoe.mirai.network.BotAuthorizationException: BotAuthorization(BotAuthorization.byPassword(<ERASED>)) threw an exception during authorization process. See cause below.
at net.mamoe.mirai.internal.network.components.SsoProcessorImpl.login(SsoProcessor.kt:263)
at net.mamoe.mirai.internal.network.handler.CommonNetworkHandler$StateConnecting$startState$2.invokeSuspend(CommonNetworkHandler.kt:247)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
Suppressed: net.mamoe.mirai.network.WrongPasswordException: Error(bot=Bot(3930700296), code=45, title=禁止登录, message=你当前使用的QQ版本过低,请前往QQ官网im.qq.com下载最新版QQ后重试。, errorInfo=)
at net.mamoe.mirai.internal.network.components.SsoProcessorImpl$SlowLoginImpl.doLogin(SsoProcessor.kt:490)
at net.mamoe.mirai.internal.network.components.SsoProcessorImpl$SlowLoginImpl$doLogin$1.invokeSuspend(SsoProcessor.kt)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.ScopeCoroutine.afterResume(Scopes.kt:33)
at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
... 5 more
Caused by: [CIRCULAR REFERENCE: net.mamoe.mirai.network.WrongPasswordException: Error(bot=Bot(3930700296), code=45, title=禁止登录, message=你当前使用的QQ版本过低,请前往QQ官网im.qq.com下载最新版QQ后重试。, errorInfo=)]
2025-03-25 13:44:11 I/Bot.3930700296: Bot cancelled: Bot closed
2025-03-25 13:44:11 V/Bot.3930700296: Event: AutoLoginEvent.Failure(bot=3930700296, protocol=ANDROID_PAD, cause=net.mamoe.mirai.network.BotAuthorizationException: BotAuthorization(BotAuthorization.byPassword(<ERASED>)) threw an exception during authorization process. See cause below.)
2025-03-25 13:44:11 I/main: mirai-console started successfully.
仓库地址
Bot is Watching you.👁️
若APIKey与欲查询的用户为同一个账号时,设置游戏私密功能将无效 新成就大约4分钟后才能被Bot发现 修改刷新间隔配置后需要重载插件依赖文件 libHarfBuzzSharp.dll libSkiaSharp.dll 放置在框架/加载器的 根目录 或者 x86 文件夹 或者 libraies 文件夹 Assets.zip 解压后放置在插件的数据目录内,保留 Assets 文件夹
5dfe2e77-1fe4-469c-91b2-ac26d0b8a6ac-image.png
7f17bccd-8625-48d2-841a-9c2fa50a14fc-image.png
不是所有人都能够科学上网,这里我将整合好的仓库放在这里
一个简单的整合心血来潮想弄一个QQ的机器人,然后找到这样的框架,在登录的时候遇到些问题,在官方的帖子里翻了翻,以及对应启动控制台的错误信息自己做了一些调整,做了这样一个整合的包,大家可以直接down下来直接用,我这里简单介绍一下如何使用。
登录登录的步骤我们需要前往这个仓库,下载一个app,你问我为什么要下这个app,我也不知道,这是日志提示的需要我去下,安装后,点开是这个界面。
d1ac17eb18b1a39be8e614fe8d94a924.jpg
考虑到并不是所有人都能科学上网,我将这个apk放到仓库,你可以down下来直接用,名字叫这个
apk-release.apk完成后,我们在mcl的控制台输入以下命令
login qq账号 qq密码 ANDROID_PAD1742820154892.png
接着使用你下载好的扫码app扫码登录
1742820249339.png
1742820398165.png
这样就完成登录了,我这个目前只是完成了登录操作,后面就是api的使用,然后我这个是没有安装http模块,大家可以依靠根据需求自行安装。
问题解决依据觉得解决你的问题就点个赞吧
如题,这是一个参考了yiri-mirai,用来接入onebot实现的python sdk。
对习惯了yiri-mirai的开发者来说,几乎不需要任何学习成本即可上手使用。
在隔壁群看到的,但是无论怎么搜关键字都找不到类似的,有没有用过的大佬知道
3647b18f-97f6-425a-979a-e29c79522b39-image.png
Petpet - 生成各种奇怪的图片 已更新 6.2 版本, 支持多线程, 可自定义 头像 文字 坐标 概率 关键词 频率限制 等参数项目地址 releases 前端版本 / 功能预览
如果你觉得此插件对你有帮助, 请在此帖下回复不错的插件 让更多人看到, 这对我非常重要!
PetpetMirai version
GitHub
GitHub all releases
GitHub Repo stars
GitHub release (latest by date)
GitHub issues
GitHub closed issues
GitHub closed pull requests
自定义合成图片的 Mirai 插件 / 独立程序 / gocq-http插件, 灵感/部分数据来自 nonebot-plugin-petpet。
原生 java 编写, kotlin仅用于数据序列化, 使用底层API, 多线程优化: 轻量, 高性能, 易拓展
使用方法 单独运行下载 最新版本 petpet.jar 或 petpet-no-ws.jar
下载 图片素材
将图片素材放入 ./data/xmmt.dituon.petpet/ 目录
运行 start.bat 或 start.sh, 可自行更改配置文件 config.json, 重启后生效
参考WebServer一节 发起网络请求 / 或使用WebUI
Mirai插件部署 Mirai 机器人框架
下载 最新版本
将插件放入 Mirai/plugins/
下载 图片素材
将图片素材放入 Mirai/data/xmmt.dituon.petpet/
启动 Mirai, 可自行更改配置文件 Petpet.yml, 重启后生效 (参考 配置项说明)
使用 戳一戳 有 30% 的概率触发; 或发送 pet @xxxpet key @xxx 或 key @xxx 可返回指定图片 例如 pet kiss @xxx kiss @xxx
可通过发送的图片生成Petpet kiss [图片], 支持GIF
可通过回复构造图片, 例如 [图片] -> [回复[图片]] 对称
gocq-http插件可使用 pet指令 获取 keyList
Warning
此功能处于测试阶段, 目前仅能通过key生成图片, 请期待后续开发!
部署 gocq-http 机器人框架, 设置正向 WebSocket 监听 (默认端口为8080)
更改 gocq-http 配置项 message.post-format 为 array
下载 最新版本 petpet.jar
下载 图片素材
将图片素材放入 ./data/xmmt.dituon.petpet/ 目录
cd ./ java -jar petpet.jar -gocq, 可自行更改配置文件 gocq-config.json, 重启后生效
配置文件 配置项说明<details>
<summary>展开/收起</summary>
<br/>
probability: 30触发petpet指令, 默认为pet
例: pet @xxx pet kiss @xxx
仅发送pet时会返回keyList
<br/>
antialias: true戳一戳 触发概率, 0-100整数, 默认为 30%
<br/>
resampling: true画布抗锯齿, 默认为true
<br/>
disabled: []重采样缩放, 启用后头像质量更高, 可对模板单独配置
<br/>
keyCommandHead: ''禁用表列, 默认为空, 在此数组中的key不会被随机触发 (会覆盖data.json中的配置)
<br/>
respondReply: truekey作为指令头时的前缀, 默认为空
例 (配置项为'#'时): #kiss @xxx osu hso!
<br/>
cachePoolSize: 10000响应回复的消息, 默认为true
可通过回复消息 定位到之前发送的图片并构造petpet
启用后 会缓存接收到的图片(见cachePoolSize)
例 : [回复[图片]]kiss(等价于 kiss [图片])
<br/>
respondSelfNudge: falserespondReply=true时, 图片消息缓存池大小, 默认为10000
本质为HashMap<imageId(long), imageUrl(String)>, 超过此限制会清空Map
<br/>
keyListFormat: FORWARD某些情况下, 机器人会主动戳其他成员, 响应机器人自己发出的戳一戳, 默认为false
<br/>
disablePolicy: FULL发送pet时 keyList响应格式, 默认为FORWARD
枚举: MESSAGE(发送普通消息) FORWARD(发送转发消息) IMAGE(发送图片)
<br/>
fuzzy: false发送pet on/off时 禁用哪些功能, 默认为FULL
枚举: NONE(无效) NUDGE(只禁用戳一戳) MESSAGE(只禁用指令) FULL(同时禁用戳一戳和指令)
strictCommand: true模糊匹配用户名, 默认为false
例 : (配置项为true时): kiss @田所浩二(响应) kiss 浩二(响应)
<br/>
synchronized: false严格匹配指令, 默认为true
人话: 可以省略key后的空格
例 : (配置项为false时): kiss 田所(响应) kiss田所(响应)
<br/>
gifEncoder: ANIMATED_LIB消息事件同步锁, 会锁住相同的消息事件, 默认为false
人话: 多机器人对于同一条指令只有一个会响应
<br/>
GIF编码器, 默认为ANIMATED_LIB
枚举:
编码速度较慢, 所需堆内存小, 生成Gif体积小
BUFFERED_STREAM:
基于缓存的STREAM流, 在编码过程中对Gif进行压缩;ANIMATED_LIB:
编码速度极快, 所需堆内存较多, 生成Gif体积较小
基于byte[]序列, 使用多线程分析像素;
<br/>
gifMaxSize: []gifQuality: 5GIF缩放阈值/尺寸, 默认为空 (不限制)
[width, height, frameLength]:
当Gif长度超过frameLength时, 会对Gif进行等比例缩放
注: 缩放在图片合成时进行, 不会影响性能
例: (配置项为[200, 200, 32]时)
当Gif长度超过32帧时, 检查Gif尺寸 当Gif尺寸大于200*200时, 对Gif进行等比例缩放 Gif缩放后 最长边不会超过设定值
(当Gif中包含40帧, 尺寸为300*500时) 输出的Gif长度不变, 尺寸为120*200
headless: trueGif编码质量(1-49), 默认为5
数字越小, 速度越慢, 质量越好 (大于20时, 速度不会有明显提升)
仅适用于ANIMATED_LIB编码器
autoUpdate: true启用headless模式, 默认为true
人话: 有些服务器没有输入输出设备, 画图库无法正常运行, 启用这个配置项可以修复, 因为总是有人不看常见问题, 干脆默认启用了(
<br/>
repositoryUrl: 'https://dituon.github.io/petpet'自动更新PetData, 每次启动时都会检查并自动下载船新pet, 默认为true
注: 仅更新PetData, 不会更新插件版本, 请放心食用
人话: 每次启动都会自动下载新的超赞梗图, 墙裂推荐
<br/>
devMode: false仓库地址, 用于自动更新, 默认为此仓库的github page
messageHook: false开发模式, 启用后任何人都能使用pet reload指令热重载PetData, 默认为false
<br/>
coolDown: 1000消息注入, 参考MessageHook, 默认为false
<br/>
groupCoolDown: -1成功触发指令后对该用户的冷却时间(单位为毫秒), 默认为 1000
设置为 -1 可禁用冷却
<br/>
inCoolDownMessage: 技能冷却中...成功触发指令后对该群聊的冷却时间, 默认为 -1
<br/>
在冷却时间中触发命令的回复消息
配置项为[nudge]时, 会以戳一戳形式回复
<br/>
</details>
修改后重启 Mirai 以重新加载
权限管理群主或管理员使用 pet on pet off 以 启用/禁用 戳一戳
pet on/off指令控制的事件可在配置文件中更改
图片预览 自定义 data.json可在配置文件中禁用指定key, 被禁用的key不会随机触发, 但仍可以通过指令使用
./data/xmmt.dituon.petpet/ 下的目录名为 key ,插件启动时会遍历 ./data/xmmt.dituon.petpet/$key/data.json
data.json 是模板配置文件, 程序解析此文件以生成图像
{ "type": "GIF", "avatar": [], "text": [], "delay": 50, "alias": [ "别名1", "别名2" ] } 属性 类型 注释 默认值 type 模板类型枚举 图片类型枚举, IMG或GIF 必须 avatar Avatar 数组 头像配置数组, 见下文 必须 text Text 数组 文本配置数组, 见下文 必须 inRandomList 布尔值 是否在随机列表中 false reverse 布尔值 GIF是否倒放 false delay 整数 帧间延时 (毫秒) 65 background Background 背景配置, 见下文 null alias 字符串数组 别名数组 [] hidden 布尔值 是否隐藏 false 模板类型枚举 GIF 动图, 程序会读取目录下所有.png格式的图像 IMG 静态图片, 程序会读取目录下随机.png格式的图像 头像程序支持复杂的图像处理, 包括裁切, 旋转, 透明度, 滤镜等
{ "avatar": [ { "type": "FROM", "pos": [[92, 64, 40, 40], [135, 40, 40, 40], [84, 105, 40, 40]], "round": true, "rotate": false, "avatarOnTop": true, "angle": 90 }, { "type": "TO", "pos": [[5, 8], [60, 90], [50, 90], [50, 0], [60, 120]], "posType": "DEFORM", "opacity": 0.5 } ] } 属性 类型 注释 默认值 type 头像类型枚举 见下文, 例如FROM或TO 必须 pos 坐标数组 头像的坐标信息 必须 posType 坐标格式枚举 坐标格式枚举, ZOOM或DEFORM ZOOM round 布尔值 头像是否裁切为圆形 false avatarOnTop 布尔值 头像图层是否在背景之上 true angle 整数 头像的初始角度 0 origin 旋转原点枚举 头像的旋转原点 DEFAULT opacity 浮点数 头像的不透明度 1.0 rotate 布尔值 GIF类型的头像是否旋转 false fit 填充模式枚举 填充模式枚举, 可以是CONTAIN或FILL FILL crop 裁切坐标数组 头像裁切坐标信息 null cropType 裁切格式枚举 见下文 NONE style 风格化枚举数组 风格化枚举数组, 见下文 [] filter 滤镜对象数组 滤镜数组, 见下文 [] antialias 布尔值 是否使用抗锯齿算法, 默认跟随全局配置 null resampling 布尔值 是否使用重采样缩放, 默认跟随全局配置 null头像类型枚举 type
FROM 发送者头像 TO 接收者头像, 或构造的图片 GROUP 群头像 BOT 机器人头像 RANDOM 随机头像 (随机从群聊成员中选择, 不会重复) 坐标坐标格式枚举posType
ZOOM 缩放, 通过 x, y, width, height 表示图像 DEFORM 变形, 通过四点坐标来表示图像 ZOOMZOOM 缩放坐标的基本组成单位是 4长度 int[] 数组
其中,前两项为 左上角顶点坐标, 后两项为 宽度和高度
例:
[65, 128, 77, 72] 即 头像的左上角顶点坐标是 (65,128), 宽度为 77, 高度为 72
如果是 GIF 类型,坐标应为二维数组,GIF 的每一帧视为单个图像文件
{ // pos的元素对应GIF的4帧 "pos": [[65, 128, 77, 72], [67, 128, 73, 72], [54, 139, 94, 61], [57, 135, 86, 65]] }如果是IMG类型, 可以使用一维数组
{ "pos": [0, 0, 200, 200] }坐标支持变量运算, 例如 [100,100,"width/2","height*1.5^2"]
坐标变量
width 原图宽度 height 原图高度 DEFORMDEFORM 仿射变换坐标格式为 [[x1,y1],[x2,y2],[x3,y3],[x4,y4],[x_anchor,y_anchor]];
分别对应图片的[[左上角],[左下角],[右下角],[右上角],[锚点]],四角坐标用相对于锚点的偏移量表示
旋转原点枚举 origin
DEFAULT 左上角 CENTER 中心 裁切图片裁切坐标 [x1, y1, x2, y2], [0, 0, x2, y2] 可简写为 [x2, y2]
裁切格式枚举 cropType
NONE 不裁切 PIXEL 按像素裁切 PERCENT 按百分比裁切填充模式 fit
CONTAIN 缩小以适应画布, 不改变原比例 COVER 裁切以适应画布, 不改变原比例 FILL 拉伸, 改变原比例风格化枚举 style
MIRROR 水平镜像 FLIP 上下翻转 GRAY 灰度化 BINARIZATION 二值化 滤镜 filter通过滤镜实现头像特效, Java 与 JavaScript 版本实现有偏差, 并非完全相同
{ "filter": [ { "type": "SWIRL", "radius": 200, "angle": 5.0 } ] } 滤镜类型 type SWIRL 对应 AvatarSwirlFilter BULGE 对应 AvatarBulgeFilter BLUR 对应 AvatarBlurFilter CONTRAST 对应 AvatarContrastFilter HSB 对应 AvatarHSBFilter HALFTONE 对应 AvatarHalftoneFilter DOT_SCREEN 对应 AvatarDotScreenFilter NOISE 对应 AvatarNoiseFilter DENOISE 对应 AvatarDenoiseFilter 滤镜对象 AvatarSwirlFilter 对象, 漩涡滤镜 属性 类型 注释 默认值 radius 浮点数 涡旋半径, 值为0时表示图片半径 0.0 angle 浮点数 涡旋角度 3.0 x 浮点数 中心点X坐标百分比 0.5 y 浮点数 中心点Y坐标百分比 0.5 AvatarBulgeFilter 对象, 膨胀收缩滤镜 属性 类型 注释 默认值 radius 浮点数 膨胀半径, 值为0时表示图片半径 0.0 strength 浮点数 膨胀强度 [-1, 1], 负数时产生收缩效果 0.5 x 浮点数 中心点X坐标百分比 0.5 y 浮点数 中心点Y坐标百分比 0.5 AvatarBlurFilter 对象, 模糊滤镜 属性 类型 注释 默认值 radius 浮点数 模糊半径 10.0 AvatarContrastFilter 对象, 亮度对比度滤镜 属性 类型 注释 默认值 brightness 浮点数 亮度 0.0 contrast 浮点数 对比度 0.0 AvatarHSBFilter 对象, 相对HSB (色相, 饱和度, 亮度) 滤镜 属性 类型 注释 默认值 hue 浮点数 色相 0.0 saturation 浮点数 饱和度 0.0 brightness 浮点数 亮度 0.0 AvatarHalftoneFilter 对象, 半色调滤镜 (模仿彩色印刷的CMYK色彩) 属性 类型 注释 默认值 angle 浮点数 角度 0.0 radius 浮点数 半径 4.0 x 浮点数 中心点X坐标百分比 0.5 y 浮点数 中心点Y坐标百分比 0.5 AvatarDotScreenFilter 对象, 单色点阵滤镜 (模仿黑白印刷品) 属性 类型 注释 默认值 angle 浮点数 角度 0.0 radius 浮点数 半径 4.0 x 浮点数 中心点X坐标百分比 0.5 y 浮点数 中心点Y坐标百分比 0.5 AvatarNoiseFilter 对象, 噪声滤镜 属性 类型 注释 默认值 amount 浮点数 噪声强度 0.25 AvatarDenoiseFilter 对象, 降噪滤镜 属性 类型 注释 默认值 exponent 短整数 指数 20 文字如果你想在图片上添加文字,可以编辑 text
{ "text": [ { "text": "Petpet!", // 文字内容 "color": "#66ccff", // 颜色, 默认为#191919 "pos": [100, 100], // 坐标 "size": 24 // 字号, 默认为12 }, { "text": "发送者: $from, 接收者: $to", // 支持变量 "pos": [20, 150], // 坐标 "position": ["CENTER", "BOTTOM"], //坐标计算基准([x, y]) "font": "宋体", // 字体, 默认为黑体 "strokeColor": "#ffffff", // 描边颜色 "strokeSize": 2 // 描边宽度 }, { "text": "$txt1[我]超市$txt2[你]!", // 支持关键词变量 "pos": [0,200,300], // 第三个值为文本最大宽度 "align": "CENTER", // 对齐方式, 默认为LEFT "wrap": "ZOOM", // 显示设置, 默认为NONE "style": "BOLD" // 字体样式, 默认为PLAIN } ] } 属性 类型 注释 默认值 text 字符串 文本内容 必须 pos 数组 文本的坐标信息 必须 color 字符串 文本颜色 #191919 size 整数 文本字号 12 angle 整数 头像的初始角度 0 origin 旋转原点枚举 文字的旋转原点 DEFAULT position 数组 文本坐标计算基准 [LEFT, TOP] font 字符串 字体 黑体 strokeColor 字符串 文本描边颜色 null strokeSize 整数 文本描边宽度 0 align 字符串 文本对齐方式 LEFT wrap 字符串 文本显示设置 NONE style 字符串 字体样式 PLAIN greedy 布尔值 是否贪婪匹配多余的关键词 false变量
$from : 发送者, 会被替换为发送者昵称 $to : 接收者, 被戳或At的对象 $group : 群名称 $txt(i)[(xxx)] : 文本变量, 可用于生成meme图, i为关键词索引, xxx为默认值; 例: $txt1[我]超市$txt2[你] 指令为 pet [key] 我 你font
在data/fonts目录下的字体文件会注册到环境中
align
LEFT: 左对齐, 文本基线是标准的字母基线 RIGHT: 右对齐, 文本基线是标准的字母基线 CENTER: 居中对齐, 文本基线在文本块的中间wrap
NONE: 不换行 BREAK: 自动换行, 超过最大宽度的文本会显示在下一行 ZOOM: 自动缩放, 缩放字体大小以填充最大宽度使用BREAK或ZOOM时, maxWidth 默认为 200
style
PLAIN: 默认 BOLD: 粗体 ITALIC: 斜体 BOLD_ITALIC: 粗体与斜体position
LEFT: 左定位(默认) RIGHT: 右定位 TOP: 上定位(默认) BOTTOM: 下定位 CENTER: 居中定位 background程序支持动态创建画布
{ "background": { "size": ["avatar0Width*2","avatar0Height"], //支持变量运算 "color": "#f0f0f0" } }坐标变量
avatar(i)Width i号头像(i为定义头像时的顺序, 从0开始)处理后的宽度 avatar(i)Height i号头像处理后的高度 text(i)Width i号文本渲染后的宽度 text(i)Height i号文本渲染后的高度 MessageHook本特性仅适用于 Mirai 插件, 消息注入, 插件会检查将要发送的消息 解析后注入图片, 可配合各类消息回复插件使用
<pet></pet> 标签中的JSON会被解析, 请求格式参考 WebServer.POST
用例:
这段文字之后的标签会变成一张图片发送<pet>{ "key": "petpet", "to": { "qq": 2544193782 }, "textList": [ "text1" ] }</pet>消息的顺序会被正确处理, 支持多张图片不同于 POST 请求格式, 你可以用 "qq" 令程序自动获取头像和昵称, 也可以自定义"name" "avatar"
(更推荐自定义的做法, 程序可能在某些情况下无法推断出正确的"name")
WebServer被"hidden": true隐藏的模板会正常调用
此功能默认禁用, 需在配置文件中启用messageHook: true
程序可作为http服务器 / API单独运行, 被其它项目/语言使用
java -jar petpet.jar
启动时会生成 config.json:
{ "port": 2333, // 监听端口 "webServerThreadPoolSize": 10, // HTTP服务器线程池容量 "dataPath": "data/xmmt.dituon.petpet", // PetData路径 "preview": false, // 启用动态预览 (启动时生成所有模板预览) "antialias": true, // 启用抗锯齿, 详见上文 "resampling": true, // 启用重采样, 详见上文 "gifMaxSize": [200, 200, 32], // GIF缩放阈值, 详见上文 "gifEncoder": "ANIMATED_LIB", // GIF编码器, 详见上文 "gifQuality": 5, // GIF质量, 详见上文 "threadPoolSize": 0, // GIF编码器线程池容量, 详见上文 "headless": true // 使用headless模式 }程序使用com.sun.net.httpserver实现http服务器
PetServer API访问 127.0.0.1:2333/petpet 以获取 PetDataList
GET使用 GET 传递参数, 例如 127.0.0.1:2333/petpet?key=petpet&toAvatar=$avatarUrl
127.0.0.1:2333/petpet?key=osu&textList=hso!
结构
<details>
<summary>展开/收起</summary>
使用 POST 传递参数, 例如 127.0.0.1:2333/petpet
{ "key": "petpet", "to": { "name":"d2n", "avatar":"https://q1.qlogo.cn/g?b=qq&nk=2544193782&s=640" }, "randomAvatarList": [ "url" ], "textList": [ "text" ] }其中, key为必须项, 其它可以省略
form-data可直接将图片二进制文件上传至服务器进行处理
类似于 GET数据结构, 使用 multipart/form-data
语言 示例 javascript post.js get.js python example.py php example.php WebUI可参考example-script中的代码实现请求
启动WebServer后即可使用WebUI
启用preview配置项以加载WebUI模板预览 (可选, 默认关闭)
修改 server-config.json preview: true 常见问题戳一戳无法触发?
检查 Mirai 登录协议, 仅 ANDORID_PHONE 可以收到 戳一戳 消息
没有生成配置文件?
Mirai 2.11.0 提供了新的 JavaAutoSaveConfig 方法, 请更新Mirai版本至 2.11.0 (不是2.11.0-M1), 旧版本不支持自定义配置项
Could not initialize class java.awt.Toolkit?
对于无输入输出设备的服务器 需要启用headless
自动更新下载速度慢 / 无法连接远程资源?
修改Petpet.yml中repositoryUrl的值为'https://ghproxy.com/https://raw.githubusercontent.com/Dituon/petpet/main'(高速镜像)
自动更新后 读取data.json出错?
自动更新时网络出错导致, 删除出错的文件 重新获取即可
其它错误? 问题?
性能 & 兼容性若此文档无法解决您的问题, 欢迎提交issue
程序使用底层java.awt类合成图片, 渲染时使用多线程, 静态图片渲染时间一般不会超过1ms
对GIF编码器的分析, 转换, 映射部分进行多线程优化, 速度极快
Android JVM没有实现java.awt, 推荐使用JDK 11+版本
分享你的作品 (模板)如果你想分享自定义的 Petpet, 欢迎Pr
二次开发程序提供超多实用API 拓展性极强, 附有互动式开发实例, 欢迎初学者学习!
互动式开发实例 参见test.moe.dituon.petpet.example.HelloPetpet
在别的项目二次开发: mirai-simplepetpet-plugin
后话如果此插件和您预期的一样正常工作,请给我一个 star
欢迎提交任何请求
交流群: 922959760
life-restart-botやり直すんだ。そして、次はうまくやる。
基于 mirai-console 的人生重开模拟器一则
由于 skiko 不支持 x86 系统,本插件无法在 x86 位数系统中运行!
如果您须要在 x86 系统中运行,请使用 Release v0.3.0
支持功能 支持自定义并添加模拟器事件 在群聊/好友 中使用指令模拟重开 支持绘图返回功能(使用 skia) 如何使用?项目地址: https://github.com/HatoYuze/life-restart-bot
您可能需要前置插件 project-mirai/chat-command如果您愿意为本项目点一个 star 的话,就是对本项目最好的支持✨
下载 release 中的 life-restart-bot-xxx-mirai2.jar 随后丢进你的 mcl 的 plugins 中 对目标授予 com.github.hatoyuze.restarter.life-restarter:command-execute 权限可详见项目 README 中的描述
如果您想要添加自定义事件,可前往 /mcl/config/com.github.hatoyuze.restarter.life-restarter/register.yml 文件
将文件的 enabledCustomizedEvent 设定为 true
随后按照所要求的格式填写文件即可,例如
dcb0b8af-4de3-4845-9f98-2857df9cf9f3-image.png
53227d9b-3dc2-4be0-8f9c-3b86a2fad020-image.png
聊天记录内容:
自版本 0.4.0 以后,将默认使用图片结果返回,您也可以使用 remake text 获取聊天记录结果
6911321c-0e23-480c-bb82-a59010e40317-image.png
71d5ef35-aa3b-4322-b65e-40b6e35f62d8-image.png
一个可低延迟检测 B 站动态/直播并转发到 Q 群的 Mirai 插件
Stars
Downloads
Release
无论多少订阅均可在最低 10s 内检测所有动态
使用 skiko 绘图
动态过滤
扫码登录
可配置性高
v3需 >= mirai 2.12.0
v3完全重构, 使用 skiko 绘图, 更加美观。同时增加稳定性与可配置性
v2版本
建了个QQ群,有问题可即时反馈 734922374
V3样式预览demo1.png
demo2.png
demo3.png
前置插件: mirai-skia-plugin
插件命令依赖: chat-command
插件本体: releases
MCL 指令安装 (与上面二选一)中央仓库会延迟几个小时
./mcl --update-package top.colter:bilibili-dynamic-mirai-plugin --channel maven --type plugin
常用指令帮助图
可通过 /bili help 指令获取
如果你对这张图有什么建议也可以反馈
<img src="docs/img/help.png" width="500" alt="帮助">
推荐使用 config 指令配置 模板 过滤器
扫码登录请在配置文件中填写管理员账号
<..> 尖括号为必填参数 [..] 中括号为可选参数
[群/Q号] 不填的话默认对话所在地
<HEX颜色> 必须带#号 支持多个值自定义渐变 中间用分号‘;’分隔 例: #fde8ed;#fde8ed
单个值会自动生成渐变色
uid / 用户名 使用名称可以本地模糊匹配(只有订阅过才能匹配)
推荐使用 /bili config 交互式配置
两种过滤器:
类型过滤器: 通过动态类型进行过滤 可选类型 动态 转发动态 视频 音乐 专栏 直播 内容正则过滤器: 对动态进行正则匹配过滤过滤器的两种模式:
黑名单:当动态匹配过滤器时不推送动态 白名单:仅当动态匹配过滤器时推送动态过滤器模式黑名单模式
指令 描述 /bili <filterType / ft / 类型过滤> <类型> [uid] [群/Q号] 为目标 [群/Q号] 添加 uid 的动态类型过滤器 /bili <filterReg / fr / 正则过滤> <正则表达式> [uid] [群/Q号] 为目标 [群/Q号] 添加 uid 的动态正则过滤器 /bili <filterMode / fm / 过滤模式> <过滤器类型> <过滤器模式> [uid] [群/Q号] 切换过滤器模式 <br/>过滤器类型: t(类型过滤器) r(正则过滤器) <br/>过滤器模式: w(白名单模式) b(黑名单模式) /bili <filterList / fl / 过滤列表> [uid] [群/Q号] 列出 uid 的过滤器列表 /bili <filterDel / fd / 过滤删除> <index> [uid] [群/Q号] 删除 uid 中 index 的过滤器 # 栗子 /bili ft 转发动态 487550002 # 为当前群/好友订阅的 487550002 设置类型为“转发动态”的过滤 # 当 487550002 用户动态类型为“转发动态”时触发过滤器(是否推送要看过滤器模式) /bili fr ^新年好 0 111111 # 为 111111 群/好友订阅的所有用户设置内容为“^新年好”的包含 # 当 111111 群/好友订阅的所有用户的动态内容开头包含“新年好”时触发过滤器(是否推送要看过滤器模式) /bili fl 487550002 # 查询当前群/好友订阅的 487550002 设置过的过滤列表 # 当前目标过滤器: # # 动态类型过滤器: # 模式: 黑名单 # t0: 转发动态 # t1: 视频 # 正则过滤器: # 模式: 黑名单 # r0: 转发抽奖 # # t0 t1 r0 等为删除的索引<index> /bili fd t1 487550002 # 删除上面t1的过滤 # 特例 # uid 为 0 时,代表群/好友订阅的所有用户 # 不填默认也为 0 权限插件命令依赖 chat-command 来正确处理聊天环境下的命令,请确保有此插件,否则插件可能无法正常工作
权限名 ID 基础权限ID top.colter.bilibili-dynamic-mirai-plugin:* 动态指令ID top.colter.bilibili-dynamic-mirai-plugin:command.bili 跨通讯录控制 top.colter.bilibili-dynamic-mirai-plugin:crossContact跨通讯录控制可以让你修改查看别人的配置
如果你不会给权限可以点击下面展开查看简略教程
...在控制台输入 /perm add <许可人 ID> top.colter.bilibili-dynamic-mirai-plugin:command.bili
其中的 许可人 ID 如果你要让所有群所有人都可以用此插件就是 * 即 /perm add * top.colter.bilibili-dynamic-mirai-plugin:command.bili
具体的用户: u123456789 全部用户: u*
具体的群: g123456789 全部群: g*
更多的配置见 被许可人 ID 字符串表示
At全体权限3.0.0-BETA4 后废弃
废弃后仍可使用, 但不推荐, 推荐使用前面的指令进行配置
配置文件位于 mirai 根目录/config/top.colter.bilibili-dynamic-mirai-plugin/
基础配置文件 BiliConfig.yml
图片分辨率配置 ImageQuality.yml
图片主题配置 ImageTheme.yml
分辨率与主题配置已经内置了多套数据
{draw}: 绘制的动态图
{name}: 名称
{uid}: 用户ID
{did}: 动态ID
{type}: 动态类型
{time}: 时间
{content}: 动态内容
{images}: 动态中的图
{link}: 动态链接
{links}: 视频专栏等有多个链接
\n: 换行
\r: 分割对话(会生成多个QQ消息)
{>>} {<<}: 包装成转发消息
栗子: {draw}{>>}作者:{name}\nUID:{uid}\n时间:{time}\n类型:{type}\n链接:{link}\r{content}\r{images}{<<}
直播模板配置项{draw}: 绘制的直播图
{name}: 名称
{uid}: 用户ID
{rid}: 房间号
{time}: 直播开始时间
{title}: 直播标题
{area}: 直播分区
{cover}: 直播封面
{link}: 直播链接
\n: 换行
\r: 分割对话(会生成多个QQ消息)
注: 直播模板不支持 ({>>}{<<}) 转发消息
转发卡片配置项{name}: 名称
{uid}: 用户ID
{did}: 动态ID
{type}: 动态类型
{time}: 时间
{content}: 动态内容
{link}: 链接
{name}: 名称
{uid}: 用户ID
{id}: 动态/直播ID
{type}: 类型
{time}: 时间
因此,本插件需要一个 B 站账号来订阅用户。
强烈推荐使用小号 如果让bot用你经常使用的账号可能会出现长期多次异地访问造成风控 无法添加关注
(插件有扫码登陆和自动关注自动添加分组功能,详细见下文)
如果账号没有关注过此人,bot 会自动关注并把他分到一个新分组中,方便管理
是否开启自动关注以及新分组的名称都可以在配置文件中进行配置
如果关闭自动关注,那么在 QQ 中订阅一个未关注的人时会提示 未关注
开启自动关注后,bot 会生成一个新分组(分组名可以在配置中设置),由 bot 新关注的人会被分到这个分组内,之前就关注过的不会移动
如果你想让 bot 关注就保存在默认分组中,请在配置中替换 followGroup 后面的值为两个引号 ""
选择下载 52.2MB 的字体压缩包文件, 请使用压缩包内 HarmonyOS_Sans_SC 目录下的字体, 此目录下的字体为简体中文
里面不同文件代表不同的粗细, 建议使用 Medium
推荐使用 /bili login 指令进行登录
通过开发者工具获取建议开启浏览器无痕模式
浏览器打开 BiliBili 并登陆
注:登陆后不要点退出登陆
按F12,打开开发者工具,找到Network / 网络并点击
按F5刷新页面,按下图复制 Cookie
<img src="docs/img/cookie.png" width="500">
把复制的 cookie 粘贴到配置文件中对应的位置, 并使用双引号包裹
通过 EditThisCookie 获取 在浏览器中安装 EditThisCookie 插件 在b站打开EditThisCookie面板, 点击刷新按钮, 再点击导出按钮 在插件数据路径 data/top.colter.bilibili-dynamic-mirai-plugin 下新建 cookies.json 文件 把第二步中复制的数据粘贴到文件中 图片缓存所有的图片都会缓存在 data/top.colter.bilibili-dynamic-mirai-plugin/cache 下
更新日志 相关链接Mirai
ViViD按钮
B站: 猫芒ベル_Official 这么可爱不关注一下吗(❁´◡`❁)
B站: Colter_null 如果 GitHub 或论坛太长时间没回复可以去 B 站私信
cssxsh: bilibili-helper
Twitter Emoji: Twemoji