QQ空間日誌匯出(php)

bj_xuexi發表於2013-01-17

最近專案需要有一個部落格搬家功能,需要能夠匯出使用者的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;
}

原始碼整理後上傳

相關文章