摘要:原文鏈接偶然看到通過語雀發(fā)布文章到靜態(tài)博客,很方便,實(shí)現(xiàn)過程也很有意思。我的配置接收推送此時在語雀發(fā)布文章,接口就會收到推送的文章信息。
原文鏈接:https://ssshooter.com/2019-01...
偶然看到通過語雀 webhook 發(fā)布文章到 Hexo 靜態(tài)博客,很方便,實(shí)現(xiàn)過程也很有意思。同樣的原理可以運(yùn)用到 Gatsby.js 博客上。
因?yàn)槭褂昧?netlify,自動部署的事情就不用自己擔(dān)心了,本文講述的有一下兩點(diǎn):
熟悉語雀 webhook
使用 GitHub api 更新 GitHub 倉庫(更新倉庫后 netlify 自動部署)
除了以上兩個重點(diǎn),整個流程是:
在語雀發(fā)布文章 -> 觸發(fā)語雀 webhook -> express(node.js)接收到文章推送 -> 請求信息中抽取文章內(nèi)容和必要信息 -> 調(diào)用 GitHub api 更新倉庫 -> netlify 自動部署 -> 文章在博客發(fā)布
語雀 webhook語雀webhook文檔 自帶完整指引,以下講講關(guān)鍵步驟。
在知識庫頁面配置訂閱地址 本地測試官方推薦使用 ngrok,ngrok 能讓你的本地服務(wù)暴露到外網(wǎng),方便測試。
我的配置:
express 接收 webhook 推送app.post("/yuque/webhook", function(req, res) { console.log(req.body.data) })
此時在語雀發(fā)布文章,接口就會收到推送的文章信息。
GitHub api 更新倉庫 原理使用 api 更新 GitHub 倉庫的方法可以參考:使用 Github API 更新倉庫
主要代碼var updateGitHubRes = function(blob, path) { var commitSha var commitTreeSha return getRef() .then(({ data }) => { commitSha = data.object.sha return getCommit(commitSha) }) .then(({ data }) => { commitTreeSha = data.tree.sha return createBlob(blob) }) .then(({ data }) => { var blobSha = data.sha return createTree(commitTreeSha, path, blobSha) }) .then(({ data }) => { var treeSha = data.sha return createCommit(commitSha, treeSha) }) .then(({ data }) => { var newCommitSha = data.sha return updataRef(newCommitSha) }) .catch(err => { console.log(err) }) } var getRef = function() { return axios.get(`/${owner}/${repo}/git/refs/heads/master`) } var getCommit = function(commitSha) { return axios.get(`/${owner}/${repo}/git/commits/${commitSha}`) } var createBlob = function(content) { return axios.post(`/${owner}/${repo}/git/blobs`, { content, encoding: "utf-8" }) } var createTree = function(base_tree, path, sha) { return axios.post(`/${owner}/${repo}/git/trees`, { base_tree, // commit tree 的 sha tree: [ { path, // 文件路徑 mode: "100644", // 類型,詳情看文檔 type: "blob", sha // 剛才生成的 blob 的 sha } ] }) } var createCommit = function( parentCommitSha, tree, message = ":memo: update post" ) { return axios.post(`/${owner}/${repo}/git/commits`, { message, parents: [parentCommitSha], tree }) } var updataRef = function(newCommitSha) { return axios.post(`/${owner}/${repo}/git/refs/heads/master`, { sha: newCommitSha, force: true }) }組合
把接受 webhook 請求的功能和 GitHub 更新流程組合起來,有如下代碼:
app.post("/yuque/webhook", function(req, res) { console.log("web hook") var postData = req.body.data if (!postData) { console.log("nothing append") return res.json({ msg: "nothing append" }) } var title = postData.title var date = postData.created_at var content = postData.body var tagsReg = new RegExp(/(?<=).*(?= )/) var removeTagsReg = new RegExp(/.* /) var pathReg = new RegExp(/(?<=).*(?= )/) var removePathReg = new RegExp(/.* /) var replaceBrReg = new RegExp(/
/g) var tags = content.match(tagsReg) content = content.replace(removeTagsReg, "") var postPath = content.match(pathReg) content = content.replace(removePathReg, "") content = content.replace(replaceBrReg, " ") tags = tags && tags[0] postPath = postPath && postPath[0] var tagsString = JSON.stringify(tags.split(",")) var contentHeader = `--- path: "${postPath}" date: "${date}" title: "${title}" tags: ${tagsString} --- ` updateGitHubRes( contentHeader + content, `src/pages/${date.substring(0, 10)}-${postPath.substring(1)}/index.md` ).then(({ data }) => { console.log("finish") return res.json({ msg: "finish" }) }) })
因?yàn)檎Z雀沒有 tag 之類的選項(xiàng),只能自己用特定標(biāo)記寫到文章里再在后端提取,并且添加信息頭部。內(nèi)容組合好調(diào)用更新 api 即可完成整個流程。
功能部署如果你自己有服務(wù)器,正常部署即可,若沒有,可以使用 Heroku。Heroku 可以為你提供免費(fèi)的程序部署服務(wù)。你可以先把上面寫好的功能上傳到 GitHub,然后從選擇從 GitHub 拉取倉庫。拉取倉庫后 Heroku 會自動運(yùn)行 npm start。
npm start 映射到 node index.js 就可以了。
值得注意的是,heroku 的端口是系統(tǒng)分配的,所以需要使用環(huán)境變量提供的端口:
const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Our app is running on port ${ PORT }`); });大功告成
在語雀發(fā)布文章即可在博客同時發(fā)布,這確實(shí)比手寫 md 再 push 發(fā)布只方便了一點(diǎn),但是更讓人期待的是語雀移動端的上線!那么之后就能直接在手機(jī)更新靜態(tài)博客了!不過有點(diǎn)地方還是想吐槽,語雀的 md 編輯器有時候會語法失效,而且不能直接看到 md 代碼,總覺得對格式有種不能完全控制源碼的束縛感。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101136.html
摘要:所以自己定值博客,或許可以讓自己堅持更新下去。配合上語雀的文章發(fā)布推送絕配,于是有了這么個功能專題。 可以前往我的博客閱讀:https://ssshooter.com/2019-02... 0 前言 本文并不是從 0 開始使用 gatsby.js 搭建博客,starter 使用的是 gatsby-starter-blog。使用 gatsby-starter-blog 可以大量節(jié)省項(xiàng)目搭...
摘要:原文地址靜態(tài)博客之前也有搭建過,不過使用一鍵生成的,其實(shí)當(dāng)時也有考慮過,不過這個框架搭建博客入門還是比較難的,前置知識點(diǎn)包括和。使用建立項(xiàng)目已經(jīng)自帶了不少插件,但在我的搭建過程中仍然有一些需要自己添加的。 原文地址:https://ssshooter.com/2018-12... 靜態(tài)博客之前也有搭建過,不過使用 Hexo 一鍵生成的,其實(shí)當(dāng)時也有考慮過 Gatsby,不過這個框架搭...
摘要:配置觸發(fā)方式一般會得到這么個語雀配置配置一個倉庫的可以選擇所有更新觸發(fā)或者主動觸發(fā),主動觸發(fā)的意思即發(fā)布需要勾選一個選項(xiàng)才會觸發(fā)。 Hexo + Github + 語雀 + yuque-hexo +travis-ci+severless 打造全自動持續(xù)集成個人博客,云端寫作,自動部署,完美體驗(yàn)~ 一、Hexo+Github 的痛點(diǎn) 1.為啥要用hexo+github? 作為一個程序猿,...
摘要:配置觸發(fā)方式一般會得到這么個語雀配置配置一個倉庫的可以選擇所有更新觸發(fā)或者主動觸發(fā),主動觸發(fā)的意思即發(fā)布需要勾選一個選項(xiàng)才會觸發(fā)。 Hexo + Github + 語雀 + yuque-hexo +travis-ci+severless 打造全自動持續(xù)集成個人博客,云端寫作,自動部署,完美體驗(yàn)~ 一、Hexo+Github 的痛點(diǎn) 1.為啥要用hexo+github? 作為一個程序猿,...
摘要:用和創(chuàng)建一個靜態(tài)博客翻譯和自己探索過程中的經(jīng)驗(yàn)總結(jié)原文參閱或本篇主要是對其精華內(nèi)容進(jìn)行翻譯以及實(shí)操過程中遇到的問題解決和探索一些具體的操作步驟和細(xì)節(jié)我將忽略結(jié)合原文一起閱讀效果更佳注本文操作環(huán)境是介紹這是一個包含很多靜態(tài)內(nèi)容頁面的站點(diǎn)從技術(shù) 用Gatsby和Strapi創(chuàng)建一個靜態(tài)博客(翻譯和自己探索過程中的經(jīng)驗(yàn)總結(jié)) 原文參閱: Building a static blog usin...
閱讀 3870·2021-09-29 09:34
閱讀 3787·2021-09-27 13:34
閱讀 580·2021-09-24 09:47
閱讀 3046·2019-08-30 15:53
閱讀 1823·2019-08-26 13:54
閱讀 2097·2019-08-26 13:43
閱讀 546·2019-08-23 14:47
閱讀 1754·2019-08-23 14:28