主动推送的目的是能够把我们高质量内容推送给百度,但是首先你得有一个属于你自己的网站,在百度站长进行验证通过之后,才有资格推送百度sitemap。

  百度站长平台为未使用百度统计的站点提供三种验证方式:文件验证、html标签验证、CNAME验证

    1.文件验证:您需要下载验证文件,将文件上传至您的服务器,放置于域名根目录下。
    2.html标签验证:将html标签添加至网站首页html代码的<head>标签与</head>标签之间。
    3.CNAME验证:您需要登录域名提供商或托管服务提供商的网站,添加新的DNS记录。  

  我选择的是第一种方式,详细资料在http://zhanzhang.baidu.com/college/courseinfo?id=267&page=1这是百度官方给出的课件。

  验证通过之后选择链接提交方式,我选择了主动推送和sitemap两种,当然最快的是推送方式,主动推送,最为快速的提交方式,建议您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。

  公司用的框架是Play Framework 是一个纯 Java 的框架,所以我们选择post推送,然后我们看一下百度(baidu)给我们提供的推送接口如下:

  POST /urls?site=www.caizhuojie.com&token=edk7ychrEZP9pDQD HTTP/1.1
  User-Agent: curl/7.12.1 
  Host: data.zz.baidu.com 
  Content-Length: 83

  http://www.example.com/1.html
  http://www.example.com/2.html

进入我们主题,实现post 推送代码如下:

  

 package jobs;

 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import models.Game;
 import models.enums.Bool;
 import play.Play;
 import play.jobs.Job;
 import play.jobs.On;
 import play.libs.WS;
 import play.libs.WS.HttpResponse;
 import play.libs.WS.WSRequest;

 //这里是框架中自带的定时任务,要创建一个sitemap,只需要简单地继承play.jobs.Job类就可以设置每天晚上23:00启动一次
 @On("0 0 23 * * ?")
 public class SiteMap extends Job {

     public static String url = "http://data.zz.baidu.com/urls?site=www.caizhuojie.com&token=******"; // token这边百度提供

     public void doJob() throws Exception {

         // 这里是框架中的一个判断,在正式环境中才会运行,在测试环境中不会触发,以保证不会重发推送。
         if ("prod".equals(Play.id)) {
             Calendar calendar = Calendar.getInstance();
             Date currentData = calendar.getTime();
             calendar.add(Calendar.DAY_OF_MONTH, -1);
             Date lastDate = calendar.getTime();

             // 查询出数据库中的游戏数据id拼接起来,这就是我们要推送的链接,(注意拼接最后加上 换行‘\n’)
             List<String> newResult = Game.find(
                     "SELECT CONCAT('http://www.yiyoushuo.com/g',game.id,'\n') FROM Game AS game "//
                             + "where game.issueStatus=? and game.adoptTime > ? and game.adoptTime < ?",
                     Bool.TRUE, lastDate, currentData).fetch();
             // 查询中加入条件,查出当前时间至前一天此时时间所产生的新游戏id,满足每天更新推送。

             StringBuilder sb = new StringBuilder();
             for (String string : newResult) {
                 sb.append(string);
             }

             // 下面就是在play framework框架下的post请求。
             WSRequest request = WS.url(url);
             request.body = sb.toString();
             HttpResponse response = request.post();
             JsonElement json = response.getJson();
             JsonObject asJsonObject = json.getAsJsonObject();
             JsonElement success = asJsonObject.get("success");
             JsonElement remain = asJsonObject.get("remain");
             System.out.println(
                     "响应:" + response.getStatus() + "success:" + success.getAsInt() + "remain:" + remain.getAsInt());

         }
     }
 }

  成功则会返回 

在此附上可能出现的异常情况的返回码信息,供调试用:

200  无使用方式错误,需要进一步观察返回的内容是否正确
400  必选参数未提供
405  不支持的请求方式,我们只支持POST方式提交数据
411  HTTP头中缺少Content-Length字段
413  推送的数据过大,超过了10MB的限制
422  HTTP头中Content-Length声明的长度和实际发送的数据长度不一致
500  站长平台服务器内部错误

  关于百度Sitemap协议支持三种格式:文本格式、xml格式、Sitemap索引格式,可以根据自己情况来选择任意一种格式组织sitemap。

本人所用的是第二种xml格式:

  <?xml version="1.0" encoding="utf-8"?>
<!-- XML文件需以utf-8编码-->
<urlset>
<!--必填标签-->
    <url>
        <!--必填标签,这是具体某一个链接的定义入口,每一条数据都要用<url>和</url>包含在里面,这是必须的 -->
        <loc>http://www.yoursite.com/yoursite.html</loc>
        <!--必填,URL链接地址,长度不得超过256字节-->
        <lastmod>2017-03-19</lastmod>
        <!--可以不提交该标签,用来指定该链接的最后更新时间-->
        <changefreq>daily</changefreq>
        <!--可以不提交该标签,用这个标签告诉此链接可能会出现的更新频率 -->
        <priority>1.0</priority>
        <!--可以不提交该标签,用来指定此链接相对于其他链接的优先权比值,此值定于0.0-1.0之间-->
    </url>
    <url>
        <loc>http://www.yoursite.com/yoursite.html</loc>
        <lastmod>2017-03-19</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.8</priority>
    </url>
</urlset>
上述Sitemap向百度提交了一个url:http://www.yoursite.com/yoursite.html

 import java.io.FileWriter;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import org.dom4j.Document;
 import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.dom4j.io.XMLWriter;
 import models.Game;
 import models.enums.Bool;
 public class SiteMapService {
     public static String url ="http://data.zz.baidu.com/urls?site=www.caizhuojie.com&token=******";

     public static String getFileTimeStamp() {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String dateString = sdf.format(new Date());
         return dateString;
     }

     public static void pushAll() {

         List<String> resultGame = Game
                 .find("SELECT CONCAT('http://www.yiyoushuo.com/g',game.id,'\n') FROM Game AS game "//
                         + "where game.issueStatus=?", Bool.TRUE)
                 .fetch();
         StringBuilder sb = new StringBuilder();
         try {
             // 创建文件
             Document document = DocumentHelper.createDocument();
             // 生成根节点
             Element urlset = document.addElement("urlset");

             for (String string : resultGame) {
                 sb.append(string);
                 Element url = urlset.addElement("url");
                 Element loc = url.addElement("loc");
                 Element priority = url.addElement("priority");
                 Element lastmod = url.addElement("lastmod");
                 Element changefreq = url.addElement("changefreq");
                 loc.setText(string.replaceAll("\n", ""));
                 priority.setText("1.0");
                 lastmod.setText(getFileTimeStamp());
                 changefreq.setText("Always");
             }
             FileWriter writer = new FileWriter("sitemap.xml");
             XMLWriter xmlWriter = new XMLWriter(writer);
             xmlWriter.write(document);
             xmlWriter.close();

         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

程序运行之后生成一个sitemap.xml文件在网站根目录,进入自己的站点再手动添加进去即可。

如果朋友有兴趣的话,可以参考,谢谢。

百度推送-sitemap-使用playframework框架实现-java的更多相关文章

  1. iOS开发三步搞定百度推送

    iOS开发三步搞定百度推送   百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_s ...

  2. ios8中百度推送接收不到

    ios8中百度推送接收类型会有所改变: //消息推送注冊 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { ...

  3. iOS百度推送的基本使用

    一.iOS证书指导 在 iOS App 中加入消息推送功能时,必须要在 Apple 的开发者中心网站上申请推送证书,每一个 App 需要申请两个证书,一个在开发测试环境下使用,另一个用于上线到 App ...

  4. C# 简单的百度推送代码

    前段时间搞推送来着,安卓方面用到了百度的推送服务,由于只是简单的用到安卓推送的通知功能,所以没用百度推荐的C# SDK,通过借鉴网上的各种资料和百度的API,费了老大劲终于折腾出来一段能用的代码(早知 ...

  5. 【Azure 环境】Azure通知中心(Notification Hub)使用百度推送平台解说

    问题描述 在通知中心的页面中显示支持BaiDu,介绍一下支持的是百度(Baidu)的什么吗?Azure的这个功能在国内使用的时候是否可以保证国内安卓手机的信息送达率? 问题解答 通知中心的页面中的Ba ...

  6. iOS推送 (百度推送)

    近期在使用推送,所以与大家分享一下我所遇到的问题,与解决这个问题的方法.! 1.首先生成CertificateSigningRequest文件. 点击钥匙串訪问-->从证书颁发机构请求证书--& ...

  7. 在ThinkPHP3.x框架中实现将原创文章第一时间推送到百度收录

    前两天自己写的一篇文章“针对BootStrap中tabs控件的美化和完善”被别的网站给转载了,这也许是值得高兴的一件事情,但是有些网站并没有注明来源和作者.而去百度搜索这篇文章,排名第一的居然是那些转 ...

  8. 百度云推送-服务端 C# SDK

    思路: 1.公司有项目需要做android和ios手机端推送消息的功能: 2.没有接触过这方面的知识,一头雾水,开始在网上一顿搜,网上倒是有不少解决方案,首先搜的是android的解决方案,因为ios ...

  9. 改写百度云推送SDK,PHP PEAR 包:Services_Baidu_Push

    iPhone使用apple push很方便,而Android很多厂商删除了google push,而且google在大陆连不上,所以要用别的办法. Android常见的推送服务商有:极光推送(http ...

随机推荐

  1. ubuntu无法进入桌面的修复

    今天的kubuntu更新后停在了启动logo上,无法进入系统界面了. 先在网上找了找,搜到了一个看起来很像的. 1)ubuntu在系统启动logo过后无法进入桌面的处理方法 一般情况下,无法显示桌面, ...

  2. CodeForces757B

    B. Bash's Big Day time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...

  3. iOS 插件化开发汇总 Small框架

    应用插件化背景 目前很多应用功能越来越多,软件显得越来越臃肿.因此插件化就成了很多软件发展的必经之路,比如支付宝这种平台级别的软件: 页上密密麻麻的功能,而且还在增多,照这个趋势发展下去,软件包的大小 ...

  4. ubuntu下php编译

    1.安装依赖 sudo apt-get install libjpeg-devsudo apt-get install libxml2-devsudo apt-get -y install libjp ...

  5. TypeScript教程2

    在TS中,我们允许开发人员使用面向对象技术. 1.类让我们看看一个简单的基于类的例子: class Greeter { greeting: string; constructor(message: s ...

  6. iOS自定义视图- SJTextView

    需求: textView 需要placeholder用来提示输入 textView 要做字数限制 textView 禁止表情符号的输入 思考: 因为需求比较通用,便想通过自定义SJTextView来实 ...

  7. ArcGIS制图技巧系列(1)还原真实的植被

    ArcGIS制图技巧系列(1)还原真实的植被 by 李远祥 在GIS数据中,植被一般都是面装要素的形式存在.很多人在使用植被渲染的时候,一般会采用填充符号去渲染.而在ArcGIS中,填充符号要么就是纯 ...

  8. HTML5 技术在风电、光伏等新能源领域的应用

    随着新一轮工业革命兴起,应对气候变化日益成为全球共识,能源技术正在成为引领能源产业变革.实现创新驱动发展的源动力.从全球到中国,以风能.光伏发电为代表的新能源产业发展迅速,可再生能源发电与现代电网的融 ...

  9. mybatis随笔四之MapperProxy

    在上一篇文章我们已经得到了mapper的代理对象,接下来我们对demoMapper.getDemo(1)这种语句进行分析.由于返回的mapper是个代理对象,因此会进入invoke方法,接下来我们来看 ...

  10. java-4-类和对象

    一.以下代码为何无法通过编译?哪儿出错了? 错误:只定义了一个有参数的构造函数.而在主函数中定义的Foo类对象调用的是无参数的构造函数. 更改后: 二.多当个类之间有继承关系时,创建子类对象会导致父类 ...