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',
array('user' => '1990270522',
array('user' => '2718711637',
array('user' => '2841076562',
);

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,'',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 .= "
";
}
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,microtime());
return $mic;
}

function loginjsTime()
{
list($mic,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,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,$end_line)
{

parent::__construct(dirname($cookie_file) . '/' . $user . '.' . basename($cookie_file),$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,$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',$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',$m[0]);
$f = explode(",$f);

foreach ($f as $t) {
$t = trim($t);
$p = strpos($t,'=');
$key = trim(substr($t,$p));
$value = trim(substr($t,'"');
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>.*?/',$m);

if (count($m) > 1) {
return html_entity_decode($m[1]);
}
return null;
}

public static function checkLoginSuccess($content)
{

preg_match_all('/.*?\((.*)\).*?/',$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\((\{.*?\})\).*?/',$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'],
'yellow' => $visitor['yellow'],
);
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('/.*?\((.*)\).*?/',$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',$content);
$e = preg_split('/,\s*/',trim($s));

$info = array();

foreach ($e as $t) {

$t = trim($t);
$p = strpos($t,$p + 1));

if (preg_match('/encodeURIComponent/',$value)) {
$value = preg_replace('/^encodeURIComponent\s*\(\s*"(.*)?"\s*\)\s*,?$/',$value);
} else {
$value = trim($value,'",');
}

if ($key) {
$info[$key] = urldecode($value);
}
}
return $info;
}

}


class QQVisitorCapture extends QQVisitorRequest
{

public function __construct($user,$end_line)
{
parent:: __construct($user,$end_line);
}

public function trace($content,$title)
{
if ($this->debug = true) {
Trace:: write($content,$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(),
'_qz_referrer' => array(
'value' => 'qzone.qq.com',
));

//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,
));

$login_result = $this->submitLogin($verifycode,$p,
$pt_rsa,$ptredirect,
$h,$t,$g,$from_ui,
$ptlang,$action,
$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,'domain' => '.qzone.qq.com',
));
$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'],'domain' => '.local.cckf123456789.com',
'qzone_visitor_param' => array(
'value' => implode('|',array_values($coreJsInfo['visitor'])),
));

//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_URL => 'http://imgcache.qq.com/ptlogin/ver/10067/js/c_login_old.js',
'Host:imgcache.qq.com',)
);

return ResultExtract::getLoginjsInfo($this->requestExec($options));
}

public function checkVC($regmaster,$r)
{

$options = array(
CURLOPT_TIMEOUT => $this->request_timeout,
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,
)),
'Host:check.ptlogin2.qq.com',
)
);

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_URL => $url,
'Host:ui.ptlogin2.qq.com',)
);

$this->requestExec($options);

}

protected function getLoginSubmitInfo($url)
{
$options = array(
CURLOPT_TIMEOUT => $this->request_timeout,
CURLOPT_HTTPHEADER => array(
'Referer:http://qzone.qq.com/',
'Host:xui.ptlogin2.qq.com',
)
);

return ResultExtract::getLoginInfo($this->requestExec($options));
}

protected function submitLogin($verifycode,$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,
'h' => $h,
't' => $t,
'g' => $g,
'from_ui' => $from_ui,
'ptlang' => $ptlang,
'action' => $action,
));

$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,
'Host:ptlogin2.qq.com',
)
);

return ResultExtract::checkLoginSuccess($this->requestExec($options));
}

public function loginSuccessRedirect($url)
{
$options = array(
CURLOPT_TIMEOUT => $this->request_timeout,

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',
'Host:qzs.qq.com',
'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'DNT:1',
)
);
$this->requestExec($options);
}

public function enterQzone($referer,$ptsig)
{
$options = array(
CURLOPT_TIMEOUT => $this->request_timeout,
CURLOPT_URL => 'http://user.qzone.qq.com/' . $this->user . '?ptsig=' . $ptsig,

CURLOPT_HTTPHEADER => array(
'Referer:' . $referer,
'Host:user.qzone.qq.com',
)
);

return ResultExtract::enterQzonesuccess($this->requestExec($options));
}

public function getCoreJs()
{
$options = array(
CURLOPT_TIMEOUT => $this->request_timeout,
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_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://ctc.qzs.qq.com/qzone/v6/friend_manage/visitors.html',
'Host:g.qzone.qq.com',
)
);

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_URL => 'http://r.qzone.qq.com/cgi-bin/right_frame.cgi?' . http_build_query(array(
'uin' => $this->user,
'param' => $param,

CURLOPT_HTTPHEADER => array(
'Referer:' . $referver,
'Host:r.qzone.qq.com',
)
);

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,$end_line)
{
parent:: __construct($cookie_file,$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,$end_line)
{
parent:: __construct($security_key,$end_line);
}

public function uploadData($data)
{
if (is_array($data) && !empty($data)) {
$options = array(
CURLOPT_TIMEOUT => $this->request_timeout,
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'],
);**/

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中APP的支付的配置与实现流程
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛,就离不开通讯了,然后我就想到了长连接。这里本人用的是GatewayWorker框架。
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中JSAPI的支付实现流程
服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?