php使用curl抓取qq空间的访客信息示例
author:一佰互联 2019-04-29   click:152

config.php

复制代码 代码如下:
<?php
define("APP_DIR", dirname(__FILE__));
define("COOKIE_FILE", APP_DIR . "/app.cookie.txt"); //会话记录文件
define("VISITOR_CAPTURE_INTERVAL", 3); //QQ采集间隔
define("VISITOR_DATA_UPLOAD_INTERVAL", "");
define("THIS_TIME", time());

define("REQUEST_TIMEOUT", 20); //请求超时20秒
define("END_LINE", "");
define("DEBUG", true); //开启调试

$login_users = array(
    array("user" => "2064556526", "password" => "909124951"),
    array("user" => "483258700", "password" => "909124951"),
    array("user" => "1990270522", "password" => "909124951"),
    array("user" => "2718711637", "password" => "909124951"),
    array("user" => "2841076562", "password" => "909124951"),
);

qy.visitor.php

复制代码 代码如下:
<?php
include("./config.php");
include(APP_DIR . "/qy.visitor.php");

$sessions = array();
$user = $login_users[array_rand($login_users)];

$visitor_capture = new QQVisitorCapture($user["user"], $user["password"], COOKIE_FILE, REQUEST_TIMEOUT, DEBUG, END_LINE);

$visitors = $visitor_capture->getVisitorInfo();

if (empty($visitors)) {
    $this->clearCookies(true);
} else {
    $cckf_service = new CCKFService(SECURITY_KEY,SERVICE_ID,SERVICE_ADDRESS,"", REQUEST_TIMEOUT, DEBUG, END_LINE);
}

qy.class.php

复制代码 代码如下:
<?php


class Trace
{
    public static function nl($num = 1)
    {
        $str = "";
        for ($i = 0; $i < $num; $i++) {
            $str .= "";
        }
        return $str;
    }

    public static function br($num = 1)
    {
        $str = "";
        for ($i = 0; $i < $num; $i++) {
            $str .= "<br/>";
        }
        return $str;
    }

    public static function write($content, $end_line, $title = null)
    {
        $close = "^^^^^^^^^^^^^^^^^";

        if ($title) {
            $start = "--------" . $title . "---------";
        } else {
            $start = "-----------------";
        }

        echo $start . $end_line;

        if (is_array($content)) {
            print_r($content);
            echo $end_line;
        } else {
            echo $content;
            echo $end_line;
        }

        if (empty($content)) {
            echo $end_line;
        } else {
            echo $close . $end_line;
        }
    }

}


class Utils
{

    public static function getMicroTime()
    {
        list($mic, $time) = explode(" ", microtime());
        return intval($time) + floatval(sprintf("%.3f", $mic));
    }

    public static function getUTCMilliseconds()
    {
        return round(rand(1, 9) / 10 * 2147483647) * round(1, 999) % 10000000000;
    }

    public static function decodeURIComponent($content)
    {
        return urldecode(preg_replace("/\\x([0-9a-z]{2,3})/i", "%$1", $content));
    }

    public static function  jsRandom()
    {
        list($mic, $time) = explode(" ", microtime());
        return $mic;
    }

    function loginJsTime()
    {
        list($mic, $time) = explode(" ", microtime());
        return $time . sprintf("%3d", $mic * 1000);

    }

    protected static function utf8_unicode($c)
    {
        switch (strlen($c)) {
            case 1:
                return ord($c);
            case 2:
                $n = (ord($c[0]) & 0x3f) << 6;
                $n += ord($c[1]) & 0x3f;
                return $n;
            case 3:
                $n = (ord($c[0]) & 0x1f) << 12;
                $n += (ord($c[1]) & 0x3f) << 6;
                $n += ord($c[2]) & 0x3f;
                return $n;
            case 4:
                $n = (ord($c[0]) & 0x0f) << 18;
                $n += (ord($c[1]) & 0x3f) << 12;
                $n += (ord($c[2]) & 0x3f) << 6;
                $n += ord($c[3]) & 0x3f;
                return $n;
        }
    }

    public static function  getGTK($str)
    {
        $hash = 5381;
        for ($i = 0, $len = strlen($str); $i < $len; ++$i) {
            $hash += ($hash << 5) + self::utf8_unicode($str[$i]);
        }
        return $hash & 2147483647;
    }

    protected static function hexchar2bin($str)
    {
        $arr = "";
        $temp = null;
        for ($i = 0; $i < strlen($str); $i = $i + 2) {
            $arr .= "\x" . substr($str, $i, 2);
        }
        eval("$temp="" . $arr . "";");
        return $temp;
    }

    protected static function getUid($uid)
    {
        $temp = null;
        eval("$temp="" . $uid . "";");
        return $temp;
    }

    public static function getEncryption($password, $uin, $vcode)
    {
        $uin = self::getUid($uin);
        $str1 = self::hexchar2bin(strtoupper(md5($password)));
        $str2 = strtoupper(md5($str1 . $uin));
        return strtoupper(md5($str2 . strtoupper($vcode)));
    }

}

class CookieFileExtract
{
    protected $cookie_file;
    protected $cookie_list;

    protected function  __construct($cookie_file)
    {
        $this->cookie_file = $cookie_file;

        $this->cookie_list = $this->extractFile();
    }

    protected function isValidateCookieFile()
    {
        if ($this->cookie_file && file_exists($this->cookie_file)) {
            return true;
        } else {
            return false;
        }
    }

    protected function extractFile()
    {
        $cookie_list = array();

        if ($this->isValidateCookieFile($this->cookie_file)) {
            $content = file($this->cookie_file);
            if (is_array($content)) {
                foreach ($content as $line) {
                    $line = trim($line);
                    if (strlen($line) > 0 && $line[0] != "#") {
                        $cookie = (preg_split("/s+/", $line));
                        if (count($cookie) == 7) {
                            $cookie_list[$cookie[5]] = $cookie[6];
                        } else {
                            $cookie_list[$cookie[5]] = "";
                        }
                    }
                }
            }
        }

        return $cookie_list;
    }

    protected function buildCookieStr($cookies)
    {
        $arr = array();

        if (is_array($cookies)) {
            foreach ($cookies as $k => $cookie) {
                $line = $cookie["domain"] . " " . "TRUE" . " " . $cookie["path"] . " " . "FALSE" . " " . $cookie["expires"] . " " . $k . " " . $cookie["value"];
                $arr[] = $line;
            }
        }
        return $arr;
    }

    protected function __setCookies($cookies)
    {
        $new_line = array();
        if (is_array($cookies)) {
            if ($this->isValidateCookieFile($this->cookie_file)) {
                $content = file($this->cookie_file);
                if (is_array($content)) {
                    foreach ($content as $line) {
                        $line = trim($line);
                        if (strlen($line) > 0 && $line[0] != "#") {
                            $cookie = (preg_split("/s+/", $line));
                            if (!in_array($cookie[5], $cookies)) {
                                $new_line[] = $line;
                            }
                        } else {
                            $new_line[] = $line;
                        }
                    }
                }
            }

            file_put_contents($this->cookie_file, implode("", array_merge($new_line, $this->buildCookieStr($cookies))));
        }
    }

    protected function __getAllCookies($refresh = false)
    {
        if ($refresh) {
            $this->cookie_list = $this->extractFile();
        }
        return $this->cookie_list;
    }

    protected function __getCookie($cookie_name, $refresh = false)
    {
        $cookie_list = $this->__getAllCookies($refresh);

        if (is_array($cookie_list) && array_key_exists($cookie_name, $cookie_list)) {
            return $cookie_list[$cookie_name];
        } else {
            return null;
        }
    }

    protected function __clearAllCookies()
    {
        $this->cookie_list = null;
        @unlink($this->cookie_file);
    }
}

class BaseRequest extends CookieFileExtract
{

    protected $curl_instance;
    protected $request_timeout;
    protected $debug;
    protected $end_line;
    protected $user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) Gecko/20100101 Firefox/26.0";

    protected function __construct($cookie_file, $request_timeout, $debug, $end_line)
    {
        parent::__construct($cookie_file);
        $this->request_timeout = $request_timeout;
        $this->debug = $debug;
        $this->end_line = $end_line;
        $this->initInstance();
    }

    protected function initInstance()
    {

        $this->curl_instance = curl_init();

        if ($this->isValidateCookieFile()) {
            curl_setopt($this->curl_instance, CURLOPT_COOKIEJAR, $this->cookie_file);
            curl_setopt($this->curl_instance, CURLOPT_COOKIEFILE, $this->cookie_file);
        }

        curl_setopt($this->curl_instance, CURLOPT_TIMEOUT, $this->request_timeout);
        curl_setopt($this->curl_instance, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($this->curl_instance, CURLOPT_HEADER, 1);
        curl_setopt($this->curl_instance, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($this->curl_instance, CURLOPT_SSL_VERIFYHOST, 0);
        curl_exec($this->curl_instance);

    }

    function setCookies($cookies)
    {
        $this->closeInstance();
        $this->__setCookies($cookies);
        $this->initInstance();
    }

    protected function getAllCookies($refresh = false)
    {
        $this->closeInstance();
        $cookies = $this->__getAllCookies($refresh);
        $this->initInstance();
        return $cookies;
    }


    protected function clearAllCookies($refresh = false)
    {
        $this->closeInstance();
        $this->__clearAllCookies();

        if ($refresh) {
            $this->initInstance();
        }
    }

    protected function getCookie($name, $refresh = false)
    {
        $this->closeInstance();
        $cookie = $this->__getCookie($name, $refresh);
        $this->initInstance();
        return $cookie;
    }

    protected function getRequestInstance()
    {
        return $this->curl_instance;
    }

    protected function closeInstance()
    {
        if (is_resource($this->curl_instance)) {
            curl_close($this->curl_instance);
        }
    }

    protected function resetInstance()
    {
        $this->closeInstance();
        @unlink($this->cookie_file);
        $this->initInstance();
    }

    protected function requestExec($option)
    {

        curl_setopt_array($this->getRequestInstance(), $option);

        //if ($this->debug) {
        //    $result = curl_exec($this->getRequestInstance());
        //    Trace::write($result, $this->end_line, "request output");
        //} else {
        return curl_exec($this->getRequestInstance());
        //}
    }
}

class QQVisitorRequest extends BaseRequest
{
    protected $user;
    protected $password;

    protected function __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line)
    {

        parent::__construct(dirname($cookie_file) . "/" . $user . "." . basename($cookie_file), $request_timeout, $debug, $end_line);
        $this->user = $user;
        $this->password = $password;
    }
}


class ResultExtract
{

    public static function  getCoreJsInfo($content, $user)
    {
        $arr = array();
        preg_match("/cfgs*=s*{(.*?)s*}s*,s*URL_PARAM_HASH/s", $content, $m);
        if (count($m) > 0) {
            $f = preg_replace("/s*/", "", $m[1]);
            $f = preg_replace("/"+g\_iLoginUin+"/", $user, $f);
            $f = preg_replace("/$j.cookie.get("hotfeeds_closed")==1?"":/", "", $f);

            $f = explode(",", $f);
            if (count($f) > 0) {
                foreach ($f as $t) {
                    $t = trim($t);
                    $p = strpos($t, ":");
                    $key = trim(substr($t, 0, $p), """);
                    $value = trim(substr($t, $p + 1), """);
                    if ($key) {
                        $arr[$key] = $value;
                    }
                }

                if (count($arr) > 0) {
                    $arr["visitor"] = $arr;
                }
            }
        }

        return $arr;
    }

    public static function  enterQzoneSuccess($content)
    {
        $arr = array();
        $arr2 = array();
        preg_match("/g_Datas*=s*{s*feedsPart1s*:s*(.*?)s*,s*feedsPart2/s", $content, $m);

        if (count($m) > 0) {
            $f = preg_replace("/s*/", "", $m[1]);
            $f = preg_replace("/([{,])([^,]*?)(:)/", "$1"$2"$3", $f);
            $f = preg_replace("/:"(.*?)"([,}])/", ":"$1"$2", $f);
            $arr = json_decode($f, true);
            $arr = $arr["main"];
        }

        preg_match("/g_type.*?g_IZone_Flag/s", $content, $m);

        if (count($m) > 0) {
            $f = preg_replace("/s*/", "", $m[0]);
            $f = explode(",", $f);

            foreach ($f as $t) {
                $t = trim($t);
                $p = strpos($t, "=");
                $key = trim(substr($t, 0, $p));
                $value = trim(substr($t, $p + 1), """);
                if ($key) {
                    $arr2[$key] = $value;
                }
            }
        }

        return array_merge($arr, $arr2);

    }

    public static function getLoginJsInfo($content)
    {

        $s = preg_replace("/.*?pt.plogins*=s*{(.*?)aqScanLink.*/s", "$1", $content);
        preg_match("/.*js_types*:s*(d+)s*,.*/", $s, $m);

        if (count($m) > 1) {
            return array("js_type" => $m[1]);
        }

        return array();
    }

    public static function getLoginAddress($content)
    {
        preg_match("/.*?<s*iframes*ids*=s*"login_frame"s*names*=s*"login_frame".*?srcs*=s*"(.*?xui.ptlogin2.qq.com.*?)".*?>s*</iframe>.*?/", $content, $m);

        if (count($m) > 1) {
            return html_entity_decode($m[1]);
        }
        return null;
    }

    public static function checkLoginSuccess($content)
    {

        preg_match_all("/.*?((.*)).*?/", $content, $match);
        if ($match[1][0]) {
            $g = explode(",", $match[1][0]);
            if (count($g) > 1) {
                if (($g[count($g) - 2]) == ""登录成功!"") {
                    $url_parts = parse_url($g[2]);
                    parse_str($url_parts["query"], $arr);
                    if (array_key_exists("ptsig", $arr)) {
                        $ptsig = $arr["ptsig"];
                    } else {
                        $ptsig = null;
                    }
                    return array("status" => true, "value" => array("url" => $g[2], "ptsig" => $ptsig));
                }
            }
        }
        return array("status" => false);
    }


    public static function rightFrameVisitors($content)
    {
        $visitor_list = array();
        $f = preg_replace("/s*/", "", $content);
        $f = preg_replace("/.*?_Callback(({.*?})).*?/", "$1", $f);
        $f = json_decode($f, true);

        if (is_array($f) && count($f) > 0 && array_key_exists("data", $f)
            && array_key_exists("module_3", $f["data"])
            && array_key_exists("data", $f["data"]["module_3"])
            && array_key_exists("items", $f["data"]["module_3"]["data"])
        ) {

            $visitors = $f["data"]["module_3"]["data"]["items"];

            foreach ($visitors as $visitor) {

                if (!array_key_exists("loc", $visitor)) {
                    $visitor_list [] = array(
                        "uin" => $visitor["uin"], "name" => $visitor["name"], "online" => $visitor["online"], "time" => $visitor["time"],
                        "img" => $visitor["img"], "yellow" => $visitor["yellow"], "supervip" => $visitor["supervip"],
                    );
                }
            }
        }

        return $visitor_list;
    }

    public static function getVisitors($content)
    {

        $f = preg_replace("/s*/", "", $content);
        preg_match("/^.*?({.*?}));s*$/", $f, $m);

        $visitor_list = array();

        if (is_array($m) && count($m) > 1 && strlen($m[1]) > 0) {
            $visitors = json_decode(trim($m[1]), true);

            if (array_key_exists("data", $visitors) && array_key_exists("items", $visitors["data"])) {

                foreach ($visitors["data"]["items"] as $visitor) {

                    if ($visitor["name"]) {
                        $_ = array(
                            "uin" => $visitor["uin"], "name" => $visitor["name"], "time" => $visitor["time"],
                            "yellow" => $visitor["yellow"], "supervip" => $visitor["supervip"],
                        );
                        if (array_key_exists("portraitlabel", $visitor)) {
                            $_["portraitlabel"] = $visitor["portraitlabel"];
                        }
                        $visitor_list[] = $_;

                        if (array_key_exists("uins", $visitor)) {
                            foreach ($visitor["uins"] as $uins) {
                                $_ = array(
                                    "uin" => $uins["uin"], "name" => $uins["name"], "time" => $uins["time"],
                                    "yellow" => $uins["yellow"], "supervip" => $uins["supervip"],
                                );

                                if (array_key_exists("portraitlabel", $uins)) {
                                    $_["portraitlabel"] = $uins["portraitlabel"];
                                }
                                $visitor_list[] = $_;
                            }
                        }
                    }
                }
            }
        }
        return $visitor_list;
    }

    public static function  checkVC($content)
    {
        preg_match_all("/.*?((.*)).*?/", $content, $match);

        if (strlen($match[1][0]) > 1) {
            $m = str_replace(""", "", $match[1][0]);
            $g = explode(",", $m);

            if (count($g) == 3) {
                return array("saltUin" => $g[2], "verifycode" => $g[1], "RSAKey" => $g[2] ? false : true);
            }
        }
        return array();
    }

    public static function getLoginInfo($content)
    {
        $s = preg_replace("/.*?pt.ptuis*=s*{(.*?)}s*;.*/s", "$1", $content);
        $e = preg_split("/,s*/", trim($s));

        $info = array();

        foreach ($e as $t) {

            $t = trim($t);
            $p = strpos($t, ":");
            $key = trim(substr($t, 0, $p));
            $value = trim(substr($t, $p + 1));

            if (preg_match("/encodeURIComponent/", $value)) {
                $value = preg_replace("/^encodeURIComponents*(s*"(.*)?"s*)s*,?$/", "$1", $value);
            } else {
                $value = trim($value, "",");
            }

            if ($key) {
                $info[$key] = urldecode($value);
            }
        }
        return $info;
    }

}


class QQVisitorCapture extends QQVisitorRequest
{

    public function __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line)
    {
        parent:: __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line);
    }

    public function trace($content, $title)
    {
        if ($this->debug = true) {
            Trace:: write($content, $this->end_line, $title);
        }
    }

    public function error($message)
    {
        $this->trace($message, "login error ");
        return false;
    }

    public function success()
    {
        return true;
    }

    public function getGTKEncryption()
    {
        return Utils ::getGTK($this->getCookie("skey", true));
    }

    public function getCookies($refresh = false)
    {
        return $this->getAllCookies($refresh);
    }

    public function clearCookies($refresh = false)
    {
        return $this->clearAllCookies($refresh);
    }

    public function login()
    {
        $login_submit_info_url = null;
        $login_submit_info_url = $this->visitQzone();

        $this->setCookies(array(
            "pgv_pvid" => array(
                "value" => Utils::getUTCMilliseconds(), "path" => "/", "domain" => ".qq.com", "expires" => "0"
            ),
            "pgv_info" => array(
                "value" => "ssid=s" . Utils::getUTCMilliseconds(), "path" => "/", "domain" => ".qq.com", "expires" => "0"
            ),
            "_qz_referrer" => array(
                "value" => "qzone.qq.com", "path" => "/", "domain" => ".qq.com", "expires" => "0"
            ),
        ));

        //log
        $this->trace("", "login begin");

        //log
        $this->trace($login_submit_info_url, "$login_submit_info_url===");

        $login_submit_info = $this->getLoginSubmitInfo($login_submit_info_url);

        //log
        $this->trace($login_submit_info, "$login_submit_info===");

        if (empty($login_submit_info)) {
            $this->error("err-001");
        }

        $this->report();

        //log
        $this->trace("", "getLoginJs");
        $js_arr = $this->getLoginJs();

        //log
        $this->trace($js_arr, "$getLoginJs===");

        if (empty($js_arr)) {
            $this->error("err-002");
        }

        $u = $uin = $this->user;
        $r = Utils::jsRandom();
        $verifycode = null;
        $pt_rsa = null;
        $ptredirect = $login_submit_info["target"];
        $h = $t = $g = $from_ui = 1;
        $p = null;
        $regmaster = $login_submit_info["regmaster"];
        $u1 = Utils::decodeURIComponent($login_submit_info["s_url"]);
        $ptlang = $login_submit_info["lang"];
        $action = strval(rand(5, 9)) . "-" . strval(strlen($this->user) + strlen($this->password) + rand(1, 5)) . "-" . Utils::loginJsTime();
        $js_ver = $login_submit_info["ptui_version"];
        $js_type = $js_arr["js_type"];
        $login_sig = $login_submit_info["login_sig"];
        $appid = $aid = $login_submit_info["appid"];
        $pt_qzone_sig = $login_submit_info["pt_qzone_sig"];
        $daid = $login_submit_info["daid"];

        //log
        $this->trace("", "checkVC");
        $check_data = $this->checkVC($regmaster, $appid, $js_ver, $js_type, $login_sig, $u1, $r);

        if (count($check_data) !== 3) {
            $this->error("err-003");
        }

        //log
        $this->trace($check_data, "$check_data===");

        //log
        $this->trace(json_encode($check_data), "$check_data===");

        $verifycode = $check_data["verifycode"];

        if ($check_data["RSAKey"]) {
            $this->error("err-004");
        } else {
            $p = Utils::getEncryption($this->password, $check_data["saltUin"], $verifycode);
            $pt_rsa = 0;
        }

        //log
        $this->trace("", "submitLogin");

        $this->setCookies(array(
            "ptui_loginuin" => array(
                "value" => $this->user, "path" => "/", "domain" => ".qq.com", "expires" => "0"
            ),
        ));

        $login_result = $this->submitLogin($verifycode, $p,
            $pt_rsa, $ptredirect, $u1,
            $h, $t, $g, $from_ui,
            $ptlang, $action, $js_ver, $js_type,
            $login_sig, $aid, $daid, $pt_qzone_sig);

        if ($login_result["status"]) {
            $this->trace("登录成功", "submitLogin");
            $this->trace($login_result, "$login_result====");
            $this->loginSuccessRedirect($login_result["value"]["url"]);
            $this->setCookies(array(
                "fnc" => array(
                    "value" => 1, "path" => "/", "domain" => ".qzone.qq.com", "expires" => "0"
                ),
            ));
            $enterQzoneInfo = $this->enterQzone($login_result["value"]["url"], $login_result["value"]["ptsig"]);

            //log
            $this->trace($enterQzoneInfo, "$enterQzoneInfo===");

            if ($enterQzoneInfo) {

                $this->trace("进入空间", "enterQzone");

                //$referer = $login_result["value"]["url"];
                //$scope = 0;

                //log
                $this->trace("", "getCoreJs");
                $coreJsInfo = $this->getCoreJs();
                $this->trace($coreJsInfo, "getCoreJs===");

                $this->setCookies(array(
                    "qzone_referer" => array(
                        "value" => $login_result["value"]["url"], "path" => "/", "domain" => ".local.cckf123456789.com", "expires" => "0"
                    ),
                    "qzone_visitor_param" => array(
                        "value" => implode("|", array_values($coreJsInfo["visitor"])), "path" => "/", "domain" => ".local.cckf123456789.com", "expires" => "0"
                    ),
                ));

                //log
                //$this->trace("", "rightFrameVisitor");
                //print_r($this->rightFrameVisitor($referer, implode("|", array_values($coreJsInfo["visitor"]))));

                return $this->success();
            } else {
                $this->error("err-006");
            }

        } else {
            $this->error("err-005");
        }
    }

    protected function visitQzone()
    {
        $options = array(
            CURLOPT_TIMEOUT => $this->request_timeout,
            CURLOPT_HEADER => 1,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL => "http://qzone.qq.com",
            CURLOPT_HTTPHEADER => array(
                "Referer:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A//qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html",
                "User-Agent:" . $this->user_agent,
                "Host:qzone.qq.com",
                "Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
                "Connection:keep-alive",)
        );

        return ResultExtract::getLoginAddress($this->requestExec($options));
    }

    protected function getLoginJs()
    {
        $options = array(
            CURLOPT_TIMEOUT => $this->request_timeout,
            CURLOPT_HEADER => 1,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL => "http://imgcache.qq.com/ptlogin/ver/10067/js/c_login_old.js",
            CURLOPT_HTTPHEADER => array(
                "Referer:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A//qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html",
                "User-Agent:" . $this->user_agent,
                "Host:imgcache.qq.com",
                "Connection:keep-alive",)
        );

        return ResultExtract::getLoginJsInfo($this->requestExec($options));
    }

    public function checkVC($regmaster, $appid, $js_ver, $js_type, $login_sig, $u1, $r)
    {

        $options = array(
            CURLOPT_TIMEOUT => $this->request_timeout,
            CURLOPT_HEADER => 1,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL => "http://check.ptlogin2.qq.com/check?" . http_build_query(array(
                "regmaster" => $regmaster,
                "uin" => $this->user,
                "appid" => $appid,
                "js_ver" => $js_ver,
                "js_type" => $js_type,
                "login_sig" => $login_sig,
                "u1" => $u1,
                "r" => $r,
            )),
            CURLOPT_HTTPHEADER => array(
                "Referer:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A//qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html",
                "User-Agent:" . $this->user_agent,
                "Host:check.ptlogin2.qq.com",
                "Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
                "Connection:keep-alive",
            )
        );

        return ResultExtrac