原文链接:https://ssshooter.com/2019-01...

偶然看到通过语雀 webhook 发布文章到 Hexo 静态博客,很方便,实现过程也很有意思。同样的原理可以运用到 Gatsby.js 博客上。

因为使用了 netlify,自动部署的事情就不用自己担心了,本文讲述的有一下两点:

  1. 熟悉语雀 webhook
  2. 使用 GitHub api 更新 GitHub 仓库(更新仓库后 netlify 自动部署)

除了以上两个重点,整个流程是:

在语雀发布文章 -> 触发语雀 webhook -> express(node.js)接收到文章推送 -> 请求信息中抽取文章内容和必要信息 -> 调用 GitHub api 更新仓库 -> netlify 自动部署 -> 文章在博客发布

语雀 webhook

语雀webhook文档 自带完整指引,以下讲讲关键步骤。

在知识库页面配置订阅地址

本地测试

官方推荐使用 ngrok,ngrok 能让你的本地服务暴露到外网,方便测试。

我的配置:

express 接收 webhook 推送

app.post('/yuque/webhook', function(req, res) {console.log(req.body.data)
})

此时在语雀发布文章,接口就会收到推送的文章信息。

GitHub api 更新仓库

原理

使用 api 更新 GitHub 仓库的方法可以参考:使用 Github API 更新仓库

主要代码

var updateGitHubRes = function(blob, path) {var commitShavar commitTreeShareturn getRef().then(({ data }) => {commitSha = data.object.shareturn getCommit(commitSha)}).then(({ data }) => {commitTreeSha = data.tree.shareturn createBlob(blob)}).then(({ data }) => {var blobSha = data.shareturn createTree(commitTreeSha, path, blobSha)}).then(({ data }) => {var treeSha = data.shareturn createCommit(commitSha, treeSha)}).then(({ data }) => {var newCommitSha = data.shareturn 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 的 shatree: [{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.dataif (!postData) {console.log('nothing append')return res.json({msg: 'nothing append'})}var title = postData.titlevar date = postData.created_atvar content = postData.bodyvar tagsReg = new RegExp(/(?<=<tags>).*(?=<\/tags>)/)var removeTagsReg = new RegExp(/<tags>.*<\/tags>/)var pathReg = new RegExp(/(?<=<path>).*(?=<\/path>)/)var removePathReg = new RegExp(/<path>.*<\/path>/)var replaceBrReg = new RegExp(/<br \/>/g)var tags = content.match(tagsReg)content = content.replace(removeTagsReg, '')var postPath = content.match(pathReg)content = content.replace(removePathReg, '')content = content.replace(replaceBrReg, '\n')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'})})
})

因为语雀没有 tag 之类的选项,只能自己用特定标记写到文章里再在后端提取,并且添加信息头部。内容组合好调用更新 api 即可完成整个流程。

功能部署

如果你自己有服务器,正常部署即可,若没有,可以使用 Heroku。Heroku 可以为你提供免费的程序部署服务。你可以先把上面写好的功能上传到 GitHub,然后从选择从 GitHub 拉取仓库。拉取仓库后 Heroku 会自动运行 npm start

npm start 映射到 node index.js 就可以了。

值得注意的是,heroku 的端口是系统分配的,所以需要使用环境变量提供的端口:

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Our app is running on port ${ PORT }`);
});

大功告成

在语雀发布文章即可在博客同时发布,这确实比手写 md 再 push 发布只方便了一点,但是更让人期待的是语雀移动端的上线!那么之后就能直接在手机更新静态博客了!不过有点地方还是想吐槽,语雀的 md 编辑器有时候会语法失效,而且不能直接看到 md 代码,总觉得对格式有种不能完全控制源码的束缚感。

使用 Gatsby.js 搭建静态博客 EX 使用语雀发布到博客相关推荐

  1. 使用 Gatsby.js 搭建静态博客 2 实现分页

    原文地址:https://ssshooter.com/2018-12... 使用 Gatsby.js 搭建静态博客 1 关键文件 <- 本文将会介绍如何为初始项目添加分页功能. 理解页面创建原理 ...

  2. 开源 静态 文件 服务器,Node.js搭建静态服务器

    写在开头,本文是node.js最最初级的搭建静态服务器,比较适合新手入门,大神请绕道哦- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用 ...

  3. 语雀导出html,博客搭建

    前言 语雀 是一款非常好用的知识管理网站(类似 GitBook),它的编辑器非常好用,而且支持导出 Markdown,这篇文章是教你如何使用语雀的编辑器写静态博客.这里的静态博客用了 Hexo,Jek ...

  4. 服务器静态页面分享微信,JS中静态页面如何实现微信分享功能

    JS中静态页面如何实现微信分享功能 发布时间:2021-07-06 11:09:02 来源:亿速云 阅读:65 作者:小新 这篇文章主要介绍了JS中静态页面如何实现微信分享功能,具有一定借鉴价值,感兴 ...

  5. vuepress侧边栏配置_VuePress搭建静态博客网站

    VuePress是什么 仅从单词上来看就是vue和press,press除了按压的意思外,还有报刊杂志和出版社等意思,所以可以理解为由vue驱动的出版工具.换个说法就是静态博客编写工具.后六字应该都不 ...

  6. 使用 Hexo + Next 搭建静态博客

    欢迎移步我的博客阅读:<使用 Hexo + Next 搭建静态博客> 前言 Github 为广大开发者提供了一个非常好的平台,不仅是代码的开源,同时Github还提供了开发者可以在 Git ...

  7. 使用vuepress搭建静态博客

    什么是vuePress vuePress是以vue驱动的主题系统的简约静态网站生成工具(拥有自己的默认主题). veuPress由vue,vue-router,webpack驱动的单页面应用,每个ma ...

  8. Hexo+Kaze+Gitee Pages 搭建静态博客网站

    前言 建网站本身是一个很大的工程,涉及前端页面的搭建,网站数据的存储,还要购置服务器资源,甚至是后期的维护,过程相当繁琐. 不过如果仅仅是想搭建个人的网站,写写博客,想要美观,又不想操心太多和写博客无 ...

  9. [Hexo]Hexo+github搭建静态博客

    1.简介 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章(经常玩CSDN上的人都知道),在几秒内,即可利用靓丽的主题生成静态网页.通过Hexo我 ...

最新文章

  1. golang 函数定义
  2. Network simulation using OPNET
  3. MySQL学习笔记_10_MySQL高级操作(下)
  4. iOS - Swift Foundation 框架
  5. CDN和CDN加速原理
  6. python 插入数据库 b“Incorrect syntax near ‘,‘.DB-Lib error message 20018
  7. 【Android 】【Monkey Demons】 针对性的进行稳定性测试
  8. 异步两周年庆/豪送20本图书,1000种图书任你选
  9. 利用selenium自动刷新网页
  10. DeepFace人脸检测(python实现)
  11. 微信公众平台版面设计需要服务器,公众号版面设计,微信公众号中排版怎么弄...
  12. 车牌识别EasyPR--开发详解
  13. JDKbin目录下的众多exe文件的用途
  14. abp viewmodel的写法
  15. 关于mysql中5位数字转化为日期格式的问题
  16. LayUI treetable树形表格的实现, 数据格式正确,不显示的解决方案 和在这个过程中遇到的坑~ 认真看 你会得到一些想要的答案。
  17. asp下用OracleInProcServer完成对Oracle的连接和操作
  18. 图片 EXIF 信息中旋转参数 Orientation 的理解
  19. 【VMware】ubuntu运行VMware kernel module updater
  20. 计算机网络概述 网络的体系与标准化组织

热门文章

  1. python笔记3(numpy数组)
  2. java搭载服务_Java入门及环境搭载
  3. git 下载 github 上的代码
  4. python configparser 参数 用法
  5. 报错解决:error: this statement may fall through [-Werror=implicit-fallthrough=]
  6. jd-gui的下载和使用
  7. 织梦直接写php标签,非常实用的织梦dede所有标签调用方法大全 .
  8. 好奇怪呀后面加什么标点_加标点
  9. 【java 性能优化实战】1 理论分析:性能优化,有哪些衡量指标、性能优化的技术手段
  10. Maven 新版本 3.8.1 打包报错 maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories