使用Nodejs獲取bing每日圖片
我準(zhǔn)備做成一個接口的形式,訪問就直接返回當(dāng)日的bing圖片。當(dāng)然這個圖片得適應(yīng)于更多場景~
所以,我對他做了一下設(shè)計:
- 可以自定義寬高
- 也可以傳入size,這個size可以理解為等比例縮放。
- 會影響圖片大小
由此得到了一個注釋
/**
* @description 獲取必應(yīng)圖片
* @param {Number} req.body.w 寬度
* @param {Number} req.body.h 高度
* @param {Number} req.body.size 圖片大小
* @returns {BinaryData} 圖片二進(jìn)制
*/
開始擼代碼
這里我選擇了比較方便的express
mkdir bing && cd bing && pnpm init pnpm add express # 安裝node-fetch為我們做請求 pnpm add node-fetch # 還需要安裝一下sharp對我們的圖片進(jìn)行處理 pnpm add sharp
啟動express
做了一下簡單的router分離
// app.js
import 'dotenv/config';
import express from "express"
import cors from "cors"
import imagesRouter from './src/router/images.js'
const app = express();
app.use(cors());
app.use("/images", imagesRouter);
app.get("/", (req, res) => {
res.send("Hello World");
})
app.listen(process.env.RUN_TIME_PORT, () => {
console.log(`Server running on port ${process.env.RUN_TIME_PORT}`);
})
到這里 我們的express服務(wù)器已經(jīng)啟動成功了~
useBing
其實(shí)bing的每日圖片,bing提供了API,也就是
https://global.bing.com/HPImageArchive.aspx?format=js&idx=0&n=9&pid=hp&FORM=BEHPTB&uhd=1&uhdwidth=3840&uhdheight=2160&setmkt=%25s&setlang=en
訪問他,獲取數(shù)組中的第一個,就是今天的圖片哦~
// 請求
const base = "https://www.bing.com";
const reqUrl = base + '/HPImageArchive.aspx?format=js&idx=0&n=9&pid=hp&FORM=BEHPTB&uhd=1&uhdwidth=3840&uhdheight=2160&setmkt=%s&setlang=en';
const data = await fetch(reqUrl)
const json = await data.json()
分析一下返回的json
// 請求
const base = "https://www.bing.com";
const reqUrl = base + '/HPImageArchive.aspx?format=js&idx=0&n=9&pid=hp&FORM=BEHPTB&uhd=1&uhdwidth=3840&uhdheight=2160&setmkt=%s&setlang=en';
const data = await fetch(reqUrl)
const json = await data.json()
需要的其實(shí)就url這個鏈接~。
這個鏈接會直接返回一個圖片。
所以處理一下這個地方的BASE_URL='https://www.bing.com'+url
我們就得倒了圖片的資源路徑~
下載
當(dāng)我們已經(jīng)得倒了資源路徑,就繼續(xù)下載
export async function downloadImage(src = '',name='bing.jpg') {
const response = await fetch(src);
const buffer = await response.buffer();
fs.writeFileSync(BING_PATH(name), buffer)
}
src就是圖片的資源路徑name圖片存儲路徑
但是這個地方有個問題,我們總不能每次都去下載吧?
所以,就需要做一下判斷。如果這個圖片已經(jīng)下載好了,那么就直接返回我們下載好的圖片~
判斷文件是否已經(jīng)存在
我這里是直接用當(dāng)前日期做的文件名,比較方便。 我們只需要遍歷一下,存儲bing文件夾下的文件,是否有以當(dāng)前日期開頭的文件就可以啦。
export function bingIsExist() {
const today = dayjs().format("YYYY-MM-DD");
const data = fs.readdirSync(BASE_PUBLIC_DIR + '/bing')
const isExist = some(data, v => v.startsWith(`${today}`))
return isExist
}
完整的useBing
/**
* 下載bing圖片
* 1. 判斷今天的圖片是否已經(jīng)下載過了
* 2. 如果沒有下載過,那么就下載
* 3. 如果下載過了,就直接返回本地文件
* @returns {BinaryData} 圖片二進(jìn)制
*/
export async function useBing() {
const canFind = bingIsExist()
const toDay = dayjs().format("YYYY-MM-DD");
if (!canFind) {
const base = "https://www.bing.com";
const reqUrl = base + '/HPImageArchive.aspx?format=js&idx=0&n=9&pid=hp&FORM=BEHPTB&uhd=1&uhdwidth=3840&uhdheight=2160&setmkt=%s&setlang=en';
const data = await fetch(reqUrl)
const json = await data.json()
const url = json.images[0].url
const realURL = base + url
await downloadImage(realURL, toDay + ".jpg")
}
const data = fs.readFileSync(BING_PATH(toDay + ".jpg"))
return data
}
接口返回
當(dāng)我們工具函數(shù)都寫完了,那么就需要在接口中開始調(diào)用,完成這個接口。
router.get("/bing", async (req, res) => {
const { w, h, size } = req.query // 需要使用body-paser哦
const blob = await useBing()
res.setHeader("Content-Type", "image/jpeg")
// 中間使用sharp處理圖片。就不多贅述,自行編寫~很簡單
...
res.send(blob)
})
測試一下

還需注意一點(diǎn),不同區(qū)域獲取到的圖片會有所不同。需要自己去處理,根據(jù)訪問ip去定位,最后修改api中的區(qū)域。
到此這篇關(guān)于使用Nodejs獲取bing每日圖片的文章就介紹到這了,更多相關(guān)Nodejs獲取bing圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nodejs服務(wù)內(nèi)存泄露排查過程和優(yōu)化方法
在開發(fā)和部署Node.js應(yīng)用程序時,內(nèi)存泄露是一個常見的挑戰(zhàn),本文將探討如何對于一個陌生項(xiàng)目進(jìn)行內(nèi)存排查和優(yōu)化的方法,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Node.JS中快速掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的Web服務(wù)器地址(80)
在 Node.JS 中進(jìn)行端口掃描還是比較方便的,一般會有廣播和輪詢兩種方式。下文重點(diǎn)給大家介紹node.js 掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的web服務(wù)器地址的方法,一起看看吧2017-09-09
Node.js如何實(shí)現(xiàn)注冊郵箱激活功能 (常見)
今天了解了node如何實(shí)現(xiàn)郵箱激活功能,這個功能非常常見,當(dāng)我們注冊一個賬號時,肯定會有這步,下面看下如何實(shí)現(xiàn)這個功能2017-07-07
關(guān)于npm主版本升級及其相關(guān)知識點(diǎn)總結(jié)
npm是Node.js默認(rèn)的包管理器,以javascript?編寫的軟件包管理系統(tǒng)用于分享和使用代碼,下面這篇文章主要給大家介紹了關(guān)于npm主版本升級及其相關(guān)知識點(diǎn)總結(jié)的相關(guān)資料,需要的朋友可以參考下2022-12-12
利用Node.js和MySQL實(shí)現(xiàn)創(chuàng)建API服務(wù)器
這篇文章主要為大家詳細(xì)介紹了如何使用Node.js和MySQL創(chuàng)建API服務(wù)器的步驟,這也是從前端邁向全棧的一個開始,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-01-01

