這篇文章主要介紹了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 => '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=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 => '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=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://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 ResultExtract::checkVC($this->requestExec($options)); } protected function report() { $url = 'http://ui.ptlogin2.qq.com/cgi-bin/report?id=358342&t=' . Utils::jsRandom(); $options = array( CURLOPT_TIMEOUT => $this->request_timeout, CURLOPT_HEADER => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $url, 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_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:http://qzone.qq.com/', '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 = 'http://ptlogin2.qq.com/login'; $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: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.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: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.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 => 'http://user.qzone.qq.com/' . $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 => "http://ctc.qzonestyle.gtimg.cn/c/=/qzone/v8/engine/cpu.js,/qzone/v8/ic/qm.js,/qzone/v8/ic/tab_menu.js,/qzone/v8/ic /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://g.qzone.qq.com/cgi-bin/friendshow/cgi_get_visitor_more?' . 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:http://ctc.qzs.qq.com/qzone/v6/friend_manage/visitors.html', '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://r.qzone.qq.com/cgi-bin/right_frame.cgi?' . 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; } }