GitHub GistをRSS/API代わりにサイトを自動更新する
背景
- サイトに「最近の活動」としてアプリのリリース情報やブログへの投稿などのリストを載せたい
- サイト本体のデータと切り離して編集・更新したい
- CMSのようなシステムを要しない軽い内容
- 更新するデータはjsonのようなデータがいい
goal
Gist に jsonファイルを作成して、サイト側で fetch して取得、表示する
実際にGistから取得した内容を表示しているのが https://chocolat5.com/ のLatest Activity の部分です。
前提
- GitHubアカウント
- React
手順
1. Gistを作成
拡張子を .json として以下のようなファイルを作成する(secretでもOK)。
[
{
"title": "Post Title",
"url": "https://sample.com/post-url",
"date": "2025-08",
"type": "Post"
}
]
2. Gistの取得
表示したいコンポーネントで fetch() によりGistのデータを取得する。
# Gist の取得
const [latest, setLatest] = useState<Latest[]>([]);
useEffect(() => {
async function startFetching() {
const result = await fetch(<ここにGistのURL>, { cache: "no-store" }).then(
(res) => res.json()
);
if (!ignore) {
setLatest(result);
}
}
let ignore = false;
startFetching();
return () => {
ignore = true;
};
}, []);
GistのURLは作成したGistファイルを開き、 [RAW] をクリックして表示されたURLからrevision hashを取り除いたものを使用。
https://gist.githubusercontent.com/<your_github_id>/<gist_id>/raw/<gist_version>/latest.json
↓
https://gist.githubusercontent.com/<your_github_id>/<gist_id>/raw/latest.json
3. 取得したデータの表示
取得したjsonデータを表示するコンポーネントを作成
# 表示
return (
{latest.map((item) => {
<div key={item.title}>
<a href={item.url} target="_blank">
{item.title} {item.date} {item.type}
</a>
</div>
})
);
コンポーネントの作成が終わったら試しにGistにデータを追加して保存します。
問題なければページを更新すると追加したデータも含めて表示されます。
おまけ
APIやRSSがあればGistの更新自体も自動化できるのではと思い、Claude Codeに聞きながらGitHub Actionsを作成しました。
1. PAT(Personal Access Token)を発行
https://github.com/settings/tokens で gist を対象としたPATを発行する。
Tokenをコピーしておく。
2. Tokenを追加
GitHub Actionsを設定するリポジトリへ移動。Settings > Secrets and variables > Actions と移動。New repository secretをクリックして、以下2点を追加する。
| Name | Secret |
|---|---|
| GIST_ID | GistURL内のid |
| GIST_TOKEN | 1で作成したtoken |
3. GitHub Actions の workflowを作成
リポジトリで .github/workflows/ フォルダを作成して yml ファイルを作成する。
ymlの例
name: Update Latest Feed
on:
schedule:
- cron: "0 */6 * * *" # 6時間ごとに実行
workflow_dispatch: # 手動実行も可能
jobs:
update-gist:
runs-on: ubuntu-latest
steps:
- name: Fetch and Update Latest
env:
# 2. で追加したTokenを指定
GIST_ID: ${{ secrets.GIST_ID }}
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
run: |
# 現在のGistを取得
CURRENT=$(curl -s -H "Authorization: token $GIST_TOKEN" \
"https://api.github.com/gists/$GIST_ID")
echo "$CURRENT" | jq -r '.files["latest.json"].content' > current.json
# 最新の投稿をZennから取得(最新の1つだけ)
LATEST_ZENN=$(curl -s "https://zenn.dev/api/articles?username=<YOUR_ZENN_ID>&order=latest" \
| jq -r '.articles[0] | {title: .title, url: ("https://zenn.dev" + .path), date: (.published_at[:7]), type: "post"}')
# すでに取得済みかチェック
ARTICLE_URL=$(echo "$LATEST_ZENN" | jq -r '.url')
EXISTS=$(cat current.json | jq --arg url "$ARTICLE_URL" 'any(.[]; .url == $url)')
if [ "$EXISTS" = "false" ]; then
# Gistにまだない場合は取得した記事を追加する
echo "$LATEST_ZENN" | jq -s ". + $(cat current.json)" > latest.json
else
# Gistに存在する場合は既存のデータを維持
cp current.json latest.json
fi
# Gistを更新
CONTENT=$(cat latest.json | jq -Rs .)
curl -X PATCH \
-H "Authorization: token $GIST_TOKEN" \
-H "Content-Type: application/json" \
"https://api.github.com/gists/$GIST_ID" \
-d "{\"files\":{\"latest.json\":{\"content\":$CONTENT}}}"
4. workflowのテスト
リポジトリにpushしてブラウザでActionsタブへ移動。サイドバーにymlファイルに記載した名前「Update Latest Feed」が表示されるのでクリック。 [Run workflow]で実行してグリーンのチェックマークが付けばworkflowの設定完了。
手動でも実行できるので、Zennで記事を投稿したら [Run workflow] で、Actions実行 → Gistアップデート → サイトに反映という流れを確認できます。
※ 記事内の <gist_id> など < ... > となっている部分はサンプルです。実際に使うときはご自身のURLやIDに置き換えてください。
まとめ
サイト本体のデータを触らずに部分的に気軽に編集・更新できるようになりました。
Claude Codeのおかげで触ったことのなかったGitHub Actionsを活用して更新の一部自動化にも成功。
Discussion