😸
GitHub Actions で『しずかなインターネット』のバックアップを取る
しずかなインターネットのスポンサー限定機能の一つに、参照系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