NiceLeeのBlog 用爱发电 bilibili~

Python 使用分享接口实现QQ信息发送(一)

2020-06-09
nIceLee

阅读:


腾讯早早地关闭了Web QQ的接口,使得通过HTTP请求的方式发送消息成为了奢望。
在这之后,基本上类似的实现都是基于PC端或app端的协议逆向。比如酷Q、mirai。
在这之上进行的二次开发其实都比较重,有时候仅仅只是需要偶尔或者定时发个通知消息,却需要干一大堆事情,这就很烦。
还有前段时间,腾讯开放了HOOK机器人测试接口,结果没多久就没了。。。无语了

一个想法

偶然间,在分享B站某个页面发现了这个,发送之后果然收到了消息,于是有了抓包改写的念头。

https://connect.qq.com/widget/shareqq/index.html?url=https://www.bilibili.com/blackboard/knowledge.html&share_source=qq&share_medium=web&desc=知识区正式开放!百万奖金寻找优质知识创作者&title=B站知识区开放!学习网站实锤了&summary=知识区正式开放!百万奖金寻找优质知识创作者&pics=https://i0.hdslb.com/bfs/activity-plat/static/43624dcc688b84198072bd6e6e0d7b90/2D2Q54XJDm_w336_h336.jpg&flash=&site=&style=201&width=32&height=32

简单实现

其实需求是这样的,我有一个大号,小号和群,想通过HTTP请求使得大号发送QQ通知消息到小号或者群里面。
发送的频率也不频繁,估摸着一天最多两三次,或者几天也不一定有一次。


这样的话,可以尝试发送一条信息测试,得到cookie、校验参数t、目标的id、以及目标的类型(普通用户/群组/讨论组)
基本上过期时间还是有相当一段时间的?,勉强算是完成了任务。

import requests

def send_msg(cookie, t , title, summary, content, imageUrl, targetUrl, \
             uid, stype=0):
    '''
    发送消息给好友
    '''
    url = "https://cgi.connect.qq.com/qqconnectopen/openapi/send_share"
    headers = {
        'Host': 'cgi.connect.qq.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0',
        'Accept': '*/*',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'https://cgi.connect.qq.com',
        'Connection': 'keep-alive',
        'Referer': 'https://cgi.connect.qq.com/proxy.html?t=20120217001&callback=1&id=1',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
        'TE': 'Trailers',
        'Cookie': cookie
    }
    params = {
        'dest': 'qq',
        'uins': '[{"type":%d,"id":%d}]' % (stype, uid),
        'dmList': '[]',
        'ldw': '534111139', # 疑似固定参数
        't': t,
        'imageUrl': imageUrl,
        'targetUrl': targetUrl,
        'title': title,
        'summary': summary,
        'content': content,
    }
    data = requests.post(url, timeout=10, headers=headers, data=params).json()
    print(data)
    if "msg" in data and "success" == data["msg"]:
        return True
    else:
        return False

    
if __name__ == '__main__':

    cookie = "pgv_pvi=xxx; ..."  
    t = "xxx"     # 验证参数
    uid = "xxx" # 目标的id(不是QQ号或者群号)
    title = '标题'
    summary = '摘要'
    imageUrl = 'https://s1.hdslb.com/bfs/static/player/img/ploading.gif'  # '预览图'
    targetUrl = 'https://www.bilibili.com'  # '分享链接'
    content = '文字信息' # 为None时不发送
    send_msg(cookie, t, uid=uid, title=title, summary=summary, imageUrl=imageUrl, targetUrl=targetUrl, content=content)
    

内容
隐藏