通过Chrome控制台可以发现Qzone的说说发表接口如下
此接口采用POST请求方式发送数据,GET请求参数含有鉴权密钥,使用cookie来鉴别用户身份信息,接下来从这两方面下手。
通过分析Qzone首页的源代码,g_tk的算法存在于qzfl_v8_2.1.57.js中。
GET请求中,g_tk和qzonetoken字符串的算法,观察上面的js可知,g_tk是由一个QZFL.pluginsDefine.getACSRFToken()的函数,算法如下
用php运算,就是
function Get_q_tk($p_key){
$arr=str_split($p_key);
$hash = 5381;
for ($i = 0, $len = strlen($p_key) ; $i < $len; ++$i) {
$hash += ($hash << 5) + base_convert(bin2hex(iconv('UTF-8', 'UCS-4', $arr[$i])), 16, 10);;
}
return $hash & 2147483647;
}
OK,解决了q_tk的算法,接下来研究qzonetoken的算法。
看上图,是不是感觉有种被戏弄了的感觉。。。。密钥在一个script标签里!WTF???
好了,得到了以上的算法,我们写一个php程序,代码如下:(这里的密钥和cookie等隐私部分我就不写了)
$content="PHP发表测试";
$url = "http://h5.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_publish_v6?".$gt;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $ck);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array ('Referer:http://user.qzone.qq.com/'.$qq) );
curl_setopt($ch, CURLOPT_POSTFIELDS, "qzreferrer=http://user.qzone.qq.com/".$qq."&syn_tweet_verson=1¶mstr=1&pic_template=&richtype=&richval=&special_url=&subrichtype=&who=1&con=qm".$content."&feedversion=1&ver=1&ugc_right=1&to_sign=1&hostuin=".$qq."&code_version=1&format=fs");
$response = curl_exec($ch);
curl_close($ch);
echo $response;
在浏览器运行,结果
成功~
Qzone说说接口总结:
1,地址:http://h5.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_publish_v6?q_tk=[getACSRFToken()]&qzonetoken=[token]
2,请求方式:GET请求如上。POST请求
syn_tweet_verson=1¶mstr=1&pic_template=&richtype=&richval=&special_url=&subrichtype=&who=1&con=qm".$content."&feedversion=1&ver=1&ugc_right=1&to_sign=1&hostuin=".$qq."&code_version=1&format=fs
其中$content和$qq为说说内容和QQ号。