😸

GitHub Actions で『しずかなインターネット』のバックアップを取る

2024/01/09に公開

しずかなインターネットのスポンサー限定機能の一つに、参照系APIを使えるというのがあるのですが、これを使って記事のバックアップを取るという話をします。
といっても特別なことをする必要はありません。

まず、空のリポジトリを新規に作って、ファイル一覧を Markdown として取得するスクリプトを書きます。

script/main.js
const fs = require("fs").promises

const ENDPOINT = "https://sizu.me/api/v1"
const SIZU_API_TOKEN = process.env["SIZU_API_TOKEN"]

async function main() {
    const posts = await fetch(`${ENDPOINT}/posts?perPage=100`, {
        headers: {
            "Authorization": `Bearer ${SIZU_API_TOKEN}`,
        },
    })
        .then((res) => res.json())
        .then((data) => data["posts"])

    const slugs = posts.map((post) => post["slug"])

    const contents = await Promise.all(slugs.map((slug) => fetch(`${ENDPOINT}/posts/${slug}`, {
        headers: {
            "Authorization": `Bearer ${SIZU_API_TOKEN}`,
        },
    })
        .then((res) => res.json())
    ))

    await Promise.all(contents.map((content) => {
        const markdown = `---\ntitle: ${content["post"]["title"]}\ndate: ${content["post"]["createdAt"]}\n---\n\n${content["post"]["bodyMarkdown"]}`
        fs.writeFile(`./${content["post"]["slug"]}.md`, markdown)
    }))
}

main()

しずかなインターネットで既に100記事以上書いているヘビーユーザーの場合、ページネーションに気をつける必要がありますが(さらに言えば Rate Limit にも気をつけた方がいいですが)、私はそこまでではないので考慮していません。

次に、リポジトリの Actions の設定をします。まず、Secrets に SIZU_API_TOKEN という名前で API キーを置きます。また、Actions のリポジトリへの Write 権限をつけておきます。

その上で、バックアップを取るワークフローを書きます。

.github/workflows/backup.yml
name: Backup

on:
  schedule:
    - cron: "0 0 * * *"
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x]

    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}

    - name: Get Dump
      run: node script/main.js
      env:
        SIZU_API_TOKEN: ${{ secrets.SIZU_API_TOKEN }}

    - name: Commit
      run: |
        git config user.name "github-actions[bot]"
        git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
        git add -A
        git diff --quiet && git diff --staged --quiet || git commit -m "update"
        git push

以上!

Discussion