<?php
//提交当日新增url开始,以dedecms为例
//一般是直接修改网站主域名与token即可
require_once(dirname(__FILE__)."/这里是你的url/common.inc.php");
$startTime = strtotime(date('Y-m-d', time()) . ' 00:00:00');
$endTime = strtotime(date('Y-m-d', time()) . ' 23:59:59');
$sql = 'SELECT id FROM `dede_archives` WHERE pubdate >='. $startTime .' AND pubdate < '. $endTime .' LIMIT 2000';//数字不要超过2000
$dsql->Execute('me', $sql);
$data = [];
while($row = $dsql->GetArray()){
$url = GetOneArchive($row['id'])['arcurl'];
$data[] = preg_match("#^(http|https):\/\/#i","$url")? "$url" : $GLOBALS['cfg_basehost'].$url;
}
//if(!$data){$data = [$_SERVER['HTTP_HOST']. '/' .'sitemap.xml'];} // 数据库不存在当天文章链接则推网站地图链接
//提交当日新增url结束
// 百度推送api类型地址
$requestApiArr = [
'pc' => 'http://data.zz.baidu.com/urls?site=www.你的域名&token=你的token',
'm' => 'http://data.zz.baidu.com/urls?site=m.你的域名&token=你的token', // todo 若没有M域名的话,将此段注释掉即可
// 'mip' => 'http://data.zz.baidu.com/urls?site=www.你的域名&token=你的token&type=mip', // todo 百度MIP接口已关闭,启用放开注释即可
// 'fast' => 'http://data.zz.baidu.com/urls?site=http://m.你的域名/&token=你的token&type=daily' // 此为快速收录api,10条[其他为1W条],此接口的另一个功能是链接提交之后即删除
];
foreach ($requestApiArr as $key => $value) {
$tempData = $data; // 临时赋值,处理单独推送成功失败的情况
if($key != 'pc'){
// 替换非PC单独请求域名前缀
$variable = str_replace('www', 'm', $tempData[0]);
// 替换表中数据
foreach($tempData as $k=>&$v){
$v = str_replace('www','m', $v);
}
}else{
$variable = $tempData[0];
}
$result = curlRequest($value, $variable); // 提交一条链接获取配额结果
$result = json_decode($result, true);
$successRes = $result['success'];
if($successRes){unset($tempData[0]);} // 单独请求成功移除临时数组第一个元素,取文件时多取一个
$remain = isset($result['remain']) ? $result['remain'] : 0;
// 未够配额操作
$count = count($tempData);
// 获取文件中的文章链接
$urls = getFile($key, $count, $remain, $value, $variable); // mip在子函数中单独处理
if ($key != 'mip') {
$urlTemp = implode("\n", $tempData) . "\n";
$finalUrl = $urlTemp . $urls;
requestData($value,explode("\n", $finalUrl)); // 请求百度推送
}
echo "<br>".$key . '------' . $key . '------' . $key . "<hr>";
}
/**
* 获取文件中配额不够的部分
* $key 百度推送api类型【pc/m/fast】
* $count 从数据库取出的文章数
* $remain 剩余配额数
* $api 请求地址
* $url 一条文章链接
* @return string
*/
function getFile($key, $count, $remain, $api, $url){
if($key == 'mip'){
return getFileInfoMip($count, $url);
}else{
switch ($key){
case 'pc':
$prefix = 'www';
break;
case 'm':
$prefix = 'm';
break;
case 'fast':
$prefix = 'm';
}
$isDel = ($key == 'fast') ? true : false; // 删除快速推送的未够数量
return getFileInfo('wenjian1', $count, $remain, $isDel, $prefix);
}
}
/**
* 获取mip格式的数据
* $count 从数据库取出的文章数
* $url 数据库中查出的第一个url
*/
function getFileInfoMip($count, $url){
$fix = ['www','m']; // todo 根据不同站规则修改的地方[有mip的情况下]
for($i=0;$i<count($fix);$i++){
if($fix[$i] == 'www'){
$mip_www_remain = getRemain('http://data.zz.baidu.com/urls?site='. $fix[$i] .'.你的域名&token=你的token&type=mip', $url); // 请求www
}elseif ($fix[$i] == 'm'){
$mip_m_remain = getRemain('http://data.zz.baidu.com/urls?site='. $fix[$i] .'.你的域名&token=你的token&type=mip', $url); // 请求m
}
}
// 此部分为mip推送提交获取文件
$urlPath = './wenjian2.txt';
$content = file_get_contents($urlPath);
$contentArr = explode("\n", $content);
// 取配额不够的数据
$tempDataWWW = []; // todo 根据不同站规则修改的地方[有mip的情况下]
$tempDataM = [];
foreach($contentArr as $k=>$v){
$countTempDataWWW = count($tempDataWWW)+$count;
$countTempDataM = count($tempDataM)+$count;
$prefix = getDomainNamePrefix($v, '//', 2);
if($countTempDataWWW < $mip_www_remain && $prefix == 'www'){ // todo 根据不同站规则修改的地方[有mip的情况下]
$tempDataWWW[] = $v;
}elseif ($countTempDataM < $mip_m_remain && $prefix == 'm'){
$tempDataM[] = $v;
}
// 判断是否跳出
if($countTempDataWWW >= $mip_www_remain && $countTempDataM >= $mip_m_remain){
break;
}
}
// 请求
requestData('http://data.zz.baidu.com/urls?site=www.你的域名&token=你的token&type=mip', $tempDataWWW);
requestData('http://data.zz.baidu.com/urls?site=m.你的域名&token=你的token&type=mip', $tempDataM);
}
/**
* 操作文件
* $fileName 读取的文件名
* $count 从数据库取出的文章数
* $remain 百度推送总配额数
* $del 是否删除文件数据 true删除 false不删除
* $prefix 百度api接口前缀
* @return string 以换行拼接的文章地址
*/
function getFileInfo($fileName, $count, $remain, $isDel=false, $prefix){
if($count < $remain){
// 获取文件
$urlPath = './' . $fileName . '.txt';
$content = file_get_contents($urlPath);
$contentArr = explode("\n", $content);
$diff = $remain - $count;
$tempData = [];
// 取配额不够的数据
foreach($contentArr as $k=>$v){
$prefix_value = getDomainNamePrefix($v, '//', 2);
if((count($tempData) < $diff) && ($prefix_value == $prefix)){
$tempData[] = $v;
if($isDel){unset($contentArr[$k]);} // 最后一次执行fast时删除数据
}elseif(count($tempData) >= $diff){
break;
}
}
$content = implode("\n", $tempData);
if($isDel){file_put_contents($urlPath, implode("\n", $contentArr));} // 执行删除操作后重新写入文件
return $content;
}
}
/**
* 递归处理数据请求百度接口
* $api 请求百度接口地址
* $urls 文章地址数组
*/
function requestData( $api, $urls){
$count = count($urls);
if($count > 2000){
$number = 2000; // todo 最大不超过两千条
$num = ceil($count / $number);
for($i=0; $i<$num; $i++){
$data = array_splice($urls, 0, $number);
echo curlRequest($api, implode("\n", $data));
}
}else{
if(count($urls) > 0){ // todo 只是限制从文件中获取的
echo curlRequest($api, implode("\n", $urls));
}
}
}
/**
* 百度推送
* $api 百度API地址
* $urls 以换行拼接的文章地址
* @return string json
*/
function curlRequest($api, $urls){
$ch = curl_init();
$options = array(
CURLOPT_URL => $api,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $urls,
CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
return $result;
}
/**
* 获取推送剩余的条数
* $api 请求地址
* $urls 请求参数
* @return number 剩余配额数
*/
function getRemain($api, $urls){
$result = curlRequest($api, $urls);
return json_decode($result, true)['remain'];
}
/**
* 获取域名前缀
* $url 地址
* $format 查找url的开头位置
* $len 开头位置后移位数
* @return string
*/
function getDomainNamePrefix($url, $format, $len){
$s = strpos($url, "$format")+$len;
$ss = strpos($url, '.', $s);
$len = $ss-$s;
return substr($url, $s, $len);
}
exit();