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; } }

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Bagaimana untuk menetapkan akses kebenaran dalam ruang QQ? Anda boleh menetapkan akses kebenaran dalam ruang QQ, tetapi kebanyakan rakan tidak tahu bagaimana untuk menetapkan akses kebenaran dalam ruang QQ Seterusnya ialah rajah cara menetapkan akses kebenaran dalam ruang QQ yang dibawa oleh editor untuk pengguna Teks tutorial, pengguna yang berminat datang dan lihat! Tutorial penggunaan QQ Bagaimana untuk menetapkan kebenaran untuk ruang QQ 1. Mula-mula buka aplikasi QQ, klik [Avatar] di sudut kiri atas halaman utama 2. Kemudian kembangkan kawasan maklumat peribadi di sebelah kiri dan klik fungsi [Tetapan]. di sudut kiri bawah; 3. Masukkan halaman tetapan Leret untuk mencari pilihan [Privasi] 4. Seterusnya dalam antara muka privasi, pilih perkhidmatan [Tetapan Kebenaran] 5. Kemudian cabar ke halaman terkini dan pilih [Space Dynamics ]; 6. Tetapkan dalam QQ Space sekali lagi

Bagaimana untuk menetapkan ruang QQ untuk dilihat selama tiga hari? bagaimana untuk menetapkan ruang QQ untuk dilihat selama tiga hari Tutorial grafik, pengguna yang berminat datang dan lihat bersama-sama! Tutorial penggunaan QQ Bagaimana untuk menetapkan ruang QQ untuk kelihatan selama 3 hari 1. Mula-mula buka aplikasi QQ, klik [Tetapan] di sebelah kiri avatar di sudut kiri atas, dan klik [Privasi] pada antara muka tetapan 2. Kemudian dalam antara muka privasi, pilih [Tetapan Kebenaran]; fungsi; 5. Pilih [Allow Viewing Dynamics] pada antara muka terkini sekali lagi

Dalam beberapa tahun kebelakangan ini, terdapat peningkatan permintaan untuk analisis rangkaian sosial. Zon QQ ialah salah satu rangkaian sosial terbesar di China, dan rangkak dan analisis datanya amat penting untuk penyelidikan rangkaian sosial. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Scrapy untuk merangkak data QQ Space dan melakukan analisis rangkaian sosial. 1. Pengenalan kepada Scrapy Scrapy ialah rangka kerja rangkak web sumber terbuka berdasarkan Python Ia boleh membantu kami dengan cepat dan cekap mengumpul data tapak web melalui mekanisme Spider, memproses dan menyimpannya. S

Sebagai platform penting untuk kami berkongsi kehidupan dan bertukar-tukar emosi, ruang QQ membawa banyak maklumat dan kenangan peribadi. Walau bagaimanapun, apabila persekitaran rangkaian menjadi semakin kompleks, cara melindungi privasi peribadi dan mengawal hak akses ruang secara munasabah telah menjadi tumpuan ramai pengguna. Kemudian editor laman web ini membawakan anda artikel ini untuk memperkenalkan secara terperinci kaedah penetapan kebenaran pelawat ruang QQ Pengguna yang ingin mengetahui lebih lanjut jangan ketinggalan. Datang dan ikuti artikel ini untuk mengetahui lebih lanjut. Kemudian klik pada pilihan menu di sudut kiri bawah. Klik pilihan Tetapan dalam menu dan klik Enter. Selepas memasukkan pilihan tetapan, klik pilihan tetapan kebenaran di penjuru kanan sebelah atas. Klik pada kebenaran akses ruang. Anda boleh menetapkannya mengikut keperluan anda sendiri. Anda boleh menukarnya secara bebas mengikut keperluan anda sendiri dalam tetapan kebenaran.

Ketidakupayaan untuk menyimpan video QQ Space ke telefon mudah alih anda mungkin disebabkan oleh perlindungan hak cipta, sekatan platform, had teknikal dan pertimbangan keselamatan. Penyelesaiannya adalah seperti berikut: 1. Pengguna boleh menyimpan video ke telefon bimbit mereka melalui butang muat turun atau fungsi yang disediakan oleh platform 2. Pengguna boleh mencari alat muat turun video yang berkaitan di gedung aplikasi atau Internet dan beroperasi mengikut alat tersebut; arahan.

Sebab laman web ruang QQ tidak boleh dibuka: 1. Masalah sambungan rangkaian 2. Masalah pelayan 3. Akaun dilarang atau akses disekat 4. Peranti dan pelayar yang digunakan tidak serasi dengan ruang QQ

Apabila kami menerbitkan kandungan dalam ruang QQ, kami boleh menggunakan fungsi pemadanan pintar Sesetengah rakan tidak begitu biasa dengan ini. Buka aplikasi "QQ" pada telefon bimbit anda, klik avatar peribadi di sudut kiri atas halaman selepas masuk, kemudian cari dan klik pilihan "Tetapan" di sudut kiri bawah halaman menu timbul. 2. Selepas memasuki halaman tetapan, klik untuk memilih "Privasi" untuk masuk. 3. Seterusnya, terdapat "Tetapan Kebenaran" pada halaman privasi Apabila anda melihatnya, klik padanya untuk membukanya. 4. Klik pada item "Space Dynamics" pada halaman tetapan kebenaran untuk masuk. 5. Selepas datang ke halaman tetapan ruang, terdapat "Lagi Tetapan" di bahagian bawah, klik padanya. 6. Klik "Syor Peribadi Ruang" pada halaman lebih banyak tetapan untuk masuk

Dalam era rangkaian sosial, perlindungan privasi peribadi amat penting. Sebagai platform sosial, Zon QQ juga memerlukan tetapan privasi untuk melindungi maklumat peribadi pengguna. Seterusnya, mari kita bincangkan tentang cara menyediakan kebenaran ruang QQ untuk menjadikan ruang anda lebih selamat dan peribadi. Bagaimana untuk menetapkan akses kebenaran dalam ruang QQ 1. Mula-mula buka aplikasi QQ, klik [Avatar] di sudut kiri atas halaman utama 2. Kemudian kembangkan kawasan maklumat peribadi di sebelah kiri dan klik fungsi [Tetapan] dalam sudut bawah kiri; ; 6. Klik [Lagi Tetapan] pada antara muka tetapan Ruang QQ sekali lagi ] 7. Kemas kini
