6月23日更新
TX以检测出使用非官方QQ客户端为由,将试验用QQ号暂时冻结了。
虽然通过填写个人信息救回了账号,但也在这里提醒各位权衡风险,谨慎操作。
事件缘由
在群中发现了群友转发的“表里不一”的聊天记录,如下图所示:
这种点开前后内容不一致的合并转发让包括我在内的不少群友都感到不可思议,于是我~浪费了一下午~细究其原理,并顺藤摸瓜发现了QNotified这款不错的QQ扩展模块。
观前提示
- 本教程仅供学习交流,一切开发旨在学习,请勿用于非法用途;
- QNotified需要对安卓手机进行ROOT操作,非搞机人士请三思并权衡将真机Root后带来的变砖和安全风险,或者寻求模拟器解决方案;
- QNotified提供的发送卡片功能属于敏感功能,较(不成熟操作下的)QQ机器人稳定,但QNotified为防范可能的风险,会将卡片内容上传至其服务器并存档,QNotified也会在启用该功能前进行提醒。
心路历程
(只对教程感兴趣的可以直接看下一章节)
- 首先当然是尝试了所有人都会想到的修改群昵称为“用户名”+“整蛊内容”,然后理所当然地失败了。
- 直接在B站搜,找到了这个视频(教你如何在QQ群里发送外面和里面的内容不相同的聊天记录),发现“聊天记录合并转发”实际是基于QQ的xml卡片功能。
- 因为里面出现了“复制代码”这个当前正常版本没有的长按选项,再加上视频发布日期是2020-04-01(在查找资料的时候也没发现是愚人节),于是自然而然地开始搜索安装旧版QQ的相关资料。
- 然后思维就被带偏了,因为在安装旧版QQ视频中出现了lsposed,导致浪费了两个小时在电脑模拟器的root上,并浪费了一个小时左右边清理文件边打集成战略……
- 之后想到既然关键是发送xml代码,在排除QQ机器人的情况下(之前有尝试过导致小号被风控),最重要的问题实际上是如何发送xml代码而不是QQ的版本。
- 然后在不少的摸索中终于发现了QNotified(在之前被人提及为QN优化,但度娘并不知道是什么),问题解决。
QNotified简介和安装
Github项目主页:https://github.com/ferredoxin/QNotified 。
(Github项目主页上给出的)持续集成版本下载链接
撰写文章时的最新版APK度盘链接:https://pan.baidu.com/s/1jz5XQS7aFt2SdkH7Hulbkg?pwd=nymi 提取码:nymi (Version 1.0.1.6f5520f (1644664825) 发布于2022-2-12 19:25,本体只有5M左右,用度盘下也不会太耗时间 )
QNotified虽说被集成至各式各样的Root工具之中,但其本体可以直接以APK在Root环境下运行,这里就默认使用APK安装方法,因为试验时使用的是Bluestacks + BSTweaker6 + XPosed的环境(该环境的搭建可能会另起一篇,这里不再赘述),所以安装其他ROOT工具就会变得很麻烦。
APK的安装方法十分简单,在完成XPosed的安装之后,安装上方提供的APK,并在XPosed的插件页面启用QNotified插件,并重启手机/模拟器即可。
QNotified初见
在完成上述步骤后,进入QQ,若安装成功,则在QQ第一次启动时QNotified会自动加载,此时可以通过观察加载条确认QNotified是否成功安装。
进入主界面后,进入设置,可以看到QNotified选项,若是第一次启动则会显示为“【未激活】”:
第一次点击QNotified选项会进入协议界面,同意之后QNotified激活,并进入到具体设置页面:
可以看到V1版本相较于V0版本,页面发生了不小的变化,从中我们可以了解QNotified提供的各式各样的实用或花哨功能,这里我们将直奔我们的目标:(“模块设置”中的)其他功能 → (拉到最下面的“实验性功能”中的)Omega测试,并在确认相关风险之后开启“复制卡片消息”和“发送卡片消息”,注意不是“频道功能”下的“复制卡片消息”:
使用QNotified发送“聊天记录”
启用“卡片消息”相关功能
首先,在某个群(不希望打扰别人的请自己建个试验群)发送“聊天记录”的内容(无法通过下面介绍的方法修改),并通过 长按“多选” → 转发 → 合并转发 来获取原始的聊天记录卡片,之后长按并选择“复制代码”选项获取卡片的XML源代码:
示例中的源代码示例如下所示(请不要直接复制下面的代码,请在自己的代码上进行加工):
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<msg serviceID="35" templateID="1" action="viewMultiMsg" brief="[聊天记录]" m_resid="【省略】" m_fileName="【省略】" tSum="1" sourceMsgId="0" url="" flag="3" adverSign="0" multiMsgFlag="0">
<item layout="1" advertiser_id="0" aid="0">
<title size="34" maxLines="2" lineSpace="12">群聊的聊天记录</title>
<title size="26" color="#777777" maxLines="2" lineSpace="12">Rick Astley: [图片]</title>
<hr hidden="false" style="0" />
<summary size="26" color="#777777">查看1条转发消息</summary>
</item>
<source name="聊天记录" icon="" action="" appid="-1" />
</msg>
各位也可以把自己的代码复制到文本编辑器或者代码编辑器,并自行换行(在尖括号<>之外进行换行和缩进不会影响最终的呈现效果)。
代码分析
示例代码前三行(<?xml?>
块、<msg>
块和<item>
块)会自行生成,不需要我们修改。
我们要进行修改的是被<item>
和</item>
包围的部分的内容,以下我们进行逐条分析:
<title size="34" maxLines="2" lineSpace="12">群聊的聊天记录</title>
这一行代表的是卡片上半部分的标题格式,一般我们也不需要进行修改,可以自定义,但会与默认格式不同影响效果。
<title size="26" color="#777777" maxLines="2" lineSpace="12">Rick Astley: [图片]</title>
这一行是卡片上半部分的具体内容,也是实现效果的关键部分,将<title>
和</title>
之间的内容修改为自己想要的内容即可实现“表里不一”。这一行代码也可重复多次以实现多条消息的“聊天记录”。
<hr hidden="false" style="0" />
分隔符,不用动它。
<summary size="26" color="#777777">查看1条转发消息</summary>
这一行是卡片下半部分的内容,若里外消息条数数量不同请记得修改此处内容。
按照上方指出的要点修改好代码,然后就将来到最后的发送环节。
大功告成
好了,将编辑好的代码复制到编辑框中,并 长按 “发送”按钮,若消息能成功发送出去并正常显示,就大功告成了!