QQ空间日志导出(php)

来源:互联网 发布:mysql是php 编辑:程序博客网 时间:2024/05/19 15:40

最近项目需要有一个博客搬家功能,需要能够导出用户的qq空间日志,试了多种方法未果,最终又找了网上很多qq空间算法的文章,最终搞定。有兴趣的同学一起学习。。。

先说下思路:

  1. 检查登录是否需要验证码,获取验证码校验值
  2. 通过验证码校验值、密码计算出登录校验值
  3. 模拟登录
  4. 计算qq空间获取日志的key
  5. 获取日志列表和每篇日志信息
简述实现步骤和请求地址:
  1. 检查是否需要验证码:
    • URL:http://check.ptlogin2.qq.com/check?uin=QQ号码&appid=549000912&ptlang=2052&js_type=2&js_ver=10009&r=0.12028346643338428
    • 参数说明:
      • uin:QQ号
      • r:随机数
    • 返回结果:
      • 不需要验证码:ptui_checkVC('0','!UYE','\x00\x00\x00\x00\x09\x15\xa9\x78')
      • 需要验证码:ptui_checkVC('1','a549914029222a94ee04501b02be85959c48245e930257d4','\x00\x00\x00\x00\x22\xc3\x37\x60');
    • 服务器会生成COOKIE,记得写入文件
    • 如果需要验证码,可以获取QQ验证码保存到本地,让用户手动输入
      • 拉取验证码url:http://captcha.qq.com/getimage?aid=549000912&r=随机数&uin=QQ号码
      • 注意:需要发送上面生产的COOKIE
  2. 计算校验值:
    • $uin = uin2bin($skey);
      $localstr = hexchar2bin($password);
      $localstr2= strtoupper(md5($localstr.$uin));
      $pwd = strtoupper(md5($localstr2 . strtoupper($code)));
    • 参数说明:
      • $sky:ptui_checkVC函数中的第三个参数
      • $password:QQ密码
      • $code:不需要验证码时,ptui_checkVC的第二个参数;需要验证码时,用户手动输入的验证码
  3. 模拟登录:
    • URL:http://ptlogin2.qq.com/login?ptlang=2052&u=QQ号码&p=上面加密后的$pwd&verifycode=验证码$code&css=http://imgcache.qq.com/p
      tcss/b2/sjpt/549000912/qzonelogin_ptlogin.css&mibao_css=m_qzone&aid=549000912&u1=http%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Flogin
      succ.html%3Fpara%3Dizone&ptredirect=1&h=1&from_ui=1&dumy=&fp=loginerroralert&action=4-16-29103&g=1&t=1&dummy=&js_type=2&js_ve
      r=10009
    • 要发送COOKIE,并记录新生产的COOKIE
    • 成功后返回结果:ptuiCB(\'0\',\'0\',\'http://qzs.qq.com/qzone/v5/loginsucc.html?para=izone\',\'1\',\'登录成功!\', \'QQ昵称\')
  4. 生成获取博客所需的g_tk:
    • $g_tk=getGtk($skey),$skey是COOKIE文件中的skey值,类似@kqFx8cEUd
  5. 获取日志列表:
    • URL:http://b1.cnc.qzone.qq.com/cgi-bin/blognew/get_abs?ref=qzone&iNotice=2&inCharset=gbk&outCharset=gbk&forma
      t=json&hostUin=QQ号码&uin=QQ号码&blogType=0&cateName=&cateHex=&statYear=&reqInfo=1&pos=%d&num=%d&sortType=0&absType
      =0&startTime=null&endTime=null&source=0&rand=%f&g_tk=$g_tk&verbose=0&ref=qzone
  6. 获取某篇日志:
    • URL:http://b1.cnc.qzone.qq.com/cgi-bin/blognew/blog_output_data?uin=QQ号码&blogid=日志ID&g_tk=$g_tk
用到的加密方法:
function hexchar2bin($str)
{
    $str = strtoupper(md5($str));
    return pack("H*",$str);
}
function uin2bin($uin)
{
    $str = str_replace('\x','',$uin);
    return pack("H*",trim($str));
}
function getGtk($skey)
{
    $hash = 5381;
    $len = strlen($skey);
    for($i = 0;$i < $len;$i++){
        $h = ($hash << 5) + ord($skey[$i]);
        $hash+=$h;
    }
    return $hash & 0x7fffffff;
}

源代码整理后上传