这篇文章主要介绍了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

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 .= "
";

}

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*.*?/', $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;

}

}

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php 采集qq空间,php使用curl抓取qq空间的访客信息示例_php技巧相关推荐

  1. php爬取qq好友,使用php批量抓取QQ空间相册链接

    前言 小杰之前发布的文章<为什么QQ空间与我们渐行渐远?> 里面就提到小杰会抽空备份QQ空间的照片,但是在网上找了很久也没有找到一个有效的工具 作为一个Phper,淦就完事了,所以顶着寒冷 ...

  2. Python爬虫编程思想(103):项目实战--抓取QQ空间说说的内容

    本例使用Selenium完成一个综合项目,该项目可以QQ空间说说的内容.首先需要分析一下QQ空间说说的HTML代码. 由于进入QQ空间需要登录,所以抓取QQ空间说说的内容需要如下2步: 模拟登录 抓取 ...

  3. PHP使用CURL抓取网页

    CURL是一个非常强大的开源库,支持很多协议,包括HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS ...

  4. php curl 下载网页,php 通过cURL函数抓取网页、下载网页的简单示例

    这篇文章主要为大家详细介绍了php 通过cURL函数抓取网页.下载网页的简单示例,具有一定的参考价值,可以用来参考一下. php通过cURL函数抓取和下载网页,感兴趣的小伙伴,下面一起跟随512笔记的 ...

  5. curl抓取页面时遇到重定向的解决方法(转)

    用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下: [php] view plaincopy <?php function curlGet($url) { $ch = curl_ ...

  6. Python爬虫如何去抓取qq音乐的歌手数据?

    自从学会爬虫之后是不是有一种我什么都想爬一下的冲动?今天小千就来教大家如何去抓取qq音乐的歌手数据,项目实操多练习能更快提升自己哦. 今天的项目目标就是获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的 ...

  7. 如何控制Yahoo! Slurp蜘蛛的抓取频度_国外博客资源站_百度空间

    如何控制Yahoo! Slurp蜘蛛的抓取频度_国外博客资源站_百度空间 如何控制Yahoo! Slurp蜘蛛的抓取频度 2009年08月13日 星期四 5:56 上周末豆瓣的阿北给我电话:最近你们雅 ...

  8. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  9. 手把手教你使用Python抓取QQ音乐数据!

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

最新文章

  1. 使用Memory Analyzer tool(MAT)分析内存泄漏(一)
  2. WIN32开发:如何获取父进程的ID
  3. 北斗导航 | 卫星导航在动态监测中的应用(RTK)
  4. 无人机飞控开发平台培训理论课程——飞行原理
  5. 错误: 没有forecast.Arima这个函数
  6. linux shell之字符串的更具字符分割和删除字符和文本内容的删除以及内容是否匹配成功
  7. drools6.5_Drools 6.4.0.Final提供
  8. linux查看录音驱动程序,Linux 下查看麦克风或音频采集设备
  9. [转载]每天早晨含姜片含出三大奇迹/姜的二十种食疗功/生姜克
  10. linux进入bios设置超线程,从BIOS开启超线程的方法
  11. matlab 绘制三维实体,matlab 三维绘制
  12. 【金融财经】金融市场一周简报(2017-09-08)
  13. ASEMI双向可控硅BTA12A,BTA12A特征,BTA12A主要用途
  14. 土味情话恋爱话术微信小程序源码下载
  15. Chatty登录测试
  16. 使用 arp-scan 快速扫描局域网 IP -> raspberry pi ssh vnc
  17. Component属性
  18. html 保存 mysql file_前端HTML5几种存储方式的总结
  19. bootloader 和 启动模式的一些理解
  20. html嵌入bilibili视频

热门文章

  1. 公牛集团年营收123亿:阮立平兄弟获12亿分红 高瓴大幅减持
  2. 用计算机解决问题的例子,电脑故障经典案例与解决方法20个
  3. 首席新媒体运营商学院黎想:4步搭建一套活动运营推广框架
  4. geant4构造粒子_Geant4基础知识
  5. dart ?符号 问号符 后置问号 问号后置 flutter
  6. 测序比对软件的总结----bowtie2
  7. 【STM32开发环境】Linux下开发stm32(二) | 使用openocd下载程序
  8. 重罚超8亿!范冰冰“阴阳合同”逃税案终于水落石出!
  9. java 工具类-去除字符串中特殊字符、全角转为半脚、获取字符串中姓名/电话、姓名重复后追加a.b.c...aa,ab..
  10. DotNetty 学习