提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
为了推动网络环境安全,百度已在PC、移动端搜索中取消referer中关于关键词的显示,保护站点流量关键词数据信息,第三方将不再可以轻易地窃取到流量关键词,令站点数据更加私密化。
网上搜到的方法已都失效。
提示:以下是本篇文章正文内容,下面案例可供参考
一、百度云开放referer api接口
百度云现在开放了referer api功能,可以通过 百度refer中的eqid参数来获取百度关键词。
百度智能云为了满足站长获取网站流量关键词的数据分析需求提供了精细化的搜索Referer API服务,在百度智能云网络环境内提供实时和批量获取API,站长通过提供其网站Referer关键词的eqid可以获取对应的Referer关键词。
站长对于Referer关键词的一些统计需求,也可以通过百度站长平台提供的搜索关键词工具或者百度统计相关功能进行查询。
二、使用步骤
1.前期准备
Api地址:https://cloud.baidu.com/doc/RefererAPI/s/hjwvycn07?qq-pf-to=pcqq.c2c
鉴权地址:https://cloud.baidu.com/doc/Reference/s/Njwvz1wot
账号申请:https://cloud.baidu.com/doc/Reference/s/9jwvz2egb
必须要用百度商业账号
2.登录成功后获取通过安全认证获取 Access Key
3.购买百度智能云服务器BCC(北京region)必须北京、引文api文档里指定了、只开放了北京
2.在bcc服务器放上获取
代码如下(示例):
<?php
date_default_timezone_set("Asia/Shanghai");
//获取关键词
function GetKwd($rid,$query)
{
$wd = GetTT($rid);
parse_str($query, $out);
if(count($wd)>0)
{
while (list($key, $val) = each($out))
{
if(in_array($key,$wd))
{
$keyword=decodekeyword($val);
}
}
}
return $keyword;
}
//设置不同来源的搜索变量名
function GetTT($TID)
{
$arr=array(
"1"=>array("wd","word"),//百度搜索时候的关键字变量名
"2"=>array("q") //谷歌搜索时候的关键字变量名
);
return $arr[$TID];
}
//编码转换
function decodekeyword($kval)
{
$charset=mb_detect_encoding($kval,array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
if($charset!='UTF-8')
{
return iconv($charset,'UTF-8',$kval);
}
else
{
return $kval;
}
}
function get_referer(){
$url = $_SERVER["HTTP_REFERER"]; //获取完整的来路URL
$url = $_SERVER["HTTP_REFERER"];
//$str = str_replace("https://","",$url); //去掉http://
//$strdomain = explode("/",$str); // 以“/”分开成数组
//$domain = $strdomain[0]; //取第一个“/”以前的字符
return $url;
}
// 根据RFC 3986,除了:
// 1.大小写英文字符
// 2.阿拉伯数字
// 3.点'.'、波浪线'~'、减号'-'以及下划线'_'
// 以外都要编码
global $PERCENT_ENCODED_STRINGS ;
__init();
//填充编码数组
function __init()
{
global $PERCENT_ENCODED_STRINGS ;
for ($i = 0; $i < 256; ++$i) {
$PERCENT_ENCODED_STRINGS[$i] = sprintf("%%%02X", $i);
}
//a-z不编码
foreach (range('a', 'z') as $ch) {
$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
}
//A-Z不编码
foreach (range('A', 'Z') as $ch) {
$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
}
//0-9不编码
foreach (range('0', '9') as $ch) {
$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
}
//以下4个字符不编码
$PERCENT_ENCODED_STRINGS[ord('-')] = '-';
$PERCENT_ENCODED_STRINGS[ord('.')] = '.';
$PERCENT_ENCODED_STRINGS[ord('_')] = '_';
$PERCENT_ENCODED_STRINGS[ord('~')] = '~';
}
//使用编码数组编码
function doUrlEncode($value)
{
global $PERCENT_ENCODED_STRINGS ;
$result = '';
for ($i = 0; $i < strlen($value); ++$i) {
$result .= $PERCENT_ENCODED_STRINGS[ord($value[$i])];
}
return $result;
}
function urlEncodeExceptSlash($path)
{
return str_replace("%2F", "/", doUrlEncode($path));
}
//生成标准化uri
function getCanonicalURIPath($path)
{
//空路径设置为'/'
if (empty($path)) {
return '/';
} else {
//所有的uri必须以'/'开头
if ($path[0] == '/') {
return urlEncodeExceptSlash($path);
} else {
return '/' . urlEncodeExceptSlash($path);
}
}
}
/**
* 获取认证字符串
*
* 任务一:创建前缀字符串(authStringPrefix)
* 任务二:创建规范请求(canonicalRequest),确定签名头域(signedHeaders)
* 任务三:生成派生签名密钥(signingKey)
* 任务四:生成签名摘要(signature),并拼接最终的认证字符串(authorization)
*
* @param $accessKey
* @param $secretKey
* @param $utcTimeStr
* @param $url
* @param $httpMethod
*/
function getAuth($accessKey, $secretKey, $utcTimeStr, $url, $httpMethod)
{
$urlParseRet = parse_url($url);
if (null === $urlParseRet) {
throw new \Exception('url error');
}
$host = isset($urlParseRet['host']) ? $urlParseRet['host'] : '';
$path = isset($urlParseRet['path']) ? $urlParseRet['path'] : '';
$version = "1";
$expirationSeconds = "1800";
$signatureHeaders = "host";
//生成authString
$authString = sprintf("bce-auth-v%s/%s/%s/%s", $version, $accessKey, $utcTimeStr, $expirationSeconds);
//使用sk和authString生成signKey
$signingKey = hash_hmac('sha256', $authString, $secretKey);
//生成标准化uri
$canonicalURI = getCanonicalURIPath($path);
//生成标准化QueryString
$canonicalQueryString = '';
//CanonicalHeaders
$canonicalHeader = $signatureHeaders . ':' . $host;
//组成标准请求串
$canonicalRequest = "$httpMethod\n$canonicalURI\n" . "$canonicalQueryString\n$canonicalHeader";
//使用signKey和标准请求串完成签名
$signature = hash_hmac('sha256', $canonicalRequest, $signingKey);
//组成最终签名串
return "$authString/$signatureHeaders/$signature";
}
$accessKey = 'x';//(ak)
$secretKey = 'x';//(sk)
$eqid = "_XH7zH3wFMS477iSyR_hEcQgCgediVfnadyfhCa4jA-LKmZlrOWpCXe9UAFlF1GdikopE_K75OiX8oaww1ZKMK";//document.referrer获取
$url = "http://referer.bj.baidubce.com/v1/eqid/{$eqid}";
$httpMethod = 'GET';
//设定时间戳,注意:如果自行指定时间戳需要为UTC时间
$timestamp = new DateTime();
$timestamp->setTimezone(new DateTimeZone("UTC"));
$utcTimeStr = $timestamp->format("Y-m-d\TH:i:s\Z");
//第一步:生成认证字符串
$auth = getAuth($accessKey, $secretKey, $utcTimeStr, $url, $httpMethod);
// 第二步:构造HTTP请求的header、body等信息
//注意head的格式不是key=>value
$head = array(
"accept-encoding: gzip, deflate",//非必填
"host: referer.bj.baidubce.com",//非必填
"content-type: application/json",
"authorization:{$auth}",
"x-bce-date:{$utcTimeStr}",
"accept: */*"//非必填
);
// 第三步:发送HTTP请求,并输出响应信息。
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($curl, CURLINFO_HEADER_OUT, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl);
$request = curl_getinfo($curl, CURLINFO_HEADER_OUT);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
//print_r ($response);
print("request: {$request}\n");
print("status: {$status}\n");
print("response: {$response}\n");
exit;
$referer=get_referer();
//$log_arr['reurl'] = urlencode($_GET['referrer']);//来源url
$log_arr['reurl'] =isset($_SESSION['HTTP_REFERER'])?$_SESSION['HTTP_REFERER']:'';
$tmp_reurl = parse_url(urldecode($log_arr['reurl']));
$kwd = '';
if(stristr($tmp_reurl['host'],'baidudu') == true || stristr($tmp_reurl['host'],'BAIDU') == true){
$log_arr['lyid'] = 1;
$kwd = GetKwd(1,$tmp_reurl['query']);
}
$log_arr['kwd'] = $kwd;
if(!empty($kwd)){
echo $log_arr['kwd'];
}
//echo $referer;
//echo $tmp_reurl;
?>
Get传入参数eqid