Skip to content

トラブルシューティング:チャンネル

一般的なチャンネルの問題

チャンネルが接続されているように見えるがメッセージが届かない

  1. オーナーIDを確認する。 ownerId が設定されていないか間違っている場合、あなたからのメッセージが制限された権限で外部(非オーナー)メッセージとしてルーティングされる可能性があります。
  2. 分類を確認する。 チャンネルの分類がセッションのTaintよりも低い場合、レスポンスはno-write-downルールによってブロックされます。
  3. デーモンのログを確認する。 triggerfish logs --level WARN を実行して配信エラーを探します。

メッセージが送信されない

ルーターは配信失敗をログに記録します。次の内容を triggerfish logs で確認します:

Channel send failed

これはルーターが配信を試みたがチャンネルアダプターがエラーを返したことを意味します。具体的なエラーもその横にログ記録されます。

リトライの動作

チャンネルルーターは失敗した送信に指数バックオフを使用します。メッセージが失敗した場合、遅延を増やしながら再試行されます。すべての再試行が使い果たされた後、メッセージはドロップされエラーがログに記録されます。


Telegram

ボットが応答しない

  1. トークンを確認する。 TelegramでBotFatherに連絡し、トークンが有効でキーチェーンに保存されているものと一致することを確認します。
  2. ボットに直接メッセージを送る。 グループメッセージはボットにグループメッセージの権限が必要です。
  3. ポーリングエラーを確認する。 TelegramはLong pollingを使用します。接続が切断された場合、アダプターは自動的に再接続しますが、継続的なネットワーク問題はメッセージの受信を妨げます。

メッセージが複数の部分に分割される

Telegramはメッセージあたり4,096文字の制限があります。長いレスポンスは自動的にチャンク化されます。これは正常な動作です。

ボットコマンドがメニューに表示されない

アダプターは起動時にスラッシュコマンドを登録します。登録が失敗した場合、警告がログに記録されますが実行は継続されます。これは致命的ではありません。ボットは引き続き動作しますが、コマンドメニューにオートコンプリートの候補が表示されなくなります。

古いメッセージを削除できない

Telegramはボットが48時間以上前のメッセージを削除することを許可していません。古いメッセージを削除しようとすると、サイレントに失敗します。これはTelegram APIの制限です。


Slack

ボットが接続しない

Slackには3つの認証情報が必要です:

認証情報フォーマット取得場所
Bot Tokenxoxb-...Slackアプリ設定のOAuth & Permissionsページ
App Tokenxapp-...Basic Information > App-Level Tokens
Signing Secret16進数文字列Basic Information > App Credentials

3つのいずれかが欠けているか無効な場合、接続が失敗します。最も一般的な間違いはBot Tokenとは別個のApp Tokenを忘れることです。

Socket Modeの問題

TriggerFishはHTTPイベントサブスクリプションではなく、SlackのSocket Modeを使用します。Slackアプリ設定で:

  1. 「Socket Mode」にアクセスして有効になっていることを確認する
  2. connections:write スコープを持つアプリレベルトークンを作成する
  3. このトークンが appTokenxapp-...

Socket Modeが有効でない場合、ボットトークンだけではリアルタイムメッセージングには不十分です。

メッセージが切り詰められる

Slackは40,000文字の制限があります。TelegramやDiscordとは異なり、Triggerfishはメッセージを分割するのではなくSlackメッセージを切り詰めます。この制限に定期的に達する場合は、エージェントにより簡潔な出力を生成するよう依頼することを検討してください。

テストでのSDKリソースリーク

Slack SDKはインポート時に非同期オペレーションをリークします。これは既知のアップストリームの問題です。Slackアダプターを使用するテストには sanitizeResources: falsesanitizeOps: false が必要です。本番環境での使用には影響しません。


Discord

ボットがサーバー内のメッセージを読めない

DiscordにはMessage Content特権インテントが必要です。これがないと、ボットはメッセージイベントを受け取りますがメッセージの内容が空になります。

修正方法: Discord Developer Portalで:

  1. アプリケーションを選択する
  2. 「Bot」設定にアクセスする
  3. Privileged Gateway Intentsの下の「Message Content Intent」を有効にする
  4. 変更を保存する

必要なボットインテント

アダプターには次のインテントの有効化が必要です:

  • Guilds
  • Guild Messages
  • Direct Messages
  • Message Content(特権)

メッセージがチャンク化される

Discordは2,000文字の制限があります。長いメッセージは自動的に複数のメッセージに分割されます。

タイピングインジケーターが失敗する

アダプターはレスポンスの前にタイピングインジケーターを送信します。ボットがチャンネルでメッセージを送信する権限がない場合、タイピングインジケーターはサイレントに失敗します(DEBUGレベルでログに記録)。これはコスメティックなものだけです。

SDKリソースリーク

Slackと同様に、discord.js SDKはインポート時に非同期オペレーションをリークします。テストには sanitizeOps: false が必要です。本番環境には影響しません。


WhatsApp

メッセージが受信されない

WhatsAppはwebhookモデルを使用します。ボットはMetaのサーバーからの受信HTTPのPOSTリクエストを待機します。メッセージが届くようにするには:

  1. Meta Business DashboardwebhookのURLを登録する
  2. 検証トークンを設定する。 アダプターはMetaが最初に接続するときに検証ハンドシェイクを実行します
  3. webhookリスナーを起動する。 アダプターはデフォルトでポート8443でリッスンします。このポートがインターネットから到達可能であることを確認してください(リバースプロキシまたはトンネルを使用)

「ownerPhone not configured」警告

WhatsAppチャンネル設定で ownerPhone が設定されていない場合、すべての送信者がオーナーとして扱われます。つまり、すべてのユーザーがすべてのツールへのフルアクセスを得られます。これはセキュリティ上の問題です。

修正方法: 設定でオーナーの電話番号を設定します:

yaml
channels:
  whatsapp:
    ownerPhone: "+1234567890"

アクセストークンの有効期限切れ

WhatsApp Cloud APIのアクセストークンは有効期限が切れる場合があります。送信が401エラーで失敗し始めた場合は、Metaダッシュボードでトークンを再生成して更新します:

bash
triggerfish config set-secret whatsapp:accessToken <new-token>

Signal

signal-cliが見つからない

SignalチャンネルはサードパーティのJavaアプリケーションである signal-cli を必要とします。Triggerfishはセットアップ中に自動インストールを試みますが、次の場合に失敗することがあります:

  • Java(JRE 21+)が利用できず、JRE 25の自動インストールに失敗した
  • ダウンロードがネットワーク制限によってブロックされた
  • ターゲットディレクトリが書き込み可能でない

手動インストール:

bash
# signal-cliを手動でインストール
# https://github.com/AsamK/signal-cli の手順を参照

signal-cliデーモンに到達できない

signal-cliを起動した後、Triggerfishは到達可能になるまで最大60秒待ちます。タイムアウトした場合:

signal-cli daemon (tcp) not reachable within 60s

確認事項:

  1. signal-cliは実際に実行中ですか? ps aux | grep signal-cli を確認する
  2. 期待されるエンドポイント(TCPソケットまたはUnixソケット)でリッスンしていますか?
  3. Signalアカウントにリンクが必要ですか? triggerfish config add-channel signal を実行してリンクプロセスを再実行します。

デバイスのリンクに失敗した

SignalはQRコードを介してデバイスをSignalアカウントにリンクする必要があります。リンクプロセスが失敗した場合:

  1. スマートフォンにSignalがインストールされていることを確認する
  2. Signal > 設定 > リンクされたデバイス > 新しいデバイスをリンクを開く
  3. セットアップウィザードが表示するQRコードをスキャンする
  4. QRコードの有効期限が切れた場合は、リンクプロセスを再開する

signal-cliのバージョンの不一致

Triggerfishは既知の動作するバージョンのsignal-cliに固定されています。別のバージョンをインストールした場合、警告が表示されることがあります:

Signal CLI version older than known-good

これは致命的ではありませんが、互換性の問題を引き起こす可能性があります。


Email

IMAP接続の失敗

Emailアダプターは受信メール用のIMAPサーバーに接続します。一般的な問題:

  • 認証情報が間違っている。 IMAPのユーザー名とパスワードを確認します。
  • ポート993がブロックされている。 アダプターはTLS経由のIMAP(ポート993)を使用します。一部のネットワークはこれをブロックします。
  • アプリ固有のパスワードが必要。 Gmailや他のプロバイダーは2FAが有効な場合にアプリ固有のパスワードを要求します。

表示される可能性のあるエラーメッセージ:

  • IMAP LOGIN failed - ユーザー名またはパスワードが間違っている
  • IMAP connection not established - サーバーに到達できない
  • IMAP connection closed unexpectedly - サーバーが接続を切断した

SMTP送信の失敗

Emailアダプターは(直接SMTPではなく)SMTP APIリレーを介して送信します。送信がHTTPエラーで失敗する場合:

  • 401/403: APIキーが無効
  • 429: レート制限
  • 5xx: リレーサービスが停止している

IMAPポーリングが停止する

アダプターは30秒ごとに新しいメールをポーリングします。ポーリングが失敗した場合、エラーはログに記録されますが自動再接続はありません。デーモンを再起動してIMAPの接続を再確立してください。

これは既知の制限です。既知の問題を参照してください。


WebChat

WebSocketアップグレードが拒否される

WebChatアダプターは受信接続を検証します:

  • ヘッダーが大きすぎる(431)。 結合されたヘッダーサイズが8,192バイトを超えています。これは過度に大きなCookieやカスタムヘッダーで発生する可能性があります。
  • CORSの拒否。 allowedOrigins が設定されている場合、Originヘッダーが一致する必要があります。デフォルトは ["*"](すべて許可)です。
  • 不正なフレーム。 WebSocketフレーム内の無効なJSONはWARNレベルでログに記録され、フレームはドロップされます。

分類

WebChatはデフォルトでPUBLIC分類を使用します。訪問者はオーナーとして扱われません。WebChatにより高い分類が必要な場合は、明示的に設定します:

yaml
channels:
  webchat:
    classification: INTERNAL

Google Chat

PubSubポーリングの失敗

Google ChatはメッセージDeliveryにPub/Subを使用します。ポーリングが失敗する場合:

Google Chat PubSub poll failed

確認事項:

  • Google Cloudの認証情報が有効(設定の credentials_ref を確認)
  • Pub/Subサブスクリプションが存在し削除されていない
  • サービスアカウントに pubsub.subscriber ロールがある

グループメッセージが拒否される

グループモードが設定されていない場合、グループメッセージはサイレントにドロップされる可能性があります:

Google Chat group message denied by group mode

Google ChatチャンネルConfigで defaultGroupMode を設定します。

ownerEmailが設定されていない

ownerEmail がない場合、すべてのユーザーは非オーナーとして扱われます:

Google Chat ownerEmail not configured, defaulting to non-owner

フルのツールアクセスを得るには設定で指定してください。