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

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Wie stelle ich den Berechtigungszugriff im QQ-Bereich ein? Sie können den Berechtigungszugriff im QQ-Bereich festlegen, aber die meisten Freunde wissen nicht, wie der Berechtigungszugriff im QQ-Bereich festgelegt wird Editor für Benutzer. Interessierte Benutzer kommen vorbei und schauen sich um! Tutorial zur QQ-Nutzung QQ-Bereich So legen Sie den Berechtigungszugriff fest 1. Öffnen Sie zunächst die QQ-Anwendung, klicken Sie auf [Avatar] in der oberen linken Ecke der Hauptseite 2. Erweitern Sie dann den Bereich für persönliche Informationen auf der linken Seite und klicken Sie auf die Funktion [Einstellungen]. in der unteren linken Ecke; 3. Rufen Sie die Einstellungsseite auf. Wischen Sie, um die Option [Datenschutz] zu finden. 4. Wählen Sie als nächstes den Dienst [Berechtigungseinstellungen] aus. Wählen Sie dann die neueste Seite aus ]; 6. Neu im QQ Space einrichten

Wie stellt man den QQ-Bereich so ein, dass er drei Tage lang sichtbar ist? Die meisten Freunde wissen jedoch nicht, wie man den QQ-Bereich so einstellt, dass er drei Tage lang sichtbar ist So stellen Sie den QQ-Bereich so ein, dass er drei Tage lang sichtbar ist. Interessierte Benutzer kommen vorbei und schauen sich das Ganze gemeinsam an! Tutorial zur QQ-Nutzung So stellen Sie ein, dass der QQ-Bereich 3 Tage lang sichtbar ist 1. Öffnen Sie zunächst die QQ-Anwendung, klicken Sie links neben dem Avatar in der oberen linken Ecke auf [Einstellungen] und klicken Sie auf der Einstellungsoberfläche auf [Datenschutz]. Wählen Sie dann in der Datenschutzoberfläche [Berechtigungseinstellungen] aus. 3. Klicken Sie dann auf der Seite mit der Berechtigungseinstellung auf die Dienstoption [Dynamische Berechtigungseinstellungen für Freunde]. 4. Klicken Sie dann auf der Seite „Dynamische Einstellungen für Freunde“ auf [Berechtigungen und Sicherheit]. Funktion; 5. Wählen Sie auf der neuesten Benutzeroberfläche erneut [Ansichtsdynamik zulassen].

In den letzten Jahren ist die Nachfrage nach der Analyse sozialer Netzwerke gestiegen. QQ Zone ist eines der größten sozialen Netzwerke in China, und das Crawlen und Analysieren seiner Daten ist für die Forschung in sozialen Netzwerken besonders wichtig. In diesem Artikel wird erläutert, wie Sie mit dem Scrapy-Framework QQ Space-Daten crawlen und soziale Netzwerkanalysen durchführen. 1. Einführung in Scrapy Scrapy ist ein auf Python basierendes Open-Source-Webcrawler-Framework, das uns dabei helfen kann, Website-Daten schnell und effizient über den Spider-Mechanismus zu sammeln, zu verarbeiten und zu speichern. S

Als wichtige Plattform für uns, um unser Leben zu teilen und Emotionen auszutauschen, enthält der QQ-Raum viele persönliche Informationen und Erinnerungen. Da die Netzwerkumgebung jedoch immer komplexer wird, ist für viele Benutzer die Frage, wie man die Privatsphäre schützt und die Zugriffsrechte auf den Weltraum angemessen kontrolliert, in den Fokus gerückt. Dann bringt Ihnen der Herausgeber dieser Website diesen Artikel, um Ihnen die Einstellungsmethode für QQ-Space-Besucherberechtigungen im Detail vorzustellen. Benutzer, die mehr wissen möchten, sollten diesen Artikel nicht verpassen, um mehr zu erfahren. Klicken Sie dann auf die Menüoption in der unteren linken Ecke. Klicken Sie im Menü auf die Option „Einstellungen“ und dann auf „Eingabe“. Klicken Sie nach Eingabe der Einstellungsoptionen auf die Option „Berechtigungseinstellungen“ in der oberen rechten Ecke. Klicken Sie auf Space-Zugriffsberechtigungen. Sie können es nach Ihren eigenen Bedürfnissen einstellen. Sie können es in den Berechtigungseinstellungen frei nach Ihren eigenen Bedürfnissen ändern.

Dass QQ Space-Videos nicht auf Ihrem Mobiltelefon gespeichert werden können, kann auf Urheberrechtsschutz, Plattformeinschränkungen, technische Einschränkungen und Sicherheitserwägungen zurückzuführen sein. Die Lösung lautet wie folgt: 1. Benutzer können Videos über den Download-Button oder die von der Plattform bereitgestellte Funktion auf ihren Mobiltelefonen speichern. 2. Benutzer können im App Store oder im Internet nach relevanten Video-Download-Tools suchen und entsprechend den Tools vorgehen Anweisungen.

Gründe, warum die QQ Space-Webseite nicht geöffnet werden kann: 1. Netzwerkverbindungsproblem 3. Das Konto ist gesperrt oder der Zugriff ist eingeschränkt. 4. Das verwendete Gerät und der Browser sind nicht mit QQ Space kompatibel.

Wenn wir Inhalte im QQ-Bereich veröffentlichen, können wir die Funktion des intelligenten Abgleichs nutzen. Einige Freunde sind damit nicht sehr vertraut. Hier finden Sie eine Einführung in die Bedienung. Öffnen Sie die Anwendung „QQ“ auf Ihrem Mobiltelefon, klicken Sie nach der Eingabe auf den persönlichen Avatar in der oberen linken Ecke der Seite und suchen Sie dann die Option „Einstellungen“ in der unteren linken Ecke der Popup-Menüseite und klicken Sie darauf. 2. Nachdem Sie die Einstellungsseite aufgerufen haben, klicken Sie zum Aufrufen auf „Datenschutz“. 3. Als nächstes gibt es eine „Berechtigungseinstellungen“ auf der Datenschutzseite. Wenn Sie diese sehen, klicken Sie darauf, um sie zu öffnen. 4. Klicken Sie zum Aufrufen auf der Seite mit den Berechtigungseinstellungen auf das Element „Space Dynamics“. 5. Nachdem Sie zur Seite mit den Raumeinstellungen gelangt sind, finden Sie unten „Weitere Einstellungen“. Klicken Sie darauf. 6. Klicken Sie auf der Seite mit den weiteren Einstellungen auf „Persönliche Space-Empfehlung“, um sie aufzurufen

Im Zeitalter der sozialen Netzwerke ist der Schutz der Privatsphäre besonders wichtig. Als soziale Plattform benötigt QQ Zone auch Datenschutzeinstellungen, um die privaten Daten der Benutzer zu schützen. Lassen Sie uns als Nächstes darüber sprechen, wie Sie QQ-Space-Berechtigungen einrichten, um Ihren Space sicherer und privater zu machen. So legen Sie Berechtigungen für den QQ-Bereich fest: 1. Öffnen Sie zunächst die QQ-Anwendung, klicken Sie auf [Avatar] in der oberen linken Ecke der Hauptseite. 2. Erweitern Sie dann den Bereich für persönliche Informationen auf der linken Seite und klicken Sie unten auf die Funktion [Einstellungen]. linke Ecke; 3. Rufen Sie die Einstellungsseite auf und blättern Sie, um die Option [Datenschutz] zu finden. 4. Wählen Sie als nächstes den Dienst [Berechtigungseinstellungen] aus. 6. Klicken Sie erneut auf [Weitere Einstellungen] auf der QQ Space-Einstellungsoberfläche. 7. Aktualisieren
