自动提交Hexo博客的地址到百度

楔子

百度支持提交地址 但对于我们这种站是不支持sitemap的 你可以手动提交数据 我们就用Hexo来实现这个提交

实现思路

NodeJS是现学现卖的 Hexo开发也没接触过 我折腾了一下午加一晚上才弄了个半成品 还不知道怎么把它变成一个可以安装的包

思路是 在生成的时候生成一个urls.txt文件 里面是所有文章的链接 注册一个submit功能 这样的话 运行hexo submit的时候用curl把文件提交就可以了

下面把代码贴出来罢

index.js

1
2
3
4
5
6
7
'use strict';
hexo.extend.generator.register('submit', require('./lib/generator'));
hexo.extend.console.register('submit', 'Submit to Baidu.', {
desc: 'Submit to Baidu search engine.'
}, require('./lib/submit'));

/lib/generator.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'use strict';
module.exports = function(locals){
var config = this.config;
var posts = locals.posts.sort('-date');
posts = posts.limit(config.submit.limit || 20);
var url = "";
posts.forEach(function(post){
url += encodeURI(post.permalink);
url += '\n';
});
return {
path: 'urls.txt',
data: url
};
};

submit.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
'use strict';
var fsFn = require('fs');
var util = require('hexo-util');
var spawn = util.spawn;
module.exports = function(locals){
// curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?site=www.chriszheng.science&token=XXXXXXXXXXXXXXXX"
var config = this.config;
if (!config.submit.token)
hexo.exit();
var sub_url = 'http://data.zz.baidu.com/urls?site=';
sub_url += config.url.replace('http://', '');
sub_url += '&token=';
sub_url += config.submit.token;
console.log(sub_url);
var params = [
'-H',
'\'Content-Type:text/plain\'',
'--data-binary',
'\'@./public/urls.txt\'', // Must be quoted.
'\'' + sub_url + '\''
];
return spawn('curl', params, {verbose: true}).then(function(){
fsFn.unlink('./public/urls.txt', function (err){
if (err) throw err;
});
});
};