1. <?php
    2. //提交当日新增url开始,以dedecms为例
    3. //一般是直接修改网站主域名与token即可
    4. require_once(dirname(__FILE__)."/这里是你的url/common.inc.php");
    5. $startTime = strtotime(date('Y-m-d', time()) . ' 00:00:00');
    6. $endTime = strtotime(date('Y-m-d', time()) . ' 23:59:59');
    7. $sql = 'SELECT id FROM `dede_archives` WHERE pubdate >='. $startTime .' AND pubdate < '. $endTime .' LIMIT 2000';//数字不要超过2000
    8. $dsql->Execute('me', $sql);
    9. $data = [];
    10. while($row = $dsql->GetArray()){
    11. $url = GetOneArchive($row['id'])['arcurl'];
    12. $data[] = preg_match("#^(http|https):\/\/#i","$url")? "$url" : $GLOBALS['cfg_basehost'].$url;
    13. }
    14. //if(!$data){$data = [$_SERVER['HTTP_HOST']. '/' .'sitemap.xml'];} // 数据库不存在当天文章链接则推网站地图链接
    15. //提交当日新增url结束
    16. // 百度推送api类型地址
    17. $requestApiArr = [
    18. 'pc' => 'http://data.zz.baidu.com/urls?site=www.你的域名&token=你的token',
    19. 'm' => 'http://data.zz.baidu.com/urls?site=m.你的域名&token=你的token', // todo 若没有M域名的话,将此段注释掉即可
    20. // 'mip' => 'http://data.zz.baidu.com/urls?site=www.你的域名&token=你的token&type=mip', // todo 百度MIP接口已关闭,启用放开注释即可
    21. // 'fast' => 'http://data.zz.baidu.com/urls?site=http://m.你的域名/&token=你的token&type=daily' // 此为快速收录api,10条[其他为1W条],此接口的另一个功能是链接提交之后即删除
    22. ];
    23. foreach ($requestApiArr as $key => $value) {
    24. $tempData = $data; // 临时赋值,处理单独推送成功失败的情况
    25. if($key != 'pc'){
    26. // 替换非PC单独请求域名前缀
    27. $variable = str_replace('www', 'm', $tempData[0]);
    28. // 替换表中数据
    29. foreach($tempData as $k=>&$v){
    30. $v = str_replace('www','m', $v);
    31. }
    32. }else{
    33. $variable = $tempData[0];
    34. }
    35. $result = curlRequest($value, $variable); // 提交一条链接获取配额结果
    36. $result = json_decode($result, true);
    37. $successRes = $result['success'];
    38. if($successRes){unset($tempData[0]);} // 单独请求成功移除临时数组第一个元素,取文件时多取一个
    39. $remain = isset($result['remain']) ? $result['remain'] : 0;
    40. // 未够配额操作
    41. $count = count($tempData);
    42. // 获取文件中的文章链接
    43. $urls = getFile($key, $count, $remain, $value, $variable); // mip在子函数中单独处理
    44. if ($key != 'mip') {
    45. $urlTemp = implode("\n", $tempData) . "\n";
    46. $finalUrl = $urlTemp . $urls;
    47. requestData($value,explode("\n", $finalUrl)); // 请求百度推送
    48. }
    49. echo "<br>".$key . '------' . $key . '------' . $key . "<hr>";
    50. }
    51. /**
    52. * 获取文件中配额不够的部分
    53. * $key 百度推送api类型【pc/m/fast】
    54. * $count 从数据库取出的文章数
    55. * $remain 剩余配额数
    56. * $api 请求地址
    57. * $url 一条文章链接
    58. * @return string
    59. */
    60. function getFile($key, $count, $remain, $api, $url){
    61. if($key == 'mip'){
    62. return getFileInfoMip($count, $url);
    63. }else{
    64. switch ($key){
    65. case 'pc':
    66. $prefix = 'www';
    67. break;
    68. case 'm':
    69. $prefix = 'm';
    70. break;
    71. case 'fast':
    72. $prefix = 'm';
    73. }
    74. $isDel = ($key == 'fast') ? true : false; // 删除快速推送的未够数量
    75. return getFileInfo('wenjian1', $count, $remain, $isDel, $prefix);
    76. }
    77. }
    78. /**
    79. * 获取mip格式的数据
    80. * $count 从数据库取出的文章数
    81. * $url 数据库中查出的第一个url
    82. */
    83. function getFileInfoMip($count, $url){
    84. $fix = ['www','m']; // todo 根据不同站规则修改的地方[有mip的情况下]
    85. for($i=0;$i<count($fix);$i++){
    86. if($fix[$i] == 'www'){
    87. $mip_www_remain = getRemain('http://data.zz.baidu.com/urls?site='. $fix[$i] .'.你的域名&token=你的token&type=mip', $url); // 请求www
    88. }elseif ($fix[$i] == 'm'){
    89. $mip_m_remain = getRemain('http://data.zz.baidu.com/urls?site='. $fix[$i] .'.你的域名&token=你的token&type=mip', $url); // 请求m
    90. }
    91. }
    92. // 此部分为mip推送提交获取文件
    93. $urlPath = './wenjian2.txt';
    94. $content = file_get_contents($urlPath);
    95. $contentArr = explode("\n", $content);
    96. // 取配额不够的数据
    97. $tempDataWWW = []; // todo 根据不同站规则修改的地方[有mip的情况下]
    98. $tempDataM = [];
    99. foreach($contentArr as $k=>$v){
    100. $countTempDataWWW = count($tempDataWWW)+$count;
    101. $countTempDataM = count($tempDataM)+$count;
    102. $prefix = getDomainNamePrefix($v, '//', 2);
    103. if($countTempDataWWW < $mip_www_remain && $prefix == 'www'){ // todo 根据不同站规则修改的地方[有mip的情况下]
    104. $tempDataWWW[] = $v;
    105. }elseif ($countTempDataM < $mip_m_remain && $prefix == 'm'){
    106. $tempDataM[] = $v;
    107. }
    108. // 判断是否跳出
    109. if($countTempDataWWW >= $mip_www_remain && $countTempDataM >= $mip_m_remain){
    110. break;
    111. }
    112. }
    113. // 请求
    114. requestData('http://data.zz.baidu.com/urls?site=www.你的域名&token=你的token&type=mip', $tempDataWWW);
    115. requestData('http://data.zz.baidu.com/urls?site=m.你的域名&token=你的token&type=mip', $tempDataM);
    116. }
    117. /**
    118. * 操作文件
    119. * $fileName 读取的文件名
    120. * $count 从数据库取出的文章数
    121. * $remain 百度推送总配额数
    122. * $del 是否删除文件数据 true删除 false不删除
    123. * $prefix 百度api接口前缀
    124. * @return string 以换行拼接的文章地址
    125. */
    126. function getFileInfo($fileName, $count, $remain, $isDel=false, $prefix){
    127. if($count < $remain){
    128. // 获取文件
    129. $urlPath = './' . $fileName . '.txt';
    130. $content = file_get_contents($urlPath);
    131. $contentArr = explode("\n", $content);
    132. $diff = $remain - $count;
    133. $tempData = [];
    134. // 取配额不够的数据
    135. foreach($contentArr as $k=>$v){
    136. $prefix_value = getDomainNamePrefix($v, '//', 2);
    137. if((count($tempData) < $diff) && ($prefix_value == $prefix)){
    138. $tempData[] = $v;
    139. if($isDel){unset($contentArr[$k]);} // 最后一次执行fast时删除数据
    140. }elseif(count($tempData) >= $diff){
    141. break;
    142. }
    143. }
    144. $content = implode("\n", $tempData);
    145. if($isDel){file_put_contents($urlPath, implode("\n", $contentArr));} // 执行删除操作后重新写入文件
    146. return $content;
    147. }
    148. }
    149. /**
    150. * 递归处理数据请求百度接口
    151. * $api 请求百度接口地址
    152. * $urls 文章地址数组
    153. */
    154. function requestData( $api, $urls){
    155. $count = count($urls);
    156. if($count > 2000){
    157. $number = 2000; // todo 最大不超过两千条
    158. $num = ceil($count / $number);
    159. for($i=0; $i<$num; $i++){
    160. $data = array_splice($urls, 0, $number);
    161. echo curlRequest($api, implode("\n", $data));
    162. }
    163. }else{
    164. if(count($urls) > 0){ // todo 只是限制从文件中获取的
    165. echo curlRequest($api, implode("\n", $urls));
    166. }
    167. }
    168. }
    169. /**
    170. * 百度推送
    171. * $api 百度API地址
    172. * $urls 以换行拼接的文章地址
    173. * @return string json
    174. */
    175. function curlRequest($api, $urls){
    176. $ch = curl_init();
    177. $options = array(
    178. CURLOPT_URL => $api,
    179. CURLOPT_POST => true,
    180. CURLOPT_RETURNTRANSFER => true,
    181. CURLOPT_POSTFIELDS => $urls,
    182. CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
    183. );
    184. curl_setopt_array($ch, $options);
    185. $result = curl_exec($ch);
    186. return $result;
    187. }
    188. /**
    189. * 获取推送剩余的条数
    190. * $api 请求地址
    191. * $urls 请求参数
    192. * @return number 剩余配额数
    193. */
    194. function getRemain($api, $urls){
    195. $result = curlRequest($api, $urls);
    196. return json_decode($result, true)['remain'];
    197. }
    198. /**
    199. * 获取域名前缀
    200. * $url 地址
    201. * $format 查找url的开头位置
    202. * $len 开头位置后移位数
    203. * @return string
    204. */
    205. function getDomainNamePrefix($url, $format, $len){
    206. $s = strpos($url, "$format")+$len;
    207. $ss = strpos($url, '.', $s);
    208. $len = $ss-$s;
    209. return substr($url, $s, $len);
    210. }
    211. exit();