一、找接口
一些大型网站上较大的背景图片是异步加载的。我也在Bing上验证过。当网速慢时,背景显示为黑色,图像显示较晚。所以我觉得应该从接口返回图片地址,然后异步加载。然后我使用Chrome的调试工具Network,发现了这样一个接口:http://cn.bing.com/HPImageArchive.aspx?format=jsidx=0n=1mkt=zh-CN
点击一看,就知道图片信息都在里面了。
图片界面
二、得到图片并保存
这里用到了请求模块,也是常用的获取界面内容的模块。
const request=require("请求");
const fs=require("fs");
const 路径=require("路径");
request.get("http://cn.bing.com/HPImageArchive.aspx?format=jsidx=0n=1mkt=zh-CN", (错误、响应、正文)={
const img=JSON.parse(body).images[0];
const arr=img.url.split("/");
const str=arr[arr.length - 1];
request(img.url).pipe(fs.createWriteStream(path.join("./img", str)));
console.log(`${new Date()}${str} 没问题!`);
});代码其实很简单
首先取出img资源,然后使用fs文件模块将img资源放入目录中的"img"文件夹中。
但问题来了。该代码仅用于将当天的图片保存到文件夹中。你仍然需要每天输入node app.js来获取图片。与之前的右键保存相比,并没有提高多少效率。
三、定时任务
既然我们每天必须运行一次,为什么我们不使用计划任务来执行呢?这里我们使用一个名为node-schedule的新模块。
node-schedule专门用来做定时任务。详细内容可以阅读官方文档。我将简单地将代码粘贴到此处。
const Schedule=require("节点计划");
const 规则=新的Schedule.RecurrenceRule();
Rule.dayOfWeek=[0, 新的Schedule.Range(1, 6)];
规则.小时=8;
规则. 分钟=0;
Schedule.scheduleJob(规则, ()={
require("./src/get.js");
});那么问题又来了,我总不能天天开着电脑吧?解决方案其实很简单,放到服务器上执行即可。但是如何在服务器本地使用壁纸呢?这个就更简单了,直接使用git来同步壁纸就可以了!一个git pull 命令和所有以前保存的图像都在这里!
四、服务器执行代码,并自动上传git
要在节点中使用git 命令行,我们需要另一个模块child_process。该模块是node自带的,可以直接使用。
const childProcess=require("child_process");
const cmd=(c)=c;
const shell="bash";
常量配置={
env: {
NODE_ENV: "生产",
编码:"utf8",
},
壳,
};
常量执行=(c)={
返回新的Promise((解决, 拒绝)={
childProcess.exec(c, config, (err, stdout, stderr)={
如果(错误){
拒绝(错误);
} 别的{
解决(标准输出,标准错误);
}
});
});
};
console.log("部署开始。");
exec(cmd("git status"))
.then(()=exec(cmd("git add .")))
.then(()=exec(cmd("git commit -m "ss"")))
.then(()=exec(cmd("git push -u origin master")))
.then(()=console.log("部署结束。"))
.catch(错误={
控制台.错误(错误);
});这里的代码有点多,但是其实很简单。它只是让节点执行命令行。所有命令行都位于底部。
五、上线
将代码放在服务器上运行,并将执行请求更改为以下内容:
const request=require("请求");
const fs=require("fs");
const 路径=require("路径");
request.get("http://cn.bing.com/HPImageArchive.aspx?format=jsidx=0n=1mkt=zh-CN", (错误、响应、正文)={
const img=JSON.parse(body).images[0];
const arr=img.url.split("/");
const str=arr[arr.length - 1];
request(img.url).pipe(fs.createWriteStream(path.join("./img", str)));
设置超时(()={
require("./cmd.js");
}, 20000);
console.log(`${new Date()}${str} 没问题!`);
});这里的20 秒延迟是一个简单的方法,以确保fs 在上传到git 之前保存文件。当然,还有其他解决方案。这种粗略的解决方案只是因为这是一个计划任务,没有时间要求。
六、验收成果
几天后本地
这几天git pull保存的壁纸都是保存在本地的!
真的很酷!
【使用Node.js每日自动保存Bing美图教程】相关文章:
用户评论
这也太酷了吧!省时又省力
有19位网友表示赞同!
每天自动下载Bing美图,岂不美滋滋?
有19位网友表示赞同!
我一直在寻找一款能完成这个任务的工具,终于找到了!
有20位网友表示赞同!
学习一下用nodejs的自动化脚本操作网站功能?
有13位网友表示赞同!
这样可以一直都有最新的Bing美图作为壁纸啊!
有11位网友表示赞同!
分享一下代码吗?我想试试。
有18位网友表示赞同!
这能省下很多时间,非常实用!
有10位网友表示赞同!
我一直在想怎么批量下载Bing美图,这下不用愁了。
有12位网友表示赞同!
nodejs真强大!
有7位网友表示赞同!
请问这个脚本需要自己搭建服务器吗?
有12位网友表示赞同!
用nodejs实现自动化脚本,是不是比较难?
有20位网友表示赞同!
希望教程详细一些,方便小白学习。
有10位网友表示赞同!
Bing美图真的很漂亮啊!有了这个工具,可以每天欣赏它们了。
有10位网友表示赞同!
感觉这个项目的难度系数应该不高吧?
有10位网友表示赞同!
请问脚本能够根据用户设置自动下载特定主题的美图吗?
有12位网友表示赞同!
期待看到更多关于nodejs的自动化脚本教程!
有9位网友表示赞同!
这样的工具简直太棒了,希望作者能继续更新!
有14位网友表示赞同!
有没有其他网站也可以通过nodejs这种方法进行美图下载?
有15位网友表示赞同!
用nodejs实现自动化每天保存Bing美图这种任务很常见?
有17位网友表示赞同!