321 lines
12 KiB
PHP
321 lines
12 KiB
PHP
|
|
<?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 活动 ID(COSTM_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"])?$_SESSION["gcu_country"]:$check_country;
|
|||
|
|
$this->v_ip = $this->getIp();
|
|||
|
|
$this->v_Browser = $this->getBrowser();
|
|||
|
|
//$this->v_country = $this->findCityByIp($this->v_ip);
|
|||
|
|
$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;
|
|||
|
|
|
|||
|
|
$_SESSION["gcu_country"] = $this->v_country;
|
|||
|
|
$_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";
|
|||
|
|
$this->v_country = isset($return['country']) ? $return['country'] : $this->v_country;
|
|||
|
|
$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)
|
|||
|
|
{
|
|||
|
|
$type = $type ? 1 : 0;
|
|||
|
|
static $ip = NULL;
|
|||
|
|
if ($ip !== NULL) return $ip[$type];
|
|||
|
|
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { // 使用cloudflare 转发的IP地址
|
|||
|
|
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
|
|||
|
|
} else {
|
|||
|
|
if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
|
|||
|
|
$ip = getenv('HTTP_CLIENT_IP');
|
|||
|
|
} elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
|
|||
|
|
$ip = getenv('HTTP_X_FORWARDED_FOR');
|
|||
|
|
} elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
|
|||
|
|
$ip = getenv('REMOTE_ADDR');
|
|||
|
|
} elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
|
|||
|
|
$ip = $_SERVER['REMOTE_ADDR'];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
|
|||
|
|
// $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
|
|||
|
|
// $pos = array_search('unknown',$arr);
|
|||
|
|
// if(false !== $pos) unset($arr[$pos]);
|
|||
|
|
// $ip = trim($arr[0]);
|
|||
|
|
// }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
|
|||
|
|
// $ip = $_SERVER['HTTP_CLIENT_IP'];
|
|||
|
|
// }elseif (isset($_SERVER['REMOTE_ADDR'])) {
|
|||
|
|
// $ip = $_SERVER['REMOTE_ADDR'];
|
|||
|
|
// }
|
|||
|
|
// IP地址合法验证
|
|||
|
|
//$long = sprintf("%u",ip2long($ip));
|
|||
|
|
//$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
|
|||
|
|
|
|||
|
|
return $ip;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//客户当前浏览的页面 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";
|
|||
|
|
}
|
|||
|
|
}
|