0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Clawdbot】起動時に溜まったDiscordメッセージを自動処理する方法

Last updated at Posted at 2026-01-25

はじめに

Clawdbot、使ってますか?
*導入に関しては他の方が書かれてるのでそちらをどうぞ…

Claude CodeをDiscordやSlackから呼び出せるGateway型のAIアシスタント基盤、便利ですよね。ただ、使っていて一つ気になることがありました。

「寝てる間にDiscordでメモ送っておいて、朝起きたら処理されてたら最高じゃない?」

Clawdbotはリアルタイム処理が前提の設計なので、Gatewayが止まっている間のメッセージは拾ってくれません。でも調べてみたら、BOOT.md を使えば実現できることがわかりました。

この記事では、オフライン中に溜まったメッセージを起動時に処理する機能の実装方法を紹介します。

こんな人向け

この記事は、以下のような状況の人に向けて書いています。

🖥️ ローカルPCでClawdbotを動かしている人

AWSなどでの常時稼働ではなく、自分のPCでClawdbotを動かしている場合、PCをシャットダウンするとGatewayも止まります。寝ている間や外出中にふと「あ、これやっておいてほしい」と思いついても、Discordにメモを送るだけでは処理されません。

⏳ レートリミットで待ち時間が発生する人

Claude APIにはレートリミットがあります。連続してタスクを投げたいけど、リミットに引っかかって待たされる…そんなとき、「とりあえずメッセージを送っておいて、後でまとめて処理」ができたら便利ですよね。

📝 思いついたときにメモだけ投げておきたい人

「明日これ調べて」「この記事読んでまとめて」「このコードレビューして」——思いついたタイミングでメモを投げておいて、次にClawdbotが起動したときに順番に処理してもらう。そんな非同期的な使い方ができるようになります。

課題:Clawdbotはリアルタイム処理前提

まず、Clawdbotのメッセージ処理の仕組みを確認しましょう。

Inbound message
  -> routing/bindings -> session key
  -> queue (if a run is active)
  -> agent run (streaming + tools)
  -> outbound replies

ポイントは以下の通り:

  • メッセージは「届いた瞬間」に処理される
  • Gateway停止中に届いたメッセージは自動的には処理されない
  • Queue機能は「同時に複数メッセージが来た場合」の調整用

つまり、PCの電源を落としている間に送ったメッセージは、起動しても無視されます。

解決策:BOOT.md + 状態ファイル

調査の結果、以下の方針で実装できることがわかりました。

  1. 状態ファイルで「最後に処理したメッセージID」を記録
  2. BOOT.md(起動時に実行されるファイル)で未読メッセージを取得
  3. 取得したメッセージを順番に処理
  4. 最新のIDを状態ファイルに保存

なぜBOOT.mdなのか

Clawdbotには起動時のフックがいくつかあります。

フック タイミング 特徴
gateway:startup Gateway起動完了後 カスタムHook実装が必要
boot-md Gateway起動後 BOOT.mdを書くだけ
Heartbeat 定期実行 起動時専用ではない

boot-md が最もシンプルです。設定で有効にするだけで、ワークスペースの BOOT.md が起動時に実行されます。

実装

Step 1: boot-md を有効化

~/.clawdbot/clawdbot.json に以下を追加(または確認):

{
  "hooks": {
    "internal": {
      "enabled": true,
      "entries": {
        "boot-md": { "enabled": true }
      }
    }
  }
}

Step 2: 状態ファイルを作成

ワークスペースに state/ ディレクトリを作り、状態ファイルを配置します。

// ~/clawd/state/discord-last-processed.json
{
  "channels": {
    "1234567890123456789": null
  }
}
  • キー:監視したいチャンネルID
  • 値:最後に処理したメッセージID(初回は null

Step 3: BOOT.md を作成

ワークスペースのルートに BOOT.md を作成します。

# 起動時タスク

## 溜まったメッセージ処理

起動時に、オフライン中に送られたメッセージを処理する。

### 手順

1. **状態ファイルを読む**: `state/discord-last-processed.json`

2. **監視チャンネルごとに処理**:
   - `message read``after: lastId` 以降のメッセージを取得(limit: 20)
   - 自分以外のユーザーからのメッセージをフィルタ
   - 古い順に処理

3. **初回起動時(lastId が null)**:
   - 過去メッセージは処理しない
   - 現在の最新メッセージIDを保存するだけ

4. **処理完了後**:
   - 最新のメッセージIDを状態ファイルに保存
   - 処理件数を報告

BOOT.mdは自然言語で書けます。Clawdbotがこれを読んで、適切にツールを呼び出してくれます。

動作確認

  1. Gatewayを起動した状態で、テストメッセージを送る
  2. Gatewayを停止
  3. Discordにメッセージを送る(「明日これやっておいて」など)
  4. Gatewayを再起動
  5. 起動時に溜まったメッセージが処理されることを確認

ポイント・注意点

フィルタ条件を設定しよう

すべてのメッセージを処理すると、自分の発言まで拾ってしまいます。以下のようなフィルタを設定しましょう:

  • 特定ユーザーのメッセージのみ
  • Bot(自分自身)のメッセージは除外
  • メンション付きのみ(必要に応じて)

初回起動の挙動

lastIdnull の場合(初回起動時)は、過去のメッセージを全部処理するのではなく、「ここから監視開始」として現在の最新IDを保存するだけにしています。

過去のメッセージを遡って処理したい場合は、この挙動を変更してください。

Rate Limit に注意

チャンネル数が多いと、起動時に大量のAPIリクエストが発生します。Discord APIのRate Limitに引っかかる可能性があるので、必要に応じて遅延を入れましょう。

まとめ

Clawdbotの BOOT.md と状態ファイルを組み合わせることで、オフライン中のメッセージを起動時に処理する機能を実装できました。

  • BOOT.md: 起動時に実行される自然言語の指示書
  • 状態ファイル: 最後に処理したメッセージIDを永続化
  • message read: Discord APIでメッセージ履歴を取得

「寝る前にタスクをメモしておいて、朝PCを起動したら処理されてる」という運用ができるようになります。

Clawdbotを常時稼働させていない環境(ローカルPCで動かしているなど)では、特に便利な機能だと思います。ぜひ試してみてください。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?