oldl

oldl

教程:雲端寫作搭建自動化個人博客,Hexo+語雀+騰訊雲函數。

原文發表在公眾號:音樂和啤酒
因轉載圖片可能顯示不全,可到原文查看。
https://mp.weixin.qq.com/s?__biz=MzI1NTg2NzQyOA==&mid=2247489178&idx=1&sn=a41a6400af3703ace1df85d34acf42fa&chksm=ea2e39d1dd59b0c76a9f4e38e8ce1345416515c8691fce04bd6e4790a6ee102faebf584bee42&mpshare=1&scene=1&srcid=1222PiZqOCbXJzVXNvqxSogq&sharer_sharetime=1640131461472&sharer_shareid=b206f2fa812b6ca26b027c2ef010574f#rd

如何利用hexo+語雀+serverless雲函數,實現自動發布博客 

花了幾天時間,翻遍了全網的所有相關資料,最後總結成這樣一篇算是教程吧,也是自己的記錄。通過本教程,你可以將你的文章儲存在雲端,實現雲端寫作(不限於 MAC 系統、Windows 系統、手機微信小程序),擺脫本地機器的限制。除此之外,優秀簡約的富文本編輯器能極大提升你的寫作效率,使你能更專注於文本的寫作。通過結合 github action(github 自動部署)、serverless 雲函數(騰訊雲 API,用於部署事件的觸發)、語雀(文檔的發布)、Hexo(博客系統)自動實現文章發布到博客展現的流程。

使用前的準備
為了更好、更方便的完成 hexo× 語雀的部署。在開始流程搭建的操作前,你需要一定的基礎,遇到問題可以自行百度,並按照以下步驟循序漸進吧。
賬號的申請與授權

 語雀賬號--  申請 
 serverless 方案一(本人使用):騰訊雲賬號登錄授權( https://console.cloud.tencent.com/scf/),雲函數授權後再進行 API 授權( https://console.cloud.tencent.com/apigateway/index)這樣才能正常使用雲函數功能 


 serverless 方案二:百度雲授權( https://console.bce.baidu.com/cfc/#/cfc/functions), 開通方法指南 
 方案三:使用 vercel 構建的 api。 


 獲取 github 私鑰,前往 github 的 token 設置( https://github.com/settings/tokens),點擊生成密鑰按鈕,填寫密鑰名稱,勾選 repo 選項。將生成的密鑰保存在桌面新建的 txt 文件裡備用。 



倉庫的準備
為了實現 hexo 的自動部署,需要將本地的源碼文件交與 github 托管,你可以創建私有倉庫(建議)也可以創建公有倉庫。首先在 github 上創建私有倉庫。

步驟一:
創建語雀倉庫
登錄語雀,點擊知識庫 👉 新建知識庫。將知識庫的可見範圍改為 “互聯網可見”。

舊文章的導入,或新建(必須有至少一篇文章)
點擊知識庫的管理按鈕,選擇新建下的導入,將博客中_post 文章進行批量導入。

模板的創建(可後續再建)
為了方便以後文檔的撰寫,可以新建模板。注意圖片鏈接需要加上’’防止被渲染成鏈接。

步驟二:安裝語雀插件進行本地調試
為了確保在雲端能夠正常生成博客,首先在本地進行調試。
語雀插件的安裝
首先在根目錄打開終端安裝 yuque-hexo。
POWERSHELL

   1 
   npm i -g yuque-hexo 
  
 

修改 package.json
在第一個對象代碼塊後增加”yuqueConfig” 代碼塊。
JSON

   {  "name": "hexo-site",  "version": "0.0.0",  "private": true,  "scripts": {    "build": "hexo generate",    "clean": "hexo clean",    "deploy": "hexo deploy",    "server": "hexo server"},  "yuqueConfig": {    "postPath": "source/_posts/yuque",    "cachePath": "yuque.json",    "mdNameFormat": "slug",    "adapter": "markdown",    "concurrency": 5,    "baseUrl": "https://www.yuque.com/api/v2",    "login": "你的語雀用戶名",    "repo": "你的語雀知識庫名",    "token": "******此處修改為你的語雀TOKEN*******",    "onlyPublished": true,    "onlyPublic": true  }, 
  
 

其中需要修改”login”、”repo”、”token” 字段。

 點擊進入博客的知識庫,在瀏覽器地址欄中將用戶名和倉庫名複製分別粘貼為”login”、”repo” 的字段。 



 語雀的token 是在右上角頭像 -> 賬戶設置 -> Token 添加的,權限的話只給讀取就可以。複製粘貼獲取的”token” 字段。 

修改  “scripts” 增加”sync”: “yuque-hexo sync” 和  “clean”: “yuque-hexo clean”。
JSON

   {  "name": "hexo-site",  "version": "0.0.0",  "private": true,  "scripts": {    "build": "hexo generate",    "clean": "hexo clean",    "deploy": "hexo deploy",    "server": "hexo server",    "sync": "yuque-hexo sync",    "clean:yuque": "yuque-hexo clean"  },  "yuqueConfig": {    "postPath": "source/_posts",    "cachePath": "yuque.json",    "mdNameFormat": "slug",    "adapter": "markdown",    "concurrency": 5,    "baseUrl": "https://www.yuque.com/api/v2",    "login": "用戶名",    "repo": "知識庫名",    "token": "********TOKEN***************",    "onlyPublished": true,    "onlyPublic": true  },  "hexo": {    "version": "5.2.0"  },  "dependencies": {    "yuque-hexo": "^1.6.0",    "gulp": "^4.0.2",    "gulp-base64": "^0.1.3",    "gulp-htmlmin": "^5.0.1",    "gulp-tobase64": "^1.1.2",    "hexo": "^5.0.0",    "hexo-abbrlink": "^2.2.1",    "hexo-deployer-git": "^2.1.0",    "hexo-generator-archive": "^1.0.0",    "hexo-generator-baidu-sitemap": "^0.1.9",    "hexo-generator-category": "^1.0.0",    "hexo-generator-feed": "^3.0.0",    "hexo-generator-index-pin-top": "^0.2.2",    "hexo-generator-sitemap": "^2.1.0",    "hexo-generator-tag": "^1.0.0",    "hexo-helper-live2d": "^3.1.1",    "hexo-offline-popup": "^1.0.3",    "hexo-renderer-ejs": "^1.0.0",    "hexo-renderer-marked": "^3.0.0",    "hexo-renderer-pug": "^1.0.0",    "hexo-renderer-stylus": "^1.1.0",    "hexo-server": "^1.0.0",    "hexo-tag-aplayer": "^3.0.4",    "hexo-wordcount": "^6.0.1",    "live2d-widget-model-unitychan": "^1.0.5",    "workbox-build": "^5.1.4"  },  "devDependencies": {    "@babel/core": "^7.12.3",    "@babel/preset-env": "^7.12.1",    "del": "^6.0.0",    "gulp": "^4.0.2",    "gulp-babel": "^8.0.0",    "gulp-clean-css": "^4.3.0",    "gulp-cli": "^2.3.0",    "gulp-html-css-js-base64": "^0.0.4",    "gulp-htmlclean": "^2.7.22",    "gulp-htmlmin": "^5.0.1",    "gulp-imagemin": "^7.1.0",    "gulp-imgs-base64": "^1.0.2",    "gulp-minify-inline-json": "^1.3.4",    "gulp-uglify": "^3.0.2",    "gulp-uglify-es": "^2.0.0"  }} 
  
 

進行本地調試
添加完成後保存,在執行命令前,請先備份自己的_post 文件夾,因為語雀的下載操作會覆蓋原有的_post 文件夾。在終端中輸入‘yuque-hexo sync’就會把語雀的文章給下載下來。然後通過‘hexo g&hexo s’進行調試。ps:輸入‘yuque-hexo clean’就會清除_post 下的所有文章。如果存在外掛標籤,請確保外掛標籤格式的書寫規範,否則容易報錯。

步驟三:配置 github action
刪除主題版本的控制文件
因為在倉庫裡面再放一個倉庫是沒法把裡面那個倉庫 push 到 github 的,只會傳一個空文件夾,會導致後期博客成了空白頁面,需要把 git clone 的 hexo 主題裡的 .git 文件夾給刪掉。
這裡只列出了最簡單的方法,另外你也可以嘗 fork 創建自己主題的方法,這裡暫時不予以介紹。

  • 修改 hexo 主題文件中的 meta
    以 butterfly 主題為例,打開主題文件的 /themes/butterfly/layout/includes/head.pug。在 meta (name=”theme-color” content=themeColor) 後方添加 meta (name=”referrer” content=”no-referrer”)。該步驟是確保語雀中的圖片可以正常加載。
    YAML

    1
    meta(name="theme-color" content=themeColor)meta(name="referrer" content="no-referrer")

修改 hexo 的_config,yml
前往博客的根目錄,修改 hexo 的_config,yml 中關於 develop 的配置。
POWERSHELL

   1 
   # Deployment## Docs: https://hexo.io/docs/deployment.htmldeploy:  type: git  repository:   github: https://用戶名:保存在txt中的密鑰@github.com/用戶名/倉庫名.git  branch: master注意這個坑,倉庫名字是.Github.io 
  
 

這裡只列出一種簡單的方案,其他的有時間再介紹。
創建 github action 腳本
在博客根目錄下新建 .github 文件夾(點不要漏掉了),在該文件夾下新建 workflows 文件夾。

在 workflows 文件夾下新建 autodeploy.yml。並填入以下代碼。將【更新 語雀拉取緩存及文章】與【部署】 user.name 和 user.email 後面的 “” 信息修改為自己的信息,注意對齊。
YAML

   1 
   name: 自動部署# 當有改動推送和語雀發布時,啟動Actionon: [push, repository_dispatch]jobs:  deploy:    runs-on: ubuntu-latest    steps:      - name: 檢查分支        uses: actions/checkout@v2        with:          ref: master      #2020年10月後github新建倉庫默認分支改為main,注意更改      #但私有倉庫貌似還是master並沒有變      - name: 安裝 Node        uses: actions/setup-node@v1        with:          node-version: "12.x"      - name: 安裝 Hexo        run: |          export TZ='Asia/Shanghai'          npm install hexo-cli -g          #npm install gulp-cli -g          #如果你有使用gulp的話,打開上面這一行          npm install yuque-hexo -g          yuque-hexo clean          yuque-hexo sync      - name: 更新 語雀拉取緩存及文章 #更新yuque 拉取的文章到GitHub倉庫        run: |          echo `date +"%Y-%m-%d %H:%M:%S"` begin > time.log          git config --global user.email "¥@.com"          git config --global user.name "¥¥¥"          git add .          git commit -m "Refresh yuque json" -a      - name: 推送 語雀拉取緩存及文章 #推送修改後的yuque json        uses: ad-m/github-push-action@master        with:          github_token: ${{ secrets.GITHUB_TOKEN }}      - name: 緩存 Hexo        uses: actions/cache@v1        id: cache        with:          path: node_modules          key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}}      - name: 安裝依賴        if: steps.cache.outputs.cache-hit != 'true'        run: |          npm install --save      - name: 生成靜態文件        run: |          hexo clean          hexo g          #gulp          #如果你有使用gulp的話,打開上面這一行      - name: 部署        run: |          git config --global user.name "¥¥"          git config --global user.email "¥¥¥@.com"          hexo deploy 
  
 

上傳博客源碼
打開終端輸入以下命令,上傳你的博客源碼到私有源碼倉庫。
POWERSHELL

   git initgit add .git commit -m "first commit"git remote add origin https://github.com/你的用戶名/你的私有博客源碼倉庫名.gitgit push -u origin master 
  
 

進行雲端調試
上傳後你會發現 github action 生效。等待幾分鐘後,如果打勾,就說明部署成功。如果未打勾請檢查出錯的步驟。

time.log 文件最近似乎不會自動生成,所有如果 action 不成功,請手動在倉庫裡新建 time.log
步驟四:配置雲函數
vercel 方案(推薦)
為了方便大家調用,我用 python 寫了一個 api。比較蛋疼的是,在倉庫裡填寫 github 的私鑰 github 會自動刪除私鑰。所以我試了好久都沒成功。因此,我直接將 api 設置成了參數傳遞型的,供大家調用.api 地址:https://yuque-vercel-webhook-api.vercel.app/api?。當然你也可以 fork 項目在 vercel 中自行搭建,將‘ https://yuque-vercel-webhook-api.vercel.app’更換為你的 app 應用鏈接。你需要傳遞的參數有 token,user,source。
CODE

   https://yuque-vercel-webhook-api.vercel.app/api?token='{填寫你的github私鑰}'&user='{填寫你的github用戶名}'&source='{填寫你的github倉庫地址}'示例:https://yuque-vercel-webhook-api.vercel.app/api?token='8888888888'&user='Zfour'&source='my-blog-source-file'將這個URL路徑作為觸發鏈接,在語雀中進行配置。 
  
 

修改觸發鏈接裡的參數項,訪問這個鏈接,如果出現‘This’s OK!’說明配置成功。複製 URL 路徑作為觸發鏈接,在語雀中進行配置。
百度雲方案(推薦)
新建一個雲函數
登錄後,點擊創建函數。

選擇空白函數後,超時設置 10s,運行時選擇 python2.7。點擊下一步。
選擇 HTTP 觸發器,URL 路徑填’/‘,HTTP 方法填寫 POST 和 GET,然後點擊提交。
點擊函數,選擇函數列表,將以下代碼粘貼並保存,將用戶名,倉庫地址改為自己的信息。將保存的私鑰進行替換 ****,token 字段需要保留。測試代碼,當返回”This’s OK!”  且 github action 開始運行則說明成功。

PYTHON

   # -*- coding: utf8 -*-import requestsdef handler(event, context):    r = requests.post("https://api.github.com/repos/用戶名/源碼倉庫/dispatches",    json = {"event_type": "run-it"},    headers = {"User-Agent":'curl/7.52.1',              'Content-Type': 'application/json',              'Accept': 'application/vnd.github.everest-preview+json',              'Authorization': 'token ****GITHUB的*******'})    if r.status_code == 204:        return "This's OK!"    else:        return r.status_code 
  
 

複製 URL 路徑作為觸發鏈接,在語雀中進行配置。
騰訊雲方案(有使用期限)
新建一個雲函數
騰訊雲方案目前有 1 年的使用期限,目前在嘗試阿里雲方案和 vercel 方案。
登錄後,點擊新建按鈕。這個雲函數有兩個,一個是 severless 還有一個靜態托管裡的。不要靜態托管裡的啊。

填寫基本信息。選擇運行環境為 python2.7, 以空白方式創建。

填寫以下腳本。將用戶名,倉庫地址改為自己的信息。將保存的私鑰進行替換 ****,token 字段需要保留。

PYTHON

   # -*- coding: utf8 -*-import requestsdef main_handler(event, context):    r = requests.post("https://api.github.com/repos/%%/%%/dispatches",    json = {"event_type": "run-it"},    headers = {"User-Agent":'curl/7.52.1',              'Content-Type': 'application/json',              'Accept': 'application/vnd.github.everest-preview+json',              'Authorization': 'token ******看上圖********'})    if r.status_code == 204:        return "This's OK!"    else:        return r.status_code 
  
 

點擊保存並測試,如果返回”This’s OK!”  且 github action 開始運行則說明成功。
新建一個觸發條件
點擊觸發管理,新建觸發器。點擊提交後複製訪問路徑。

記錄這個訪問路徑。

步驟五:配置語雀的 webhook
設定觸發規則
在知識庫中選擇設置。

設定觸發規則,名字隨便起。URL 就是上面記下的那個雲函數的地址。粘貼在雲函數處獲取的訪問路徑(騰訊雲)或 URL 鏈接(百度雲)。

設置完畢後,你可以嘗試發布一篇文章進行測試。如果 github action 開始執行則說明配置成功。
雖然現在可以很方便的使用語雀同步,自動部署發布文章,但是中間整個的過程實在太複雜,麻煩繁瑣,坑太多了。建議缺乏動手能力的還是不要嘗試了。老老實實的吧。
內容借鑒了很多前任的經驗,但是仍有很多不如意的地方,有什麼疑問可以在這裡留言。由於文章不是在公眾號編輯的,格式上如有錯誤,可以查看我的網站原文。僅供參考。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。