使用Nodejs獲取bing每日圖片
我準(zhǔn)備做成一個(gè)接口的形式,訪問就直接返回當(dāng)日的bing圖片。當(dāng)然這個(gè)圖片得適應(yīng)于更多場景~
所以,我對他做了一下設(shè)計(jì):
- 可以自定義寬高
- 也可以傳入size,這個(gè)size可以理解為等比例縮放。
- 會影響圖片大小
由此得到了一個(gè)注釋
/** * @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ù)組中的第一個(gè),就是今天的圖片哦~
// 請求 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
這個(gè)鏈接~。
這個(gè)鏈接會直接返回一個(gè)圖片。
所以處理一下這個(gè)地方的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
圖片存儲路徑
但是這個(gè)地方有個(gè)問題,我們總不能每次都去下載吧?
所以,就需要做一下判斷。如果這個(gè)圖片已經(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)用,完成這個(gè)接口。
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)用程序時(shí),內(nèi)存泄露是一個(gè)常見的挑戰(zhàn),本文將探討如何對于一個(gè)陌生項(xiàng)目進(jìn)行內(nèi)存排查和優(yōu)化的方法,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Node.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-09Node.js如何實(shí)現(xiàn)注冊郵箱激活功能 (常見)
今天了解了node如何實(shí)現(xiàn)郵箱激活功能,這個(gè)功能非常常見,當(dāng)我們注冊一個(gè)賬號時(shí),肯定會有這步,下面看下如何實(shí)現(xiàn)這個(gè)功能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ù)器的步驟,這也是從前端邁向全棧的一個(gè)開始,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-01-01