nodejs抓取notion?emoji?svg資源的腳本示例
前言
最近在做emoji表情,在windows環(huán)境預(yù)覽效果不太理想,也缺少很多字體圖標(biāo)的顯示,為了讓各種環(huán)境顯示一致,決定用svg圖片代替字體圖標(biāo)。讓設(shè)計去搞這些資源,有一千多個圖標(biāo),比較費力。于是決定自己寫個腳本去抓這些資源。notion有這些資源,開始去抓。
調(diào)研準(zhǔn)備工作
之前在做emoji的時候,有Unicode Id,notion中的資源名稱也是用Unicode id做文件名。根據(jù)id關(guān)聯(lián),我們就可以直接開始了。
emoji.json 文件
{
"id": "u1f600",
"name": "嘿嘿",
"font": "??",
"keyword": "??^嘿嘿^笑^^嘿嘿|(zhì)笑臉|臉"
}
....
node腳本準(zhǔn)備
俗話說,工欲善其事必先利其器,在寫腳本之前,我們先搞幾個操作文件的工具方法,服務(wù)于正式腳本的使用。
// 讀文件
const readFile = async (path) => {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (err, data) => {
if (err) {
console.log(err);
reject(err);
return;
}
resolve(data);
})
})
}
// 寫文件
const writeFile = async (path, data) => {
return new Promise((resolve, reject) => {
fs.writeFile(path, data, { flag: 'w' }, (err) => {
if (err) {
console.log(err);
reject(err);
return;
}
resolve(true);
})
})
}
/**
* 獲取網(wǎng)絡(luò)文件到本地
* @param {*} webUrl
* @param {*} path
*/
const downloadHttpFile = async (webUrl, folderPath) => {
return new Promise((resolve, reject) => {
const fileName = path.basename(webUrl);
let stream = fs.createWriteStream(path.join(folderPath, fileName));
request(webUrl).pipe(stream).on("close", function (err) {
if (err) {
console.log(err);
reject(err);
return;
}
resolve(true)
console.log("文件[" + fileName + "]下載完畢");
});
})
}
正式腳本
- 定義路徑變量
// emoji 路徑 const emojiPath = path.join(__dirname, '../assets/emoji.json'); // notion 路徑 const emojiSvgBase = 'https://notion-emojis.s3-us-west-2.amazonaws.com/prod/svg-twitter'; // 1f604.svg // svg圖片下載文件夾 const downloadFolder = path.join(__dirname, 'images');
- 讀取文件抓取,寫文件
// 獲取文件并下載
const getEmojiSvgFile = async (id) => {
const fileName = id + '.svg';
const webUrl = `${emojiSvgBase}/${fileName}`;
const exist = fs.existsSync(downloadFolder);
if (!exist) {
fs.mkdirSync(downloadFolder);
}
return await downloadHttpFile(webUrl, downloadFolder);
}
// 從notion抓取所有的圖片
const grabImages = async () => {
const data = await readFile(emojiPath)
const emojiJson = JSON.parse(data.toString());
for (const first of emojiJson) {
for (const second of first.children) {
const id = handleUnicodeId(second.id);
// 串行抓取
await getEmojiSvgFile(id)
}
}
}
// 開始抓取
grabImages();
- 設(shè)置啟動命令 在package.json中添加命令
"scripts": {
"grab": "node ./src/index.js"
},
4.運行命令
npm run grab

大家看上邊的腳本,可以發(fā)現(xiàn)我們用了asyc和await, 串行去下載資源。有興趣的小伙伴可以嘗試改下,看看怎么改成并行去下載資源,還可以控制并發(fā)的數(shù)量,面試中經(jīng)常會問到。
結(jié)語
代碼已上傳github,有需要可自行查看
以上就是nodejs抓取notion emoji svg資源的腳本示例的詳細(xì)內(nèi)容,更多關(guān)于nodejs腳本notion emoji svg的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nodejs實現(xiàn)百度輿情接口應(yīng)用示例
這篇文章主要介紹了nodejs實現(xiàn)百度輿情接口應(yīng)用,結(jié)合實例形式分析了node.js調(diào)用百度輿情接口的具體使用技巧,需要的朋友可以參考下2020-02-02
nodejs 整合kindEditor實現(xiàn)圖片上傳
這篇文章主要介紹了nodejs 整合kindEditor實現(xiàn)圖片上傳,需要的朋友可以參考下2015-02-02
npm dose not support Node.js v10.15
這篇文章主要給大家介紹了關(guān)npm dose not support Node.js v10.15.3的解決方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11
NodeJS?基于?Dapr?構(gòu)建云原生微服務(wù)應(yīng)用快速入門教程
Dapr?是一個可移植的、事件驅(qū)動的運行時,它使任何開發(fā)人員能夠輕松構(gòu)建出彈性的、無狀態(tài)和有狀態(tài)的應(yīng)用程序,并可運行在云平臺或邊緣計算中,它同時也支持多種編程語言和開發(fā)框架,本文重點介紹NodeJS云原生微服務(wù)應(yīng)用,感興趣的朋友一起看看吧2022-07-07
Nodejs實戰(zhàn)心得之eventproxy模塊控制并發(fā)
本篇文章給大家分享我的nodejs實戰(zhàn)心得,如何使用eventproxy模塊控制并發(fā),感興趣的朋友可以參考下2015-10-10

