php使用curl抓取qq空间的访客信息示例_PHP教程
config.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
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 $str .= "\n";
}
return $str;
}
public static function br($num = 1)
{
$str = '';
for ($i = 0; $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) $n += ord($c[1]) & 0x3f;
return $n;
case 3:
$n = (ord($c[0]) & 0x1f) $n += (ord($c[1]) & 0x3f) $n += ord($c[2]) & 0x3f;
return $n;
case 4:
$n = (ord($c[0]) & 0x0f) $n += (ord($c[1]) & 0x3f) $n += (ord($c[2]) & 0x3f) $n += ord($c[3]) & 0x3f;
return $n;
}
}
public static function getGTK($str)
{
$hash = 5381;
for ($i = 0, $len = strlen($str); $i $hash += ($hash }
return $hash & 2147483647;
}
protected static function hexchar2bin($str)
{
$arr = '';
$temp = null;
for ($i = 0; $i $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://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,
&

Alat AI Hot

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

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

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

Dengan perkembangan pesat pasaran Bitcoin, adalah penting untuk memilih perisian perdagangan yang boleh dipercayai. Artikel ini akan mencadangkan perisian Perdagangan Sepuluh Bitcoin teratas pada tahun 2025 untuk membantu anda berdagang dengan cekap dan selamat. Perisian ini telah ditayangkan dengan ketat dan mempertimbangkan faktor-faktor seperti fungsi, keselamatan, keramahan pengguna dan tahap sokongan. Dari platform mesra pemula ke alat yang kompleks untuk peniaga yang berpengalaman, anda akan mendapati pilihan terbaik untuk keperluan perdagangan anda dalam senarai ini.

Dalam Php8, ungkapan perlawanan adalah struktur kawalan baru yang mengembalikan hasil yang berbeza berdasarkan nilai ungkapan. 1) Ia sama dengan pernyataan suis, tetapi mengembalikan nilai dan bukannya blok pernyataan pelaksanaan. 2) Ekspresi perlawanan secara ketat (===), yang meningkatkan keselamatan. 3) Ia mengelakkan kemungkinan ketinggalan dalam penyataan suis dan meningkatkan kesederhanaan dan kebolehbacaan kod.

Saluran muat turun aplikasi gerbang untuk versi lama, meliputi pasaran aplikasi rasmi, pihak ketiga, komuniti forum dan saluran lain.

Panduan ini memberikan gambaran keseluruhan alat perisian penting dalam bulatan mata wang yang membantu pengguna mengurus dan berdagang aset crypto dengan lebih cekap. Perisian ini meliputi pelbagai kategori dari platform perdagangan ke alat analisis dan penyelesaian keselamatan. Panduan ini direka untuk membantu pengguna mempersiapkan pasaran Crypto yang akan datang pada tahun 2025.

Dalam PHP, anda boleh mencegah serangan CSRF dengan menggunakan token yang tidak dapat diramalkan. Kaedah khusus termasuk: 1. Menjana dan membenamkan token CSRF dalam bentuk; 2. Sahkan kesahihan token semasa memproses permintaan.
