免 IDKEY 跳转(加) QQ 群-Python 实现方案

瞎扯

最近站长在研发一套关于 QQ 的各种跳转的 PHP 项目『forceQ』,名虽有“强制”之意,但受限于越来越严格的制度,现在的跳转特别『温柔』——反而受跳转目标影响。

这个项目作为副站长推荐的练手项目,也是我入坑 PHP 的第一个像样的程序,我应对比较认真,连名字也简短有力!

开发进程较快,但是最近受到一个问题的阻挠——正是今天要讨论的『免 IDKEY 跳转(加) QQ 群』。

正文

要实现这个功能,我们首先需要了解 QQ 群推广链接的组成,一般是跳转接口 + IDKEY。只是现在新版链接里没有 IDKEY 这个参数。。

遂上网搜索相关内容,不过网上相关资源真的少,有的都是五年前的文章。但是根据文章亲手操作,发现旧链接组成方式(带 IDKEY)还可继续使用(还能用多久就不知道了)。

Reference

JAVA——根据QQ群号得到idkey以及QQ群加群链接[网页版本]解决方案_Starzkg的博客-CSDN博客_qq群key怎么获取

实现方式

具体所用操作参考上面的链接,Java 程序和 PHP 程序也可参考上面。只是 Python 作为我入门入了三年(还没进入实践阶段)的语言,加上其在爬虫邻域强大的地位,我很轻松就用 Python 写出来了。

导入模块

访问那个 IDKEY 查询链接需要带上时间戳,所以眼咪咪就

import time

爬虫需要发送网络请求,所以请在确保安装第三方库 requests 的情况下通过下面代码导入它(若没有请通过以下命令安装 pip install requests):

import requests

接下来需要跳转浏览器打开链接,所以也得导入:

import webbrowser

查询 IDKEY

跳转 QQ 群的链接需要 idkey 参数,那怎么可能省略呢?只是这里我们交给机器处理罢了。

首先是所需链接和必要头部信息。

query_api = "https://qun.qq.com/proxy/domain/shang.qq.com/wpa/g_wpa_get"
headers = {"referer": "https://qun.qq.com/proxy.html?callback=1&id=1"}  # 头部信息(溯源为必要)

根据浏览器开发者工具,该链接需要带上参数 QQ 群列表字符串,同时还需带上当前时间戳 * 1000 后取整(不是四舍五入)的值。

group_list = [824697580]  # 群列表
group_list = [str(i) for i in group_list]  # 将所有元素转换为字符串形式
groups = "%2C".join(group_list)  # 将列表元素通过 url 转码的英文逗号串连

# 要求的时间戳为包括小数点后三位的整数
t = str(int(time.time()*1000))

最终需要发起 GET 请求的查询链接如下:

query_url = query_api + "?guin=" + groups + "&t=" + t  # 拼接查询地址
resp = requests.get(query_url, headers=headers)
data = resp.json()  # 获取到返回数据

接下来就是最后一步——跳转浏览器打开拼接好的链接,给予浏览器跳转打开外部应用的权限就大功告成了:

# 下面就是跳转接口和 QQ 群 idkey 所在索引,其中的数字索引可改(若传入多个 QQ 群)
group_url = "http://shang.qq.com/wpa/qunwpa?idkey="+data['result']['data'][0]['key']
webbrowser.open(group_url)  # 跳转浏览器打开链接

END

上面的代码拼凑一下,运行或调试可以触发以下效果:编译器一秒不到就获取到了 IDKEY 并跳转浏览器(等待你手动启动 QQ)并打开相应窗口。但是还有一个前提是不能查询太频繁,若正常网络下出现需等待三秒以上,那么基本需要重来(等几秒)。

附:完整代码

import requests
import time
import webbrowser

def get_data(group_list):
    query_api = "https://qun.qq.com/proxy/domain/shang.qq.com/wpa/g_wpa_get"
    t = str(int(time.time()*1000))  # The needed time stamp includes three numbers after the decimal point then remove the decimal point(also can understand as multiply by 1000 then get integer part only.)

    # Handle elements in list into needed format: Turn into string and use English comma in url encoding to joint in.
    # group_list = [824697580]
    group_list = [str(i) for i in group_list]
    groups = "%2C".join(group_list)

    headers = {"referer": "https://qun.qq.com/proxy.html?callback=1&id=1"}  # Headers info(the referen parameter is necessary.)
    query_url = query_api + "?guin=" + groups + "&t=" + t  # Joint query links

    resp = requests.get(query_url, headers=headers)
    data = resp.json()  # Get returned data(json)

    return data['result']['data']

def main(*args):
    # group_list = [824697580]
    data = get_data(args)

    # Jump links in sequence
    for i in range(len(args)):
        group_url = "http://shang.qq.com/wpa/qunwpa?idkey="+data[i]['key']
        webbrowser.open(group_url)

if __name__ == "__main__":
    main(824697580)
阅读剩余
THE END