漂亮的前提就是要很多图片 而且要一直变的图片
所以我要找一个带有图片的主题(现在已经换掉了,不整这些花里胡哨的)
然后写一个自动下载图片的工具 每天换一张图片
瞄准了 必应官网 而且每天更新图片

创建node项目

1
npm init

下载网页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 安装request
npm install request
const request require('request')

function loadPage(url) {
return new Promise((resolve, reject) => {
request(url, function(err, response, body) {
if(err) {
reject('下载网页失败')
} else {
resolve(body)
}
});
})
}

从网页里提取bing首页的背景图片

1
2
3
4
5
6
7
8
9
10
11
12
13
// 安装cheerio
npm install cheerio
const cheerio = require('cheerio')

function extractImageUrl(body) {
const $ = cheerio.load(body)
const imgStr = $('#bgImgProgLoad').data('ultra-definition-src')
let url = ''
if(/(.*?jpg)/.test(imgStr)) {
url = RegExp.$1
}
return url
}

注:cheerio 是nodejs解析网页的工具,其使用jquery语法,使用起来很方便,可以查看官网

下载图片

1
2
3
4
5
6
async function dowoloadImage(url) {
const distName = 'temp.jpg'
const distPath = IMAGE_DIR + '/' + distName
await request(url).pipe(fs.createWriteStream(distPath))
return distPath
}

下载完成以后 另存当前使用的图片 使用新的图片作为网站图片

1
2
3
4
5
6
7
8
function replace(tempPath) {
const defautPath = IMAGE_DIR + '/default.jpg'
const newPath = IMAGE_DIR + '/' + moment().format('YYYY-MM-DD') + '.jpg'
if(fs.existsSync(defautPath)) {
fs.renameSync(defautPath, newPath)
}
fs.renameSync(tempPath, defautPath)
}

每天晚上两点下载一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
async function main() {
try {
const body = await loadPage(BING_URL)
const url = extractImageUrl(body)
if(!url) {
return console.log('提取图片地址失败')
}
const tempPath = await dowoloadImage(BING_URL + url)
replace(tempPath)
} catch (error) {
console.log(error)
}
}

main()
const task = schedule.scheduleJob('0 0 2 * * *', () => {
main()
})

使用PM2来管理任务, 新增app配置

1
2
3
4
5
6
7
8
9
{
apps: [
...
{
"name": "auto download bing image",
"script": "index.js",
"cwd": "/opt/workspace/bingImgDownload/"
}
}

现在下载的图片的是保存在hexo主题之外的,现在我们将原来使用的图片删除,创建一个同名的软链,指向我们下载的default.jpg

1
ln -s /opt/workspace/bingImgDownload/images/default.jpg ./default.png

重启pm2 大功告成。

完成代码