mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

10_Hexo-GitHub Actions 自動刷新多吉雲 CDN 快取

前言#

之前一直透過 多吉雲控制台 手動刷新博客全站 CDN 快取,CDN 源站為 Vercel 部署的網址

空夢:全自動博客部署方案 這篇文章萌生了自動化的念頭,且這些 CDN 服務商都提供了相應的 API 文檔和代碼範例,開箱即用

倉庫示例:https://github.com/mycpen/blog/tree/main/.github

個人示例#

1. 新增 Workflow 文件#

以我為例,新增 source/.github/workflows/refresh-dogecloud.yml 文件,內容如下:

# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python

name: Refresh dogecloud CDN

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: szenius/set-timezone@v1.0 # 設置執行環境的時區
        with:
          timezoneLinux: "Asia/Shanghai"
      - name: Set up Python 3.10
        uses: actions/setup-python@v3
        with:
          python-version: "3.10"
      - name: Wait for 3 minutes
        run: sleep 180 # 等待 3 分鐘,單位為秒
      - name: Run refresh script
        env:
            ACCESS_KEY: ${{ secrets.ACCESS_KEY }}
            SECRET_KEY: ${{ secrets.SECRET_KEY }}
        run: |
          pip install requests
          python .github/refresh-dogecloud.py

2. 新增 PY 腳本:刷新快取#

以我為例,新增 source/.github/refresh-dogecloud.py 文件,內容如下:

腳本裡的 url_list 為需要刷新的目錄,需手動修改為自己的。代碼來自多吉雲 API 驗證刷新目錄任務

from hashlib import sha1
import hmac
import requests
import json
import urllib
import os

def dogecloud_api(api_path, data={}, json_mode=False):
    """
    調用多吉雲API

    :param api_path:    調用的 API 接口地址,包含 URL 請求參數 QueryString,例如:/console/vfetch/add.json?url=xxx&a=1&b=2
    :param data:        POST 的數據,字典,例如 {'a': 1, 'b': 2},傳遞此參數表示不是 GET 請求而是 POST 請求
    :param json_mode:   數據 data 是否以 JSON 格式請求,默認為 false 則使用表單形式(a=1&b=2)

    :type api_path: string
    :type data: dict
    :type json_mode bool

    :return dict: 返回的數據
    """

    # 這裡替換為你的多吉雲永久 AccessKey 和 SecretKey,可在用戶中心 - 密鑰管理中查看
    # 請勿在客戶端暴露 AccessKey 和 SecretKey,否則惡意用戶將獲得帳號完全控制權
    access_key = os.environ["ACCESS_KEY"]
    secret_key = os.environ["SECRET_KEY"]

    body = ''
    mime = ''
    if json_mode:
        body = json.dumps(data)
        mime = 'application/json'
    else:
        body = urllib.parse.urlencode(data) # Python 2 可以直接用 urllib.urlencode
        mime = 'application/x-www-form-urlencoded'
    sign_str = api_path + "\n" + body
    signed_data = hmac.new(secret_key.encode('utf-8'), sign_str.encode('utf-8'), sha1)
    sign = signed_data.digest().hex()
    authorization = 'TOKEN ' + access_key + ':' + sign
    response = requests.post('https://api.dogecloud.com' + api_path, data=body, headers = {
        'Authorization': authorization,
        'Content-Type': mime
    })
    return response.json()


url_list = [
    "https://cpen.top/",
]

api = dogecloud_api('/cdn/refresh/add.json', {
    'rtype': 'path',
    'urls': json.dumps(url_list)
})
if api['code'] == 200:
    print(api['data']['task_id'])
else:
    print("api failed: " + api['msg']) # 失敗

3. 新增 Secrets 變數#

Actions 新增 2 個 Secrets 變數,ACCESS_KEYSECRET_KEY,對應的值在 多吉雲 用戶中心 - 密鑰管理 中查看。link

image-20230502225346425

避免因權限問題導致工作流執行失敗,也可以設置下 Actions 讀寫權限

image-20230502225900571

4. 新增 JS 代碼:複製 .github#

前言:source/.github 這類。開頭的隱藏文件默認是不會被 hexo generate 渲染生成到 public 目錄下的。網上和 ChatGPT 給出的解決辦法大多試了(如 skip_render),沒有生效,打算直接用 JS 代碼將 source/.github 目錄複製到 public/.github 目錄下。以下代碼每次 hexo generate 之後能實現複製的效果

以我為例,新增 scripts/before_generate.js 文件,內容如下:

const fs = require('fs-extra');
const path = require('path');

function copyFolder(source, target) {
  // Create the target folder if it doesn't exist
  fs.ensureDirSync(target);

  // Get the list of files in the source folder
  const files = fs.readdirSync(source);

  // Loop through each file and copy it to the target folder
  files.forEach((file) => {
    const sourcePath = path.join(source, file);
    const targetPath = path.join(target, file);

    if (fs.statSync(sourcePath).isDirectory()) {
      // Recursively copy subfolders
      copyFolder(sourcePath, targetPath);
    } else {
      // Copy the file
      fs.copyFileSync(sourcePath, targetPath);
    }
  });
}

copyFolder('./source/.github', './public/.github');

5. 更新 _config.yml 配置#

當 hexo deploy 將渲染後的靜態倉庫推送到 Github 時,默認會取消推送。開頭的隱藏文件,具體如下:

image-20230502224949276

在 Hexo 配置文件 _config.yml 進行修改,新增 git 部署器 ignore_hidden 配置項,樣例如下:

# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
  - type: git
    repository: git@github.com:mycpen/blog.git
    branch: main
    commit: Site updated
    message: "{{ now('YYYY/MM/DD') }}"
+    ignore_hidden: false

參考鏈接#

  1. 多吉雲:API 驗證機制(Python)
  2. 多吉雲:SDK 文檔 - 刷新預熱
  3. ChatGPT(deploy.ignore_hidden、js 代碼 複製目錄、sleep)
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。