跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

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

config.

php复制代码代码如下:php
'2064556526', 'password' => '909124124951'),array('user' => '483258700', 'password' => '909124124951'),array('user' => '1990270522', 'password' => '909124124951'),array('user' => '2718711637', 'password' => '909124124951'),array('user' => '2841076562', 'password' => '909124124951'),);qy.visitor.php复制代码代码如下:php
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

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'] . " " . "TRUE" . " " . $cookie['path'] . " " . "FALSE" . " " . $cookie['expires'] . " " . $k . " " . $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("", array_merge($new_line, $this->buildCookieStr($cookies))));}}protected function __getAllCookies($refresh = false){if ($refresh) {$this->cookie_list = $this->extractFile();}return $this->cookie_list;}protected function __getCookie($cookie_name, $refresh = false){$cookie_list = $this->__getAllCookies($refresh);if (is_array($cookie_list) && array_key_exists($cookie_name, $cookie_list)) {return $cookie_list[$cookie_name];} else {return null;}}protected function __clearAllCookies(){$this->cookie_list = null;@unlink($this->cookie_file);}}class BaseRequest extends CookieFileExtract{protected $curl_instance;protected $request_timeout;protected $debug;protected $end_line;protected $user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:26.0) Gecko/20100101 Firefox/26.0';protected function __construct($cookie_file, $request_timeout, $debug, $end_line){parent::__construct($cookie_file);$this->request_timeout = $request_timeout;$this->debug = $debug;$this->end_line = $end_line;$this->initInstance();}protected function initInstance(){$this->curl_instance = curl_init();if ($this->isValidateCookieFile()) {curl_setopt($this->curl_instance, CURLOPT_COOKIEJAR, $this->cookie_file);curl_setopt($this->curl_instance, CURLOPT_COOKIEFILE, $this->cookie_file);}curl_setopt($this->curl_instance, CURLOPT_TIMEOUT, $this->request_timeout);curl_setopt($this->curl_instance, CURLOPT_RETURNTRANSFER, 1);curl_setopt($this->curl_instance, CURLOPT_HEADER, 1);curl_setopt($this->curl_instance, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($this->curl_instance, CURLOPT_SSL_VERIFYHOST, 0);curl_exec($this->curl_instance);}function setCookies($cookies){$this->closeInstance();$this->__setCookies($cookies);$this->initInstance();}protected function getAllCookies($refresh = false){$this->closeInstance();$cookies = $this->__getAllCookies($refresh);$this->initInstance();return $cookies;}protected function clearAllCookies($refresh = false){$this->closeInstance();$this->__clearAllCookies();if ($refresh) {$this->initInstance();}}protected function getCookie($name, $refresh = false){$this->closeInstance();$cookie = $this->__getCookie($name, $refresh);$this->initInstance();return $cookie;}protected function getRequestInstance(){return $this->curl_instance;}protected function closeInstance(){if (is_resource($this->curl_instance)) {curl_close($this->curl_instance);}}protected function resetInstance(){$this->closeInstance();@unlink($this->cookie_file);$this->initInstance();}protected function requestExec($option){curl_setopt_array($this->getRequestInstance(), $option);//if ($this->debug) {//    $result = curl_exec($this->getRequestInstance());//    Trace::write($result, $this->end_line, 'request output');//} else {return curl_exec($this->getRequestInstance());//}}}class QQVisitorRequest extends BaseRequest{protected $user;protected $password;protected function __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line){parent::__construct(dirname($cookie_file) . '/' . $user . '.' . basename($cookie_file), $request_timeout, $debug, $end_line);$this->user = $user;$this->password = $password;}}class ResultExtract{public static function  getCoreJsInfo($content, $user){$arr = array();preg_match('/cfgs*=s*{(.*?)s*}s*,s*URL_PARAM_HASH/s', $content, $m);if (count($m) > 0) {$f = preg_replace('/s*/', '', $m[1]);$f = preg_replace('/"+g_iLoginUin+"/', $user, $f);$f = preg_replace('/$j.cookie.get("hotfeeds_closed")==1?"":/', '', $f);$f = explode(",", $f);if (count($f) > 0) {foreach ($f as $t) {$t = trim($t);$p = strpos($t, ':');$key = trim(substr($t, 0, $p), '"');$value = trim(substr($t, $p + 1), '"');if ($key) {$arr[$key] = $value;}}if (count($arr) > 0) {$arr['visitor'] = $arr;}}}return $arr;}public static function  enterQzoneSuccess($content){$arr = array();$arr2 = array();preg_match('/g_Datas*=s*{s*feedsPart1s*:s*(.*?)s*,s*feedsPart2/s', $content, $m);if (count($m) > 0) {$f = preg_replace('/s*/', '', $m[1]);$f = preg_replace('/([{,])([^,]*?)(:)/', '$1"$2"$3', $f);$f = preg_replace('/:'(.*?)'([,}])/', ':"$1"$2', $f);$arr = json_decode($f, true);$arr = $arr['main'];}preg_match('/g_type.*?g_IZone_Flag/s', $content, $m);if (count($m) > 0) {$f = preg_replace('/s*/', '', $m[0]);$f = explode(",", $f);foreach ($f as $t) {$t = trim($t);$p = strpos($t, '=');$key = trim(substr($t, 0, $p));$value = trim(substr($t, $p + 1), '"');if ($key) {$arr2[$key] = $value;}}}return array_merge($arr, $arr2);}public static function getLoginJsInfo($content){PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。

下载$s = preg_replace('/.*?pt.plogins*=s*{(.*?)aqScanLink.*/s', '$1', $content);preg_match('/.*js_types*:s*(d+)s*,.*/', $s, $m);if (count($m) > 1) {return array('js_type' => $m[1]);}return array();}public static function getLoginAddress($content){preg_match('/.*?qq.com.*?)".*?>s*.*?/', $content, $m);if (count($m) > 1) {return html_entity_decode($m[1]);}return null;}public static function checkLoginSuccess($content){preg_match_all('/.*?((.*)).*?/', $content, $match);if ($match[1][0]) {$g = explode(',', $match[1][0]);if (count($g) > 1) {if (($g[count($g) - 2]) == "'登录成功!'") {$url_parts = parse_url($g[2]);parse_str($url_parts['query'], $arr);if (array_key_exists('ptsig', $arr)) {$ptsig = $arr['ptsig'];} else {$ptsig = null;}return array('status' => true, 'value' => array('url' => $g[2], 'ptsig' => $ptsig));}}}return array('status' => false);}public static function rightFrameVisitors($content){$visitor_list = array();$f = preg_replace('/s*/', '', $content);$f = preg_replace('/.*?_Callback(({.*?})).*?/', '$1', $f);$f = json_decode($f, true);if (is_array($f) && count($f) > 0 && array_key_exists('data', $f)&& array_key_exists('module_3', $f['data'])&& array_key_exists('data', $f['data']['module_3'])&& array_key_exists('items', $f['data']['module_3']['data'])) {$visitors = $f['data']['module_3']['data']['items'];foreach ($visitors as $visitor) {if (!array_key_exists('loc', $visitor)) {$visitor_list [] = array('uin' => $visitor['uin'], 'name' => $visitor['name'], 'online' => $visitor['online'], 'time' => $visitor['time'],'img' => $visitor['img'], 'yellow' => $visitor['yellow'], 'supervip' => $visitor['supervip'],);}}}return $visitor_list;}public static function getVisitors($content){$f = preg_replace('/s*/', '', $content);preg_match('/^.*?({.*?}));s*$/', $f, $m);$visitor_list = array();if (is_array($m) && count($m) > 1 && strlen($m[1]) > 0) {$visitors = json_decode(trim($m[1]), true);if (array_key_exists('data', $visitors) && array_key_exists('items', $visitors['data'])) {foreach ($visitors['data']['items'] as $visitor) {if ($visitor['name']) {$_ = array('uin' => $visitor['uin'], 'name' => $visitor['name'], 'time' => $visitor['time'],'yellow' => $visitor['yellow'], 'supervip' => $visitor['supervip'],);if (array_key_exists('portraitlabel', $visitor)) {$_['portraitlabel'] = $visitor['portraitlabel'];}$visitor_list[] = $_;if (array_key_exists('uins', $visitor)) {foreach ($visitor['uins'] as $uins) {$_ = array('uin' => $uins['uin'], 'name' => $uins['name'], 'time' => $uins['time'],'yellow' => $uins['yellow'], 'supervip' => $uins['supervip'],);if (array_key_exists('portraitlabel', $uins)) {$_['portraitlabel'] = $uins['portraitlabel'];}$visitor_list[] = $_;}}}}}}return $visitor_list;}public static function  checkVC($content){preg_match_all('/.*?((.*)).*?/', $content, $match);if (strlen($match[1][0]) > 1) {$m = str_replace("'", '', $match[1][0]);$g = explode(',', $m);if (count($g) == 3) {return array('saltUin' => $g[2], 'verifycode' => $g[1], 'RSAKey' => $g[2] ? false : true);}}return array();}public static function getLoginInfo($content){$s = preg_replace('/.*?pt.ptuis*=s*{(.*?)}s*;.*/s', '$1', $content);$e = preg_split('/,s*/', trim($s));$info = array();foreach ($e as $t) {$t = trim($t);$p = strpos($t, ':');$key = trim(substr($t, 0, $p));$value = trim(substr($t, $p + 1));if (preg_match('/encodeURIComponent/', $value)) {$value = preg_replace('/^encodeURIComponents*(s*"(.*)?"s*)s*,?$/', '$1', $value);} else {$value = trim($value, '",');}if ($key) {$info[$key] = urldecode($value);}}return $info;}}class QQVisitorCapture extends QQVisitorRequest{public function __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line){parent:: __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line);}public function trace($content, $title){if ($this->debug = true) {Trace:: write($content, $this->end_line, $title);}}public function error($message){$this->trace($message, 'login error ');return false;}public function success(){return true;}public function getGTKEncryption(){return Utils ::getGTK($this->getCookie('skey', true));}public function getCookies($refresh = false){return $this->getAllCookies($refresh);}public function clearCookies($refresh = false){return $this->clearAllCookies($refresh);}public function login(){$login_submit_info_url = null;$login_submit_info_url = $this->visitQzone();$this->setCookies(array('pgv_pvid' => array('value' => Utils::getUTCMilliseconds(), 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'),'pgv_info' => array('value' => 'ssid=s' . Utils::getUTCMilliseconds(), 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'),'_qz_referrer' => array('value' => 'qzone.qq.com', 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'),));//log$this->trace('', 'login begin');//log$this->trace($login_submit_info_url, '$login_submit_info_url===');$login_submit_info = $this->getLoginSubmitInfo($login_submit_info_url);//log$this->trace($login_submit_info, '$login_submit_info===');if (empty($login_submit_info)) {$this->error('err-001');}$this->report();//log$this->trace('', 'getLoginJs');$js_arr = $this->getLoginJs();//log$this->trace($js_arr, '$getLoginJs===');if (empty($js_arr)) {$this->error('err-002');}$u = $uin = $this->user;$r = Utils::jsRandom();$verifycode = null;$pt_rsa = null;$ptredirect = $login_submit_info['target'];$h = $t = $g = $from_ui = 1;$p = null;$regmaster = $login_submit_info['regmaster'];$u1 = Utils::decodeURIComponent($login_submit_info['s_url']);$ptlang = $login_submit_info['lang'];$action = strval(rand(5, 9)) . '-' . strval(strlen($this->user) + strlen($this->password) + rand(1, 5)) . '-' . Utils::loginJsTime();$js_ver = $login_submit_info['ptui_version'];$js_type = $js_arr['js_type'];$login_sig = $login_submit_info['login_sig'];$appid = $aid = $login_submit_info['appid'];$pt_qzone_sig = $login_submit_info['pt_qzone_sig'];$daid = $login_submit_info['daid'];//log$this->trace('', 'checkVC');$check_data = $this->checkVC($regmaster, $appid, $js_ver, $js_type, $login_sig, $u1, $r);if (count($check_data) !== 3) {$this->error('err-003');}//log$this->trace($check_data, '$check_data===');//log$this->trace(json_encode($check_data), '$check_data===');$verifycode = $check_data['verifycode'];if ($check_data['RSAKey']) {$this->error('err-004');} else {$p = Utils::getEncryption($this->password, $check_data['saltUin'], $verifycode);$pt_rsa = 0;}//log$this->trace('', 'submitLogin');$this->setCookies(array('ptui_loginuin' => array('value' => $this->user, 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'),));$login_result = $this->submitLogin($verifycode, $p,$pt_rsa, $ptredirect, $u1,$h, $t, $g, $from_ui,$ptlang, $action, $js_ver, $js_type,$login_sig, $aid, $daid, $pt_qzone_sig);if ($login_result['status']) {$this->trace('登录成功', 'submitLogin');$this->trace($login_result, '$login_result====');$this->loginSuccessRedirect($login_result['value']['url']);$this->setCookies(array('fnc' => array('value' => 1, 'path' => '/', 'domain' => '.qzone.qq.com', 'expires' => '0'),));$enterQzoneInfo = $this->enterQzone($login_result['value']['url'], $login_result['value']['ptsig']);//log$this->trace($enterQzoneInfo, '$enterQzoneInfo===');if ($enterQzoneInfo) {$this->trace('进入空间', 'enterQzone');//$referer = $login_result['value']['url'];//$scope = 0;//log$this->trace('', 'getCoreJs');$coreJsInfo = $this->getCoreJs();$this->trace($coreJsInfo, 'getCoreJs===');$this->setCookies(array('qzone_referer' => array('value' => $login_result['value']['url'], 'path' => '/', 'domain' => '.local.cckf123456789.com', 'expires' => '0'),'qzone_visitor_param' => array('value' => implode('|', array_values($coreJsInfo['visitor'])), 'path' => '/', 'domain' => '.local.cckf123456789.com', 'expires' => '0'),));//log//$this->trace('', 'rightFrameVisitor');//print_r($this->rightFrameVisitor($referer, implode('|', array_values($coreJsInfo['visitor']))));return $this->success();} else {$this->error('err-006');}} else {$this->error('err-005');}}protected function visitQzone(){$options = array(CURLOPT_TIMEOUT => $this->request_timeout,CURLOPT_HEADER => 1,CURLOPT_RETURNTRANSFER => 1,CURLOPT_URL => 'http://qzone.qq.com',CURLOPT_HTTPHEADER => array('Referer:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A//qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html','User-Agent:' . $this->user_agent,'Host:qzone.qq.com','Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3','Connection:keep-alive',));return ResultExtract::getLoginAddress($this->requestExec($options));}protected function getLoginJs(){$options = array(CURLOPT_TIMEOUT => $this->request_timeout,CURLOPT_HEADER => 1,CURLOPT_RETURNTRANSFER => 1,CURLOPT_URL => 'http://imgcache.qq.com/ptlogin/ver/10067/js/c_login_old.js',CURLOPT_HTTPHEADER => array('Referer:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A//qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html','User-Agent:' . $this->user_agent,'Host:imgcache.qq.com','Connection:keep-alive',));return ResultExtract::getLoginJsInfo($this->requestExec($options));}public function checkVC($regmaster, $appid, $js_ver, $js_type, $login_sig, $u1, $r){$options = array(CURLOPT_TIMEOUT => $this->request_timeout,CURLOPT_HEADER => 1,CURLOPT_RETURNTRANSFER => 1,CURLOPT_URL => 'http://check.ptlogin2.qq.com/check?' . http_build_query(array('regmaster' => $regmaster,'uin' => $this->user,'appid' => $appid,'js_ver' => $js_ver,'js_type' => $js_type,'login_sig' => $login_sig,'u1' => $u1,'r' => $r,)),CURLOPT_HTTPHEADER => array('Referer:http://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=http%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&pt_qzone_sig=1&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=http%3A//qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=http%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html','User-Agent:' . $this->user_agent,'Host:check.ptlogin2.qq.com','Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3','Connection:keep-alive',));return ResultExtract::checkVC($this->requestExec($options));}protected function report(){$url = 'http://ui.ptlogin2.qq.com/cgi-bin/report?id=358342&t=' . Utils::jsRandom();$options = array(CURLOPT_TIMEOUT => $this->request_timeout,CURLOPT_HEADER => 1,CURLOPT_RETURNTRANSFER => 1, 

相关文章