php使用curl抓取qq空间的访客信息示例_php技巧
这篇文章主要介绍了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('/cfg\s*=\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_Data\s*=\s*{\s*feedsPart1\s*:\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\.plogin\s*=\s*\{(.*?)aqScanLink.*/s', '$1', $content); preg_match('/.*js_type\s*:\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*iframe\s*id\s*=\s*"login_frame"\s*name\s*=\s*"login_frame".*?src\s*=\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\.ptui\s*=\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('/^encodeURIComponent\s*\(\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://www.php.cn/', '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://www.php.cn/', '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://www.php.cn/', '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://www.php.cn/', '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://www.php.cn/', '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://www.php.cn/', '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://www.php.cn/', '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://www.php.cn/', '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; } }

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











How to set permission access in QQ space? You can set permission access in QQ space, but most friends don’t know how to set permission access in QQ space. Next is the diagram of how to set permission access in QQ space brought by the editor for users. Text tutorial, interested users come and take a look! QQ usage tutorial QQ space how to set permission access 1. First open the QQ application, click [Avatar] in the upper left corner of the main page; 2. Then expand the personal information area on the left and click the [Settings] function in the lower left corner; 3. Enter the settings page Swipe to find the [Privacy] option; 4. Next in the privacy interface, select the [Permission Settings] service; 5. Then challenge to the latest page and select [Space Dynamics]; 6. Set up in QQ Space again

As an important platform for us to share our lives and exchange emotions, QQ space carries a lot of personal information and memories. However, as the network environment becomes increasingly complex, how to protect personal privacy and reasonably control space access rights has become the focus of many users. Then the editor of this website brings you this article to introduce in detail the setting method of QQ space visitor permissions. Users who want to know more should not miss it. Come and follow this article to learn more! Then click on the menu option in the lower left corner. Click the Settings option in the menu and click Enter. After entering the settings options, click the permission settings option in the upper right corner. Click on Space Access Permissions. You can set it according to your own needs. You can freely change it according to your own needs in the permission settings.

In recent years, there has been an increasing demand for social network analysis. QQ Zone is one of the largest social networks in China, and its data crawling and analysis are particularly important for social network research. This article will introduce how to use the Scrapy framework to crawl QQ Space data and conduct social network analysis. 1. Introduction to Scrapy Scrapy is an open source web crawling framework based on Python. It can help us quickly and efficiently collect website data through the Spider mechanism, process and save it. S

How to set QQ space to be visible for three days? QQ space can be set to be visible for three days, but most friends don’t know how to set QQ space to be visible for three days. Next, the editor brings to users how to set QQ space to be visible for three days. Graphic tutorial, interested users come and take a look together! QQ usage tutorial How to set QQ space to be visible for 3 days 1. First open the QQ application, click [Settings] on the left side of the avatar in the upper left corner, and click [Privacy] on the setting interface; 2. Then in the privacy interface, select [Permission Settings]; 3. Then on the permission setting function page, click the [Friends Dynamic Permission Settings] service option; 4. Next on the Friend Dynamic Settings page, click the [Permissions and Security] function; 5. Select [Allow Viewing Dynamics] on the latest interface again

When we publish content in QQ space, we can use the function of smart matching. Some friends are not very familiar with this. Here is an introduction to how to operate it. Open the "QQ" application on your mobile phone, click the personal avatar in the upper left corner of the page after entering, then find and click the "Settings" option in the lower left corner of the pop-up menu page. 2. After entering the settings page, click to select "Privacy" to enter. 3. Next, there is a "Permission Settings" on the privacy page. When you see it, click on it to open it. 4. Click on the "Space Dynamics" item on the permission setting page to enter. 5. After coming to the space settings page, there is a "More Settings" at the bottom, click on it. 6. Click "Space Personalized Recommendation" in the more settings page to enter

Reasons why the QQ space web page cannot be opened: 1. Network connection problem; 2. Server problem; 3. The account is banned or access is restricted; 4. The device and browser used are incompatible with QQ space.

In the era of social networks, personal privacy protection is particularly important. As a social platform, QQ Zone also needs privacy settings to protect users’ private information. Next, let’s talk about how to set up QQ space permissions to make your space more secure and private. How to set permission access in QQ space 1. First open the QQ application, click [Avatar] in the upper left corner of the main page; 2. Then expand the personal information area on the left and click the [Settings] function in the lower left corner; 3. Enter the settings page and slide to find The [Privacy] option; 4. Next in the privacy interface, select the [Permission Settings] service; 5. Then challenge to the latest page and select [Space Updates]; 6. Click [More Settings] on the QQ Space setting interface again ]; 7. Update

The inability to save QQ space videos to your mobile phone may be due to copyright protection, platform restrictions, technical limitations and security considerations. The solution is as follows: 1. Users can save videos to their mobile phones through the download button or function provided by the platform; 2. Users can search for relevant video download tools in the app store or the Internet and operate according to the tool's instructions.
