You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
4.6 KiB
159 lines
4.6 KiB
<?php |
|
/** |
|
* GoogleAnalytics Plugin |
|
* |
|
* @copyright Copyright (c) 2018 WeiCN (https://cuojue.org) |
|
* @license GNU General Public License 3.0 |
|
* |
|
*/ |
|
class GoogleAnalytics_Action extends Typecho_Widget implements Widget_Interface_Do |
|
{ |
|
|
|
/** @var bool 请求适配器 */ |
|
private static $_adapter = false; |
|
|
|
public function __construct($request, $response, $params = NULL) |
|
{ |
|
parent::__construct($request, $response, $params); |
|
} |
|
/** |
|
* 添加新的链接转换 |
|
* |
|
*/ |
|
public function ga(){ |
|
|
|
//拦截参数不完整 |
|
if(empty($this->request->getReferer()) || |
|
empty($this->request->getAgent()) || |
|
empty($this->request->get('ga')) || |
|
empty($this->request->get('dt')) || |
|
empty($this->request->get('ul')) || |
|
empty($this->request->get('sd')) || |
|
empty($this->request->get('sr')) || |
|
empty($this->request->get('vp')) || |
|
empty($this->request->get('z'))) |
|
{ |
|
header('HTTP/1.1 403 Forbidden'); |
|
exit(); |
|
} |
|
|
|
if (!isset($_COOKIE["uuid"])) { |
|
$str = md5(uniqid(mt_rand(), true)); |
|
$uuid = substr($str,0,8) . '-'; |
|
$uuid .= substr($str,8,4) . '-'; |
|
$uuid .= substr($str,12,4) . '-'; |
|
$uuid .= substr($str,16,4) . '-'; |
|
$uuid .= substr($str,20,12); |
|
setcookie("uuid", $uuid , time()+368400000); |
|
}else{ |
|
$uuid=$_COOKIE["uuid"]; |
|
} |
|
|
|
header('content-type: image/jpg'); |
|
header('HTTP/1.1 204 No Content'); |
|
|
|
if (function_exists("fastcgi_finish_request")) { |
|
fastcgi_finish_request(); //对于fastcgi会提前返回请求结果,提高响应速度。 |
|
} |
|
|
|
$url='v=1&t=pageview&'; |
|
$url.='tid='.$this->request->get('ga').'&'; |
|
$url.='cid='.$uuid.'&'; |
|
$url.='dl='.rawurlencode(rawurldecode($this->request->getReferer())).'&'; |
|
$url.='uip='.rawurlencode(rawurldecode($this->request->getip())).'&'; |
|
$url.='ua='.rawurlencode(rawurldecode($this->request->getAgent())).'&'; |
|
$url.='dt='.rawurlencode(rawurldecode($this->request->get('dt'))).'&'; |
|
$url.='dr='.rawurlencode(rawurldecode($this->request->get('dr'))).'&'; |
|
$url.='ul='.rawurlencode(rawurldecode($this->request->get('ul'))).'&'; |
|
$url.='sd='.rawurlencode(rawurldecode($this->request->get('sd'))).'&'; |
|
$url.='sr='.rawurlencode(rawurldecode($this->request->get('sr'))).'&'; |
|
$url.='vp='.rawurlencode(rawurldecode($this->request->get('vp'))).'&'; |
|
$url.='z='.$this->request->get('z'); |
|
$url='https://www.google-analytics.com/collect?'.$url; |
|
|
|
self::asyncRequest($url); |
|
} |
|
|
|
/** |
|
* 检测 适配器 |
|
* @return string |
|
*/ |
|
public static function isAvailable() |
|
{ |
|
function_exists('ini_get') && ini_get('allow_url_fopen') && (self::$_adapter = 'Socket'); |
|
false == self::$_adapter && function_exists('curl_version') && (self::$_adapter = 'Curl'); |
|
|
|
return self::$_adapter; |
|
} |
|
|
|
/** |
|
* 发送异步请求 |
|
* @param $url |
|
*/ |
|
public static function asyncRequest($url) |
|
{ |
|
self::isAvailable(); |
|
self::$_adapter == 'Socket' ? self::socket($url) : self::curl($url); |
|
} |
|
|
|
/** |
|
* Socket 请求 |
|
* @param $url |
|
* @return bool |
|
*/ |
|
public static function socket($url) |
|
{ |
|
$params = parse_url($url); |
|
$path = $params['path'] . '?' . $params['query']; |
|
$host = $params['host']; |
|
$port = 80; |
|
$scheme = ''; |
|
|
|
if ('https' == $params['scheme']) { |
|
$port = 443; |
|
$scheme = 'ssl://'; |
|
} |
|
|
|
if (function_exists('fsockopen')) { |
|
$fp = @fsockopen ($scheme . $host, $port, $errno, $errstr, 30); |
|
} elseif (function_exists('pfsockopen')) { |
|
$fp = @pfsockopen ($scheme . $host, $port, $errno, $errstr, 30); |
|
} else { |
|
$fp = stream_socket_client($scheme . $host . ":$port", $errno, $errstr, 30); |
|
} |
|
|
|
if ($fp === false) { |
|
return false; |
|
} |
|
|
|
$out = "GET " . $path . " HTTP/1.1\r\n"; |
|
$out .= "Host: $host\r\n"; |
|
$out .= "Connection: Close\r\n\r\n"; |
|
|
|
fwrite($fp, $out); |
|
sleep(1); |
|
fclose($fp); |
|
} |
|
|
|
/** |
|
* Curl 请求 |
|
* @param $url |
|
*/ |
|
public static function curl($url) |
|
{ |
|
$ch = curl_init(); |
|
curl_setopt($ch, CURLOPT_HTTPGET, 1); |
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将curl_exec()获取的信息以文件流的形式返回,不直接输出。 |
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // 连接等待时间 |
|
curl_setopt($ch, CURLOPT_TIMEOUT, 1); // curl允许执行时间 |
|
|
|
curl_exec($ch); |
|
curl_close($ch); |
|
|
|
} |
|
public function action(){ |
|
$this->on($this->request->is('ga'))->ga(); |
|
} |
|
} |
|
?>
|
|
|