Files
CLOAK/lib/Cloak/VisitorInfo.php
T

297 lines
11 KiB
PHP
Raw Normal View History

2026-06-14 14:00:24 +08:00
<?php
require_once dirname(__DIR__) . '/Cloak/ReasonHelper.php';
/**
* 访客上下文与 API 判定(类名保留历史拼写 visitorInfo
*/
class visitorInfo
{
/** @var string */
public $v_ip;
public $v_Browser;
public $v_country;
public $v_referer;
public $v_Client;
public $v_curPageURL;
public $v_site_server;
public $accept_language;
public $visit_md5_code;
public $costm_ip_score;
public $check_key;
public $check_country;
public $check_result;
public $v_reason;
/**
* 从请求/Session 填充访客字段
*
* @param string $costm_ip_score 活动 IDCOSTM_IP_SCORE
* @param string $check_key API 密钥
* @param string $check_country 国家过滤配置
* @return void
*/
public function get_visitor_Info($costm_ip_score = '', $check_key = '', $check_country = '')
{
$this->v_country = !empty($_SESSION['gcu_country']) ? (string) $_SESSION['gcu_country'] : '';
2026-06-14 14:00:24 +08:00
$this->v_ip = $this->getIp();
$this->v_Browser = $this->getBrowser();
$this->v_referer = $this->getFromPage();
$this->v_Client = $this->v_isMobile();
$this->v_curPageURL = $this->curPageURL();
$this->v_site_server = $this->get_site_server();
$this->accept_language = $this->get_accept_language();
$this->costm_ip_score = $costm_ip_score;
$this->check_key = $check_key;
$this->check_country = $check_country;
if ($this->v_country !== '') {
$_SESSION['gcu_country'] = $this->v_country;
}
2026-06-14 14:00:24 +08:00
$_SESSION["gcu_Client"] = $this->v_Client;
$_SESSION["gcu_ip"] = $this->v_ip;
$_SESSION["gcu_Browser"] = $this->v_Browser;
}
/**
* 调用远程 cloak API 判定
*
* @return array|null API 解码结果;前置条件不足时 null
*/
public function send_visitor_Info_xyz()
{
if(!empty($_REQUEST["send"])&& $_REQUEST["send"] ==1)
{
print_r($jsonData); exit();
}
if(!empty($this->v_ip))
{
$return = $this -> cloak_check_curl();
if (!is_array($return)) {
$return = ['result' => false, 'reason' => 'API响应异常', 'country' => $this->v_country];
}
$this->check_result = !empty($return['result']) ? "true" : "false";
if ($this->v_country === '' && !empty($return['country'])) {
$this->v_country = (string) $return['country'];
}
2026-06-14 14:00:24 +08:00
$this->v_reason = cloak_api_reason($return, $this->check_result);
return $return;
}
return null;
}
function cloak_check_curl()
{
$headers = browser_headers();
// $visit_domain = str_replace('www.', '', $_SERVER['HTTP_HOST']); // 当前网站域名
// $visit_domain = (is_https() ? "https://" : "http://"). $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$jsonData['id'] = $this->costm_ip_score;
$jsonData['ip'] = $this->v_ip;
$jsonData['domain'] = $this->v_curPageURL;
$jsonData['country_code'] = $this->check_country; //设置该参数后,将替换"广告策略》访问者地理位置>过滤"的设置,填写国家代码,多个用逗号分隔,如:US,GB,CA,AU,IE,NZ
$jsonData['referer'] = get_SERVER_value('HTTP_REFERER');
$jsonData['headers'] = json_encode($headers);
$ch = curl_init('www.tiktokba.com/cloak/byApi');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_USERAGENT, get_SERVER_value('HTTP_USER_AGENT'));
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_ENCODING, ""); //Enables compression
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-type: application/json"]);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["escloak-key: {$this->check_key}"]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($jsonData));
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "forward_response_cookies"); //Forward response's cookies to visitor
if ($_COOKIE) {//Forward visitor's cookie to our server
curl_setopt($ch, CURLOPT_COOKIE, encode_visitor_cookies());
}
$return = curl_exec($ch);
if ($return == false) {
$curl_error = curl_error($ch);
curl_close($ch);
return ['result' => false, 'reason' => 'API请求失败:' . $curl_error, 'country' => ''];
}
curl_close($ch);
$decoded = json_decode($return, true);
if (!is_array($decoded)) {
return ['result' => false, 'reason' => 'API响应失败,请检查API密钥以及广告策略 ID', 'country' => ''];
}
return $decoded;
}
// api.ttt.sh API查询国家代码
public function get_ip_country($client_ip)
{
$str = "";
//$url = "https://api.ttt.sh/ip/qqwry/".$client_ip."?type=addr";
//$str = file_get_contents($url);
return $str;
}
public function set_visit_md5_code($code)
{
$this->visit_md5_code = $code;
}
public function get_visit_md5_code()
{
$domain = str_replace("www.","",$_SERVER['HTTP_HOST']);
$time = date("YmdHis");
$ip = $this->getIp();
$this->visit_md5_code = substr(md5($domain.$time.$ip) , 0 , 12 );
return $this->visit_md5_code;
}
//获取访客ip
public function getIp($type = 0)
{
if ($type) {
return ClientIpResolver::resolve();
2026-06-14 14:00:24 +08:00
}
return ClientIpResolver::resolve();
2026-06-14 14:00:24 +08:00
}
//客户当前浏览的页面 url(浏览器实际访问地址,含正确 scheme 与 query
function curPageURL()
{
return cloak_current_request_url();
}
//根据ip获取城市、网络运营商等信息
public function findCityByIp($ip){
$country_res = @file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);
$country_json = json_decode($country_res,true);
// Array ( [code] => 0 [data] => Array ( [ip] => 104.223.98.4 [country] => 美国 [area] => [region] => 德克萨斯 [city] => 达拉斯 [county] => XX [isp] => XX [country_id] => US [area_id] => [region_id] => US_143 [city_id] => US_1099 [county_id] => xx [isp_id] => xx ) )
$country = $country_json["data"]["country"];
return $country;
}
//site_server
function get_site_server()
{
$dqml=getcwd();
$dpml_ary = explode(DIRECTORY_SEPARATOR, $dqml);
$dqml_str = $dpml_ary[2];
$dqml_str = substr($dqml_str,0,4);
return $dqml_str;
}
//字符串截取函数
function ip_p_substr($p_bof,$p_eof,$p_str)
{
$p_1=explode($p_bof,$p_str);
$p_e=strpos($p_1[1],$p_eof);
$p_0=substr($p_1[1],0,$p_e);
return $p_0;
}
//获取用户浏览器类型
public function getBrowser(){
$agent=$_SERVER["HTTP_USER_AGENT"];
if(strpos($agent,'MSIE')!==false || strpos($agent,'rv:11.0')) //ie11判断
return "ie";
else if(strpos($agent,'Firefox')!==false)
return "firefox";
else if(strpos($agent,'Chrome')!==false)
return "chrome";
else if(strpos($agent,'Opera')!==false)
return 'opera';
else if((strpos($agent,'Chrome')==false)&&strpos($agent,'Safari')!==false)
return 'safari';
else
return 'unknown';
}
//获取网站来源
public function getFromPage(){
if(empty($_SERVER['HTTP_REFERER'])) {
return NULL;
}
else
return $_SERVER['HTTP_REFERER'];
}
function get_accept_language()
{
$lang = "";
if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) )
{
$accept_language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4); //只取前4位,这样只判断最优先的语言。如果取前5位,可能出现en,zh的情况,影响判断。
if (preg_match("/zh-c/i", $accept_language))
$lang = "Chinese";
else if (preg_match("/zh/i", $accept_language))
$lang = "Chinese_Trad";
else if (preg_match("/en/i", $accept_language))
$lang = "English";
else if (preg_match("/fr/i", $accept_language))
$lang = "French";
else if (preg_match("/de/i", $accept_language))
$lang = "German";
else if (preg_match("/jp/i", $accept_language))
$lang = "Japanese";
else if (preg_match("/ko/i", $accept_language))
$lang = "Korean";
else if (preg_match("/es/i", $accept_language))
$lang = "Spanish";
else if (preg_match("/sv/i", $accept_language))
$lang = "Swedish";
else $lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
}
return $lang;
}
/*移动端判断*/
function v_isMobile()
{
// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
{
return true;
}
// 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
if (isset ($_SERVER['HTTP_VIA']))
{
// 找不到为flase,否则为true
return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
}
// 脑残法,判断手机发送的客户端标志,兼容性有待提高
if (isset ($_SERVER['HTTP_USER_AGENT']))
{
$clientkeywords = array ('nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile'
);
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT'])))
{
return "Mobile";
}
}
// 协议法,因为有可能不准确,放到最后判断
if (isset ($_SERVER['HTTP_ACCEPT']))
{
// 如果只支持wml并且不支持html那一定是移动设备
// 如果支持wml和html但是wml在html之前则是移动设备
if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))
{
return "Mobile";
}
}
return "PC";
}
}