腾讯早早地关闭了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)