最近QQ推出了坦白说栏目,允许给一个人匿名发送一个印象,然后别人回复了你的话,你们两个就可以聊天了,并且他不知道你,你却知道他,和QQ空间秘密不一样的是,秘密是双方都是匿名的,并且只能通过留言的方式来聊天,而坦白说是一方匿名,可以即时聊天。
收到的消息如图所示
通过抓包,我们可以抓到这个是一个网址
https://ti.qq.com/honest-say/my-received.html
直接访问这个地址,会直接跳到手机QQ下载页面,因为没有cookie和UA
带上QQ空间的cookies,和手机的UA访问
可以看到这个网页列表了,在浏览器调试里面找到这段网址
https://ti.qq.com/cgi-node/honest-say/receive/mine?_client_version=0.0.7&_t=1523761349720&token=1592905018
这是一段json数据,里面有很多段坦白说数据,这个正式我们需要找的数据,可以看到里面有一段
fromEncodeUin:“*S1*7K4zNKnqoecl”
那么这个就是重头,好友的QQ
不过这个东西是一段不知道什么样的数据,如何解密呢?
我们可以让指定的好友给我们发送坦白说,通过对比后发现,这个是有规律的。前面的*S1*, 是固定的,每个QQ都会有这个数据,那么剩下的就好办了,多几个QQ就对比出来了。
使用java 哈希表来做这个最好了。
那么最终获取就告一段落了。
那我们直接访问这个https://ti.qq.com/cgi-node/honest-say/receive/mine?_client_version=0.0.7&_t=1523761349720&token=1592905018
不就能获取了吗,仔细研究一下知道了,里面有两个参数,一个是t,一般来说t都是代表time,应该是时间戳,通过寻找js代码查看
看得到,t的确是时间戳,token,是通过获取cookies里面的skey数据来计算的,其实看到这儿我就已经知道了,很明显,这个就是gtk数据了,使用下面的java数据即可计算
public static String getQzoneGtk(String skey){ int hash = 5381; for(int i = 0, len = skey.length(); i < len; ++i){ hash += (hash << 5) + (int)(char)skey.charAt(i); } return (hash & 0x7fffffff)+""; }
两个都有了,就可以直接提交了获取数据了。但是,直接获取不会返回数据,而会返回一段json~~
{ "code":2333333, "msg":"皮这一下你很开心么ヽ( ̄▽ ̄)?" }
带上cookies访问即可获取数据了。
后续
我做成了一个安卓版本的成品,大家可以访问github下载