前言

用的Hexo博客,一直存在的问题是市面上的插件不是很多,有时候有些需求没法完成。
虽然有自动提交链接到百度的插件,但这个插件也有点鸡肋,如果你使用了百度统计,那本身就会带这个功能,这个插件也就不需要了。

现实需求

因为开通了百度熊掌号,所以有个需求:将更改或者新增的文章自动提交到百度熊掌号。

解决方案

在此之前,迷迷糊糊用了个 grep 来过滤含 index.html 的链接,以为带了这个就是在首页的文章,后来发现不是这么回事,因为一直都是那么几个链接,o(╯□╰)o。

1
grep -r -l 'index.html' * >urllist.txt  #这个思路是错误的

git思路

我的Hexo部署方案是自己有个VPS,然后VPS里装了git服务端和Hexo程序,MarkDown文档提交到VPS上的git仓库后,触发 post-receive 执行shell功能。

之前是在Hexo渲染完HTML文件后去处理,而Hexo每次渲染文件是全部重新生成的,时间特征不可取,所以解决思路是利用git日志,在MarkDown文件提交的时候知道哪个文档有增删改动,而且是准确的,将日志里出现的文件取出并拼接成外网链接,解决!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
unset GIT_DIR
GIT_REPO=/home/git/sobaigu.git
TMP_GIT_CLONE=/tmp/hexo
HEXO_HOME=/home/git/sobaigu
PUBLIC_WWW=/home/wwwroot/sobaigu.com
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
cp -rf ${TMP_GIT_CLONE}/hexo/* ${HEXO_HOME}
cd ${HEXO_HOME}
hexo clean
hexo g #有些vps上连着写貌似会出现改时区设置什么的,导致&&无法执行下去
hexo d
rm -rf ${PUBLIC_WWW}/*
cp -rf ${HEXO_HOME}/public/* ${PUBLIC_WWW}
### 将最新文章自动推送熊掌号和百度站在平台 ###
cd ${TMP_GIT_CLONE}
git diff --name-status HEAD^ >gitdiff.log
sed -e 's/^.*_posts\/......../http:\/\/sobaigu.com\//' -e 's/md$/html/' gitdiff.log >urls.txt
curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?appid=xxx&token=yyy&type=realtime"
curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?site=sobaigu.com&token=zzz"

这里并未考虑删除的情况,无所谓
上面的 sed 写法请根据自己的实际情况增删改

解释

1
git diff --name-status HEAD^ >gitdiff.log

对比当前版本和上一次提交的文件区别,并输出文本,内容一般是这样的:

1
2
M	hexo/source/_posts/2017-07-how-to-use-shadowsocks-andriod.md
M hexo/source/_posts/2018-01-how-to-use-shadowsocks-ssr-andriod.md

M 是有修改,D 是删除,A 是新增文件
1
sed -e 's/^.*_posts\/......../http:\/\/sobaigu.com\//' -e 's/md$/html/' gitdiff.log >urls.txt

sed 命令查找特征字符,并替换成我们要的链接,最后拼出来的效果便是:
1
2
http://sobaigu.com/linux-shell-with-vps.html
http://sobaigu.com/how-to-use-shadowsocks-ssr-andriod.html

最后用百度要求的 curl 命令规范提交就可以了。

参考文档

sed命令详解