邀请链接的验证与提取

由于本篇是处于内测时期编写, 内容可能随时由于官方更改策略而失效.

推荐程度逐级递增.

在看本篇之前, 要先明白目前内测的 QQ 频道的邀请机制.

目前官方认可的邀请模式有以下几种:

  1. 通行证; 目前所有内测频道主用户能够通用的邀请方式.
  2. 邀请链接; 只存在于官方认证的一些频道, 比如 "王者荣耀" 频道, 在通过问卷之后会向目标用户发送私信, 其中私信的内容实际上一张由模板内嵌邀请链接的网页.
  3. 搜索结果; 通过激励计划毕业的频道可以被搜索名称搜索到就可以直接加入.
  4. 日程提醒; 属于邀请链接的一种, 实际上是内含日程消息的 "通行证".

然而现在通过正常模式是不可能获得邀请链接这种东西的, 所以就开始研究如何通过现有可用的方式获得链接.

通行证提取

目前我所知道的形式就如上四种, 从通行证卡片里面提取到链接, 实际上也是有一定效果的, 通过解析那张发送在 QQ 群或者好友聊天中的卡片就可以获得内含的链接.

通行证卡片

如上是一张通行证卡片, 在解析获得本体 json 之后再格式化就能获得如下的卡片数据:

通行证本体

其中很轻易就能看到 jumpUrl 后的内容, 如其名就是跳转链接:

jumpUrl

通过去除转义符号和编码(也可去掉)特殊字符, 就能得到通行证的本体:

1
https://qun.qq.com/qunpro/passcheck/share?_wv=3&_wwv=128&passCode=37&senderUin=xxxxxxxxxx&guildId=xxxxxxxxxx

值得注意的是 meta 项目下面还有一个 senderJumpUrl, 很显然当卡片被发送人点击和接收人点击的跳转链接是不一样的.

但这里就要引入一个问题, 即通行证的资格验证: 在频道主发放通行证的时候会要求选择向成员给予通行证或是直接邀请, 不管怎么发放都绕不开 "选择好友" 发送和 "选择群聊" 发送:

选择发送目标

这里成了通行证最大的权限验证, 当 "选择好友" 发送时, 通行证只会发送一张, 而只要被使用就会过期而不管好友有没有接受加入(因为有的会卡在实名认证或是其他原因而成为 "待加入"), 如果好友在使用之前提取出来其中的 jumpUrl 然后发送给别的人, 也是一样的使用一次就会过期, 因为通行证数量只有一张.

只有一张怎么行, 这样要实现邀请链接直接通用加入还很远, 那如果 "选择群聊" 向群里发送所有的通行证呢? 答案是可以的, 但是也要碰到资格验证, 如下图:

发送记录

每个直接发送通行证的群都是有记录的, 如果用户不在这个群聊或是 "我的邀请" 里面没有这个群的发送记录, 那么不满足任何一点, 用户也都无法加入.

在上面提取到的 jumpUrl 中, 对于发放群聊的卡片里面会附带 qqGroupUin 参数, 这个参数恰好就是目标群的群号, 如果满足了两个条件:

  1. 这个群曾经发送过你频道通行证.
  2. 被邀请目标也在这个群.

那么这个链接会在通行证过期之前一直有效, 可以用来在群内直接使用 jumpUrl 链接邀请也没有什么问题.

但是通行证默认都是有八小时有效期的, 如果发往这群的通行证过期之后这个链接也势必会过期.

日程提取

"日程" 是官方一开始就推荐的在官方频道内推广的方式, 通过点击发往频道外的日程并参与就能直接加入到目标频道.

在刚内测的时期, 常用来 hook 客户端的工具还没有加入频道里的分析功能, 只能通过这个工具较为快速地提取在 QQ 中的卡片, 而在 QQ 频道中的卡片还无能为力, 直到这个模块在最新构建中加入了分析频道中消息卡片的功能, 这下提取日程本体链接就有了出路.

直接创建日程, 然后分享日程到其他子频道就能提取到卡片的 json 本体:

日程卡片本体

很明显可以看到这里依旧有一个 jumpUrl, 与上面的通行证卡片的 URL 不一样, 使用的参数是 qunpro/share, 而通行证的参数是 passcheck/share.

获得的链接通过去除转义和特殊字符之后就是如下的格式:

1
https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&inviteCode={InviteCode}&schedule_id=xxxxxxxxxxxxxxxxxxxxx&starttimems=xxxxxxxxxxxxxxxxxx&endtimems=xxxxxxxxxxxxxxxxxx&schedule_open_type=detail&from=246610&biz=ka

如果多提取几个日程的链接本体, 实际上就能发现最大起作用的参数是 inviteCode={InviteCode} 这部分, {inviteCode} 正是其所谓的 "邀请码", 如果有了这个邀请码那么就能加入这个邀请码被创建时的频道.

去除无关紧要的参数能简化为如下:

1
https://qun.qq.com/qqweb/qunpro/share?_wv=3&_wwv=128&inviteCode=xxxxx&from=246610&biz=ka

论坛帖子提取

Android QQ 8850 版本新加入了一个 "论坛" 的功能子频道, 能够直接把帖子分享到 QQ 频道以外的包括好友和群聊的界面, 如果提取这个帖子分享后的卡片:

帖子分享卡片

就能得到以下的 json 数据:

invite_code

熟悉的 invite_code 又出现了, 理论上完全可以使用这个帖子来作为 "通行证" 邀请好友, 比较时效八小时来说的通行证也相当优势也很大.

理论上使用这个 invite_code 去替代上面日程链接本体的 inviteCode 参数也是可行的(未测试).