php使用curl抓取qq空间的访客信息示例

config.php

php使用curl抓取qq空间的访客信息示例

 这篇文章主要介绍了php使用curl抓取qq空间的访客信息示例,需要的朋友可以参考下

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’, “n”);

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 .= “n”;

        }

        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’] . “t” . “TRUE” . “t” .
$cookie[‘path’] . “t” . “FALSE” . “t” . $cookie[‘expires’] . “t” .
$k . “t” . $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(“n”,
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 => ”,

            CURLOPT_HTTPHEADER => array(

               
‘Referer:

title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=5

49000912&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/ind

ex.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 =>
”,

            CURLOPT_HTTPHEADER => array(

               
‘Referer:

bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=54900091

2&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_lin

k=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.htm

l&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_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:

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 ResultExtract::checkVC($this->requestExec($options));

    }

 

    protected function report()

    {

        $url = ” .
Utils::jsRandom();

 

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL => $url,

            CURLOPT_HTTPHEADER => array(

                ‘Referer:

proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_lo

gin=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_ur

l=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.qzon

e.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.q

zone.com/download.html’,

                ‘User-Agent:’ . $this->user_agent,

                ‘Host:ui.ptlogin2.qq.com’,

                ‘Connection:keep-alive’,)

        );

 

        $this->requestExec($options);

 

    }

 

    protected function getLoginSubmitInfo($url)

    {

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL => $url,

            CURLOPT_HTTPHEADER => array(

                ‘Referer:’,

                ‘User-Agent:’ . $this->user_agent,

                ‘Host:xui.ptlogin2.qq.com’,

                ‘Connection:keep-alive’,

            )

        );

 

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

    }

 

    protected function 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)

    {

        $url = ”;

 

        $url .= ‘?’ . http_build_query(array(

                ‘u’ => $this->user,

                ‘verifycode’ => $verifycode));

 

        $url .= ‘&p=’ . $p; ###

 

        $url .= ‘&’ . http_build_query(array(

                ‘pt_rsa’ => $pt_rsa,

                ‘ptredirect’ => $ptredirect,

                ‘u1’ => $u1,

                ‘h’ => $h,

                ‘t’ => $t,

                ‘g’ => $g,

                ‘from_ui’ => $from_ui,

                ‘ptlang’ => $ptlang,

                ‘action’ => $action,

                ‘js_ver’ => $js_ver,

                ‘js_type’ => $js_type,

            ));

 

        $url .= ‘&login_sig=’ . $login_sig; ###

 

        $url .= ‘&’ . http_build_query(array(

                ‘aid’ => $aid,

                ‘daid’ => $daid,

                ‘pt_qzone_sig’ => $pt_qzone_sig));

 

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL => $url,

            CURLOPT_HTTPHEADER => array(

               
‘Referer:

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.qz

one.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:ptlogin2.qq.com’,

                ‘Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3’,

                ‘Connection:keep-alive’,

            )

        );

 

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

    }

 

    public function loginSuccessRedirect($url)

    {

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL => $url,

 

            CURLOPT_HTTPHEADER => array(

               
‘Referer:

_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.qz

one.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:qzs.qq.com’,

               
‘Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’,

                ‘Connection:keep-alive’,

                ‘DNT:1’,

            )

        );

        $this->requestExec($options);

    }

 

    public function  enterQzone($referer, $ptsig)

    {

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL => ” .
$this->user . ‘?ptsig=’ . $ptsig,

 

            CURLOPT_HTTPHEADER => array(

                ‘Referer:’ . $referer,

                ‘Host:user.qzone.qq.com’,

                ‘Connection:keep-alive’,

            )

        );

 

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

    }

 

    public function getCoreJs()

    {

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL =>

/feeds.js,/qzone/v8/ic/tab_friend_feed.js,/qzone/v8/toolbar/core.js”,

        );

 

        return
ResultExtract::getCoreJsInfo($this->requestExec($options),
$this->user);

    }

 

 

    public function getVisitorInfo($mask = 7, $page = 1, $fupdate = 1,
$clear = 1)

    {

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL =>
” .
http_build_query(array(

                ‘uin’ => $this->user,

                ‘mask’ => $mask,

                ‘g_tk’ => $this->getGTKEncryption(),

                ‘page’ => $page,

                ‘fupdate’ => $fupdate,

                ‘clear’ => $clear,

                ‘sd’ => Utils::jsRandom(),

            )),

 

            CURLOPT_HTTPHEADER => array(

               
‘Referer:’,

                ‘User-Agent:’ . $this->user_agent,

                ‘Host:g.qzone.qq.com’,

                ‘Connection:keep-alive’,

            )

        );

 

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

    }

 

    public function  rightFrameVisitor()

    {

        $param = Utils
::getGTK($this->getCookie(‘qzone_visitor_param’, true));

        $referver = Utils
::getGTK($this->getCookie(‘qzone_referer’));

 

        $options = array(

            CURLOPT_TIMEOUT => $this->request_timeout,

            CURLOPT_HEADER => 1,

            CURLOPT_RETURNTRANSFER => 1,

            CURLOPT_URL =>
” .
http_build_query(array(

                ‘uin’ => $this->user,

                ‘param’ => $param,

                ‘g_tk’ => $this->getGTKEncryption(),

            )),

 

            CURLOPT_HTTPHEADER => array(

                ‘Referer:’ . $referver,

                ‘User-Agent:’ . $this->user_agent,

                ‘Host:r.qzone.qq.com’,

                ‘Connection:keep-alive’,

            )

        );

 

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

    }

 

}

 

class CCKFServiceRequest extends BaseRequest

{

    protected $service_address;

    protected $service_id;

    protected $security_key;

 

    public function __construct($security_key, $service_id,
$service_address, $cookie_file, $request_timeout, $debug, $end_line)

    {

        parent:: __construct($cookie_file, $request_timeout, $debug,
$end_line);

        $this->service_address = $service_address;

        $this->service_id = $service_id;

        $this->security_key = $security_key;

    }

}

 

class CCKFService extends BaseRequest

{

    public function __construct($security_key, $service_id,
$service_address, $cookie_file, $request_timeout, $debug, $end_line)

    {

        parent:: __construct($security_key, $service_id,
$service_address, $cookie_file, $request_timeout, $debug,
$end_line);

    }

 

    public function uploadData($data)

    {

        if (is_array($data) && !empty($data)) {

            $options = array(

                CURLOPT_TIMEOUT => $this->request_timeout,

                CURLOPT_HEADER => 1,

                CURLOPT_RETURNTRANSFER => 1,

                CURLOPT_URL => $this->service_address . ‘?’ .
http_build_query(array()),

            );

        }

    }

}

 

class BaseConfigFileUtils

{

    protected $file;

 

    public function __construct($file)

    {

        $this->file = $file;

    }

 

    public function extractFile()

    {

        $f_str = ”;

 

        $fp = fopen($this->file, ‘r’);

        if (flock($fp, LOCK_SH)) {

            while (!feof($fp)) {

                $f_str .= fgets($fp);

            }

            flock($fp, LOCK_UN);

        }

        fclose($fp);

        $c = json_decode($f_str, true);

        return is_array($c) ? $c : array();

    }

}

 

class RunAtTimeConfig extends BaseConfigFileUtils

{

    protected $visitor_capture_interval;

    protected $config;

 

    public function __construct($file, $visitor_capture_interval)

    {

        parent::__construct($file);

        $this->config = $this->extractFile();

        $this->visitor_capture_interval =
$visitor_capture_interval;

    }

 

    public function  updateConfig($arr)

    {

        $this->config = $this->extractFile();

        if ($this->isValidateRun()) {

            $fp = fopen($this->file, ‘w’);

            if (flock($fp, LOCK_EX)) {

                fwrite($fp, json_encode(array_merge($this->config,
$arr)));

                flock($fp, LOCK_UN);

            }

            fclose($fp);

            return true;

        }

        return false;

    }

 

    public function  getConfig($item)

    {

        if (is_array($this->config) && array_key_exists($item,
$this->config)) {

            return $this->config[$item];

        }

        return null;

    }

 

    public function isValidateRun()

    {

        $c_time = Utils::getMicroTime();

        $run_at_time = floatval($this->getConfig(‘run_at_time’));

        if ($c_time – $run_at_time >=
$this->visitor_capture_interval) {

            return true;

        } else {

            return false;

        }

    }

}

 

class VisitorList extends BaseConfigFileUtils

{

    protected $visitor_list;

 

    /**$visitor_list [] = array(

    ‘uin’ => $visitor[‘uin’], ‘name’ => $visitor[‘name’],
‘online’ => $visitor[‘online’], ‘time’ => $visitor[‘time’],

    ‘img’ => $visitor[‘img’], ‘yellow’ => $visitor[‘yellow’],
‘supervip’ => $visitor[‘supervip’],

    );**/

 

    public function __construct($file)

    {

        parent::__construct($file);

        $this->visitor_list = $this->extractFile();

    }

 

    public function updateVisitor($visitor)

    {

        if (is_array($visitor) && !empty($visitor)) {

            foreach ($visitor as $one) {

                array_unshift($this->visitor_list, $one);

            }

        }

 

        $fp = fopen($this->file, ‘w’);

        if (flock($fp, LOCK_EX)) {

            fwrite($fp, json_encode($this->visitor_list));

            flock($fp, LOCK_UN);

        }

        fclose($fp);

    }

 

    public function addVisitor($visitor)

    {

        $list = array();

        if (is_array($visitor) && !empty($visitor)) {

            foreach ($visitor as $one) {

                if (!$this->isVisitorExist($one[‘name’])) {

                    $list[] = $one;

                }

            }

            $this->updateVisitor($list);

        }

 

        return $list;

    }

 

    public function isVisitorExist($name)

    {

        foreach ($this->visitor_list as $one) {

            if ($one[‘name’] == $name) {

                return true;

            }

        }

        return false;

    }

}

 

这篇文章主要介绍了php使用curl抓取qq空间的访客信息示例,需要的朋友可以参考下
config.php 代码如下:…

复制代码 代码如下:
define(‘APP_DIR’, dirname(apizl_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’, “n”);
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

复制代码 代码如下:
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

复制代码 代码如下:

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

    public static function br($num = 1)
    {
        $str = ”;
        for ($i = 0; $i < $num; $i++) {
            $str .= “
“;
        }
        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’] . “t” . “TRUE” . “t” .
$cookie[‘path’] . “t” . “FALSE” . “t” . $cookie[‘expires’] .
“t” . $k . “t” . $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(“n”,
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*.*?/’, $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);