🤖

Nostr のプロフィールを GitHub リポジトリで管理する

2024/03/30に公開

概要

Nostr で BOT を作る際にプロフィール (kind 0) の管理をどうするか悩む方も多いかと思いますが GitHub リポジトリを使ってバージョン管理しておくと手軽に更新ができて便利です。

プロフィール JSON

まずはプロフィール用の JSON (kind 0 content の中身)を用意してコミットします。
後で JSON に変換すれば良いので YAML やその他のフォーマットでも構いません。

metadata.json
{
    "name": "<name>",
    "about": "<description>",
    "picture": "<url>",
    "nip05": "<local-name@domain>",
    "bot": true
}

イベントへ変換して送信

kind 0 イベントに変換して各リレーへ送信するワークフローです。
各項目の説明は後述します。

初回は手動で実行してあげてください。
次回以降は metadata.json が更新される度に実行されます。
paths.github/workflows/metadata.yml を足しても良いのですがバージョンの更新でも走ってしまうので除外してあります)

.github/workflows/metadata.yml
name: Metadata

on:
  push:
    branches:
      - main
    paths:
      - metadata.json
  workflow_dispatch:

permissions: {}

jobs:
  run:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v4
      - id: metadata
        run: |
          json=$(cat metadata.json | jq -c)
          echo "json=${json}" >> "$GITHUB_OUTPUT"
      - uses: snow-actions/nostr@v1.7.0
        with:
          kind: 0
          content: ${{ steps.metadata.outputs.json }}
          relays: |
            wss://relay1.example.com/
            wss://relay2.example.com/
          private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}

トリガー

main ブランチで metadata.json が更新された際にワークフローを実行します。
workflow_dispatch で手動でも実行できるようにしておきます。

on:
  push:
    branches:
      - main
    paths:
      - metadata.json
  workflow_dispatch:

metadata.json の読み込み

metadata.json を読み込んでステップの出力パラメーターに設定します。

JSON 以外のフォーマットを使用している場合はここで JSON に変換してあげてください。

- uses: actions/checkout@v4
- id: metadata
  run: |
    json=$(cat metadata.json | jq -c)
    echo "json=${json}" >> "$GITHUB_OUTPUT"

イベントへ変換して送信

snow-actions/nostr を使ってイベントへ変換して送信します。
Secrets に NOSTR_PRIVATE_KEY として BOT の秘密鍵を保存しておきます。

- uses: snow-actions/nostr@v1.7.0
  with:
    kind: 0
    content: ${{ steps.metadata.outputs.json }}
    relays: |
      wss://relay1.example.com/
      wss://relay2.example.com/
    private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}
リレーもバージョン管理する場合

リレーのリストも Git 管理したい場合は JSON でコミットしておきます。

relays.json
[
  "wss://relay.nostr.band",
  "wss://relay.damus.io",
  "wss://nos.lol",
  "wss://relay.nostr.wirednet.jp",
  "wss://nostr-relay.nokotaro.com"
]

JSON から読み込み。

- id: relays
  run: |
    echo "data<<EOF" >> "$GITHUB_OUTPUT"
    cat relays.json | jq -c -r '.[]' >> "$GITHUB_OUTPUT"
    echo "EOF" >> "$GITHUB_OUTPUT"

読み込んだ JSON を使用。

 - uses: snow-actions/nostr@v1.7.0
   with:
     kind: 0
     content: ${{ steps.metadata.outputs.json }}
-    relays: |
-      wss://relay1.example.com/
-      wss://relay2.example.com/
+    relays: ${{ steps.relays.outputs.data }}
     private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}
   id: publish
送信したイベントをコミットしたい場合

リポジトリに送信した kind 0 イベントをコミットしておきたい場合は permissionscontents: write を追加するのと snow-actions/nostr のステップに id を追加します。

- permissions: {}
+ permissions:
    contents: write

  jobs:
    run:
      steps:
        - uses: snow-actions/nostr@v1.7.0
          with:
            kind: 0
            content: ${{ steps.metadata.outputs.json }}
            relays: |
            wss://relay1.example.com/
            wss://relay2.example.com/
            private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}
+           id: publish

出力された JSON を適当な場所へコミットします。

  - run: echo "$event" | jq > docs/metadata.json
    env:
      event: ${{ steps.publish.outputs.event }}
  - uses: snow-actions/git-config-user@v1.0.0
  - run: |
      set -x
      git add docs/
      git commit -m 'Update metadata.json'
      git push

応用

metadata.json を PR で更新する場合はバリデーション CI を用意しておくとパースエラーを減らせそうです。

kind 0 以外のイベントにも応用できるので Nostr クライアントを使わずに BOT の管理ができるようになります。
こちらはすべてを GitHub Actions で管理している BOT の一例です。
https://github.com/SnowCait/nostr-japanese-users

Discussion