


Example of using curl to grab visitor information from QQ space_PHP tutorial
config.php
define('APP_DIR', dirname(__FILE__)) ;
define('COOKIE_FILE', APP_DIR . '/app.cookie.txt'); //Session record file
define('VISITOR_CAPTURE_INTERVAL', 3); //QQ collection interval
define(' VISITOR_DATA_UPLOAD_INTERVAL', '');
define('THIS_TIME', time());
define('REQUEST_TIMEOUT', 20); //The request times out for 20 seconds
define('END_LINE', "n");
define('DEBUG', true); //Enable debugging
$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 < $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*iframe\s*id\s*=\s*"login_frame"\s*name\s*=\s*"login_frame".*?src\s*=\s*"(.*?xui\.ptlogin2\.qq\.com.*?)".*?>\s*<\/iframe>.*?/', $content, $m);
if (count($m) > 1) {
return html_entity_decode($m[1]);
}
return null;
}
public static function checkLoginSuccess($content)
{
preg_match_all('/.*?\((.*)\).*?/', $content, $match);
if ($match[1][0]) {
$g = explode(',', $match[1][0]);
if (count($g) > 1) {
if (($g[count($g) - 2]) == "'登录成功!'") {
$url_parts = parse_url($g[2]);
parse_str($url_parts['query'], $arr);
if (array_key_exists('ptsig', $arr)) {
$ptsig = $arr['ptsig'];
} else {
$ptsig = null;
}
return array('status' => true, 'value' => array('url' => $g[2], 'ptsig' => $ptsig));
}
}
}
return array('status' => false);
}
public static function rightFrameVisitors($content)
{
$visitor_list = array();
$f = preg_replace('/\s*/', '', $content);
$f = preg_replace('/.*?_Callback\((\{.*?\})\).*?/', '$1', $f);
$f = json_decode($f, true);
if (is_array($f) && count($f) > 0 && array_key_exists('data', $f)
&& array_key_exists('module_3', $f['data'])
&& array_key_exists('data', $f['data']['module_3'])
&& array_key_exists('items', $f['data']['module_3']['data'])
) {
$visitors = $f['data']['module_3']['data']['items'];
foreach ($visitors as $visitor) {
if (!array_key_exists('loc', $visitor)) {
$visitor_list [] = array(
'uin' => $visitor['uin'], 'name' => $visitor['name'], 'online' => $visitor['online'], 'time' => $visitor['time'],
'img' => $visitor['img'], 'yellow' => $visitor['yellow'], 'supervip' => $visitor['supervip'],
);
}
}
}
return $visitor_list;
}
public static function getVisitors($content)
{
$f = preg_replace('/\s*/', '', $content);
preg_match('/^.*?(\{.*?\})\);\s*$/', $f, $m);
$visitor_list = array();
if (is_array($m) && count($m) > 1 && strlen($m[1]) > 0) {
$visitors = json_decode(trim($m[1]), true);
if (array_key_exists('data', $visitors) && array_key_exists('items', $visitors['data'])) {
foreach ($visitors['data']['items'] as $visitor) {
if ($visitor['name']) {
$_ = array(
'uin' => $visitor['uin'], 'name' => $visitor['name'], 'time' => $visitor['time'],
'yellow' => $visitor['yellow'], 'supervip' => $visitor['supervip'],
);
if (array_key_exists('portraitlabel', $visitor)) {
$_['portraitlabel'] = $visitor['portraitlabel'];
}
$visitor_list[] = $_;
if (array_key_exists('uins', $visitor)) {
foreach ($visitor['uins'] as $uins) {
$_ = array(
'uin' => $uins['uin'], 'name' => $uins['name'], 'time' => $uins['time'],
'yellow' => $uins['yellow'], 'supervip' => $uins['supervip'],
);
if (array_key_exists('portraitlabel', $uins)) {
$_['portraitlabel'] = $uins['portraitlabel'];
}
$visitor_list[] = $_;
}
}
}
}
}
}
return $visitor_list;
}
public static function checkVC($content)
{
preg_match_all('/.*?\((.*)\).*?/', $content, $match);
if (strlen($match[1][0]) > 1) {
$m = str_replace("'", '', $match[1][0]);
$g = explode(',', $m);
if (count($g) == 3) {
return array('saltUin' => $g[2], 'verifycode' => $g[1], 'RSAKey' => $g[2] ? false : true);
}
}
return array();
}
public static function getLoginInfo($content)
{
$s = preg_replace('/.*?pt\.ptui\s*=\s*\{(.*?)\}\s*;.*/s', '$1', $content);
$e = preg_split('/,\s*/', trim($s));
$info = array();
foreach ($e as $t) {
$t = trim($t);
$p = strpos($t, ':');
$key = trim(substr($t, 0, $p));
$value = trim(substr($t, $p + 1));
if (preg_match('/encodeURIComponent/', $value)) {
$value = preg_replace('/^encodeURIComponent\s*\(\s*"(.*)?"\s*\)\s*,?$/', '$1', $value);
} else {
$value = trim($value, '",');
}
if ($key) {
$info[$key] = urldecode($value);
}
}
return $info;
}
}
class QQVisitorCapture extends QQVisitorRequest
{
public function __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line)
{
parent:: __construct($user, $password, $cookie_file, $request_timeout, $debug, $end_line);
}
public function trace($content, $title)
{
if ($this->debug = true) {
Trace:: write($content, $this->end_line, $title);
}
}
public function error($message)
{
$this->trace($message, 'login error ');
return false;
}
public function success()
{
return true;
}
public function getGTKEncryption()
{
return Utils ::getGTK($this->getCookie('skey', true));
}
public function getCookies($refresh = false)
{
return $this->getAllCookies($refresh);
}
public function clearCookies($refresh = false)
{
return $this->clearAllCookies($refresh);
}
public function login()
{
$login_submit_info_url = null;
$login_submit_info_url = $this->visitQzone();
$this->setCookies(array(
'pgv_pvid' => array(
'value' => Utils::getUTCMilliseconds(), 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'
),
'pgv_info' => array(
'value' => 'ssid=s' . Utils::getUTCMilliseconds(), 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'
),
'_qz_referrer' => array(
'value' => 'qzone.qq.com', 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'
),
));
//log
$this->trace('', 'login begin');
//log
$this->trace($login_submit_info_url, '$login_submit_info_url===');
$login_submit_info = $this->getLoginSubmitInfo($login_submit_info_url);
//log
$this->trace($login_submit_info, '$login_submit_info===');
if (empty($login_submit_info)) {
$this->error('err-001');
}
$this->report();
//log
$this->trace('', 'getLoginJs');
$js_arr = $this->getLoginJs();
//log
$this->trace($js_arr, '$getLoginJs===');
if (empty($js_arr)) {
$this->error('err-002');
}
$u = $uin = $this->user;
$r = Utils::jsRandom();
$verifycode = null;
$pt_rsa = null;
$ptredirect = $login_submit_info['target'];
$h = $t = $g = $from_ui = 1;
$p = null;
$regmaster = $login_submit_info['regmaster'];
$u1 = Utils::decodeURIComponent($login_submit_info['s_url']);
$ptlang = $login_submit_info['lang'];
$action = strval(rand(5, 9)) . '-' . strval(strlen($this->user) + strlen($this->password) + rand(1, 5)) . '-' . Utils::loginJsTime();
$js_ver = $login_submit_info['ptui_version'];
$js_type = $js_arr['js_type'];
$login_sig = $login_submit_info['login_sig'];
$appid = $aid = $login_submit_info['appid'];
$pt_qzone_sig = $login_submit_info['pt_qzone_sig'];
$daid = $login_submit_info['daid'];
//log
$this->trace('', 'checkVC');
$check_data = $this->checkVC($regmaster, $appid, $js_ver, $js_type, $login_sig, $u1, $r);
if (count($check_data) !== 3) {
$this->error('err-003');
}
//log
$this->trace($check_data, '$check_data===');
//log
$this->trace(json_encode($check_data), '$check_data===');
$verifycode = $check_data['verifycode'];
if ($check_data['RSAKey']) {
$this->error('err-004');
} else {
$p = Utils::getEncryption($this->password, $check_data['saltUin'], $verifycode);
$pt_rsa = 0;
}
//log
$this->trace('', 'submitLogin');
$this->setCookies(array(
'ptui_loginuin' => array(
'value' => $this->user, 'path' => '/', 'domain' => '.qq.com', 'expires' => '0'
),
));
$login_result = $this->submitLogin($verifycode, $p,
$pt_rsa, $ptredirect, $u1,
$h, $t, $g, $from_ui,
$ptlang, $action, $js_ver, $js_type,
$login_sig, $aid, $daid, $pt_qzone_sig);
if ($login_result['status']) {
$this->trace('登录成功', 'submitLogin');
$this->trace($login_result, '$login_result====');
$this->loginSuccessRedirect($login_result['value']['url']);
$this->setCookies(array(
'fnc' => array(
'value' => 1, 'path' => '/', 'domain' => '.qzone.qq.com', 'expires' => '0'
),
));
$enterQzoneInfo = $this->enterQzone($login_result['value']['url'], $login_result['value']['ptsig']);
//log
$this->trace($enterQzoneInfo, '$enterQzoneInfo===');
if ($enterQzoneInfo) {
$this->trace('进入空间', 'enterQzone');
//$referer = $login_result['value']['url'];
//$scope = 0;
//log
$this->trace('', 'getCoreJs');
$coreJsInfo = $this->getCoreJs();
$this->trace($coreJsInfo, 'getCoreJs===');
$this->setCookies(array(
'qzone_referer' => array(
'value' => $login_result['value']['url'], 'path' => '/', 'domain' => '.local.cckf123456789.com', 'expires' => '0'
),
'qzone_visitor_param' => array(
'value' => implode('|', array_values($coreJsInfo['visitor'])), 'path' => '/', 'domain' => '.local.cckf123456789.com', 'expires' => '0'
),
));
//log
//$this->trace('', 'rightFrameVisitor');
//print_r($this->rightFrameVisitor($referer, implode('|', array_values($coreJsInfo['visitor']))));
return $this->success();
} else {
$this->error('err-006');
}
} else {
$this->error('err-005');
}
}
protected function visitQzone()
{
$options = array(
CURLOPT_TIMEOUT => $this->request_timeout,
CURLOPT_HEADER => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://qzone.qq.com',
CURLOPT_HTTPHEADER => array(
'Referer:http://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,
&

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

With the rapid development of the Bitcoin market, it is crucial to choose reliable trading software. This article will recommend the top ten Bitcoin trading software in 2025 to help you trade efficiently and safely. These software have been rigorously screened and consider factors such as functionality, security, user-friendliness and support levels. From beginner-friendly platforms to complex tools for experienced traders, you will find the best options for your trading needs in this list.

In PHP8, match expressions are a new control structure that returns different results based on the value of the expression. 1) It is similar to a switch statement, but returns a value instead of an execution statement block. 2) The match expression is strictly compared (===), which improves security. 3) It avoids possible break omissions in switch statements and enhances the simplicity and readability of the code.

Gateio Exchange app download channels for old versions, covering official, third-party application markets, forum communities and other channels. It also provides download precautions to help you easily obtain old versions and solve the problems of discomfort in using new versions or device compatibility.

This guide provides an overview of the essential software tools in the currency circle that helps users manage and trade crypto assets more efficiently. These software cover a wide range of categories from trading platforms to analytical tools and security solutions. The guide is designed to help users prepare for the upcoming crypto market in 2025.

In PHP, you can effectively prevent CSRF attacks by using unpredictable tokens. Specific methods include: 1. Generate and embed CSRF tokens in the form; 2. Verify the validity of the token when processing the request.
