MrXiaoM 发布的帖子
-
Aoki —— 仅用安卓手机解决登录验证
Aoki 是在 Android 平台上基于 mirai 开发的登录处理器
本项目名称来源于
i-style project 推出的虚拟歌手蒼姫ラピス (Aoki Lapis)
项目图标由人间工作绘制本项目所使用的“迁移设备信息”方法可能已不再适用,请通过以下链接教程部署签名服务
https://wiki.mrxiaom.top/mirai/45
注意事项
- 请确保你在真实的 Android 设备上进行登录
- 请确保你已在该 Android 设备登录了官方的 QQ 客户端
- Aoki 可以确保你在第一次登录时能够正常登录,不能保证已经触发过 235/237/45 的账号能登录
- 由于服务器策略更新,“迁移设备信息” 这种登录方法可能不再可用。
使用方法
先设法将你的本地 mirai 版本升级到 2.15.0-dev-98 或以上 (或 2.15.0-RC)。升级到开发版方法将会在以后放出。
使用插件将 ANDROID_PAD 协议的版本信息改为 8.8.88,如 fix-protocol-version 插件。
如果开启时提示“服务注册失败”,你可能还需要再安装 KawaiiMiku 插件在真实的 Android 手机上安装 Aoki,
注意一定要在真实的手机上打开 Aoki,因为 Aoki 需要读取你的手机型号等信息生成 device.json。
打开并按照引导进行登录 (使用平板协议)。出现「登录成功」提示后,你可以
压缩并分享
登录成功后点击「打包并分享到…」,然后在弹出的分享面板中想办法将该文件发送到电脑上,比如 通过QQ文件传输助手发送到电脑,或者 使用蓝牙连接发送到电脑 等等。
你也可以在「账号管理」中找到「打包并分享到…」。
通过路径复制文件
使用任何你能想到的方法将手机储存目录下的
Android/data/top.mrxiaom.mirai.aoki/files/AokiMirai
文件夹传输到电脑上,可用的方法包括但不限于如下:- 使用数据线复制文件夹
- 压缩文件夹,通过QQ文件传输助手发送到电脑
将从以上其中一种方法获得的
bots
文件夹中以qq号命名的文件夹,
覆盖到 mirai 目录,然后你就可以在 mirai 中登录你的账户了。建议在导出文件后,等待半小时左右再登录,以免因为短时间内两次登录的 IP 归属地变动较大被风控。
下载
在 Github Releases 下载最新版本
如果你觉得有用,请点击右下角的点赞
按钮,或到 Github 点一个标星(Star)
,感谢支持。帮助
使用过程中的问题请在本帖或 QQ 群 1047497524 询问。
若出现bug或者想要贡献代码,请前往 Github。捐助
前往 爱发电 捐助我。
-
我写了一个 mirai 登录 App
我写了一个能仅用 Android 手机就能完成登录的 App。登录完成后将会在手机储存目录下的 AokiMirai 文件夹生成跟 mirai-console 类似的账户目录结构,复制到 mirai 根目录即可。
就在刚刚,它完成了第一次登录,而且还是在模拟器上。(不推荐用模拟器,App要获取手机系统信息来生成 device.json 和浏览器 UA)
写好了,但没完全写好,还有亿些小bug没解决,正式完成后开源。
-
获取回复消息(QuoteReply)指向原文的实现思路
总所周知,腾讯服务器给你返回的 QuoteReply 的源消息并不是富文本消息,也就是说,图片会“退化”为
[图片]
等等。如果我们想做回复消息搜图之类的功能,这给我们带来了比较多的麻烦。但是,我们可以取到源消息的 MessageSource,只要你本地存了聊天记录,就能够通过 MessageSource 获取相应消息。按照这个思路,我们只要跟QQ客户端一样,把消息存到本地,需要时获取即可。
具体实现
本帖中将使用 Mirai Hibernate Plugin 插件储存聊天记录,演示获取回复消息原文的方法。
引用依赖
// build.gradle(.kts) repositories { mavenCentral() } dependencies { compileOnly("xyz.cssxsh.mirai:mirai-hibernate-plugin:依赖版本") } // hibernate 6 和 HikariCP 5 需要 jdk11 mirai { jvmTarget = JavaVersion.VERSION_11 }
//author("MrXiaoM") // 在主类插件信息处声明插件依赖关系 dependsOn("xyz.cssxsh.mirai.plugin.mirai-hibernate-plugin", false)
Kotlin
val QuoteReply.originalMessageFromLocal: MessageChain get() = MiraiHibernateRecorder[source].firstOrNull()?.toMessageChain() ?: source.originalMessage // 使用示例 @EventHandler fun GroupMessageEvent.listen() { // 检测回复消息 message[QuoteReply.Key]?.run { val original = originalMessageFromLocal // do sth. } }
Java
public static MessageChain getOriginalMessageFromLocal(QuoteReply quote) { Optional<MessageRecord> record = MiraiHibernateRecorder.INSTANCE.get(quote.getSource()).stream().findFirst(); return record.map(MessageRecord::toMessageChain).orElseGet(() -> quote.getSource().getOriginalMessage()); } // 使用示例 @EventHandler public void onGroupMessage(GroupMessageEvent event) { // 检测回复消息 QuoteReply quote = event.getMessage().get(QuoteReply.Key); if (quote != null) { MessageChain original = getOriginalMessageFromLocal(quote); // do sth. } }