Telegram(Bot API)

ステータス:grammY経由のBot DM + グループで本番運用可能。ロングポーリングがデフォルトモードで、Webhookモードもオプションで利用可能です。

クイックセットアップ

ステップ1:BotFatherでBotトークンを作成

Telegramを開いて**@BotFather**とチャットしてください(ハンドルが正確に`@BotFather`であることを確認)。

`/newbot`を実行し、プロンプトに従ってトークンを保存してください。

ステップ2:トークンとDMポリシーの設定

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "123:abc",
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
環境変数フォールバック:`TELEGRAM_BOT_TOKEN=...`(デフォルトアカウントのみ)。
Telegramでは`openclaw channels login telegram`は**使用しません**。設定/環境変数でトークンを設定してからGatewayを起動してください。

ステップ3:Gatewayの起動と最初のDM承認

openclaw gateway
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
ペアリングコードは1時間後に期限切れになります。

ステップ4:Botをグループに追加

Botをグループに追加してから、`channels.telegram.groups`と`groupPolicy`をアクセスモデルに合わせて設定してください。

注意: トークンの解決順序はアカウントを考慮します。設定値が環境変数フォールバックより優先され、TELEGRAM_BOT_TOKENはデフォルトアカウントにのみ適用されます。

Telegram側の設定

プライバシーモードとグループの可視性
Telegram Botはデフォルトで**プライバシーモード**が有効であり、受信できるグループメッセージが制限されます。

Botがすべてのグループメッセージを見る必要がある場合は以下のいずれかを行ってください:

- `/setprivacy`でプライバシーモードを無効化、または
- Botをグループ管理者にする

プライバシーモードを切り替えた後、変更を適用するために各グループでBotを削除してから再追加してください。
グループ権限
管理者ステータスはTelegramのグループ設定で制御されます。

管理者Botはすべてのグループメッセージを受信するため、常時応答のグループ動作に有用です。
BotFatherの便利な設定
- `/setjoingroups`:グループ追加の許可/拒否
- `/setprivacy`:グループ可視性の動作

アクセス制御とアクティベーション

DMポリシー

`channels.telegram.dmPolicy`でダイレクトメッセージアクセスを制御します:

- `pairing`(デフォルト)
- `allowlist`(`allowFrom`に少なくとも1つの送信者IDが必要)
- `open`(`allowFrom`に`"*"`を含む必要あり)
- `disabled`

`channels.telegram.allowFrom`は数値のTelegramユーザーIDを受け付けます。`telegram:` / `tg:`プレフィックスも受け付け正規化されます。

### TelegramユーザーIDの確認

安全な方法(サードパーティBot不要):

1. Botにメッセージを送信
2. `openclaw logs --follow`を実行
3. `from.id`を読み取る

公式Bot APIメソッド:
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
サードパーティメソッド(プライバシーが低い):`@userinfobot`または`@getidsbot`

グループポリシーと許可リスト

2つの制御が組み合わせて適用されます:

1. **許可するグループ**(`channels.telegram.groups`)
   - `groups`設定なし:
     - `groupPolicy: "open"`の場合:すべてのグループがグループIDチェックを通過
     - `groupPolicy: "allowlist"`(デフォルト)の場合:`groups`エントリ(または`"*"`)を追加するまでグループはブロック
   - `groups`設定あり:許可リストとして機能(明示的IDまたは`"*"`)

2. **グループ内の許可する送信者**(`channels.telegram.groupPolicy`)
   - `open`
   - `allowlist`(デフォルト)
   - `disabled`

`groupAllowFrom`はグループ送信者フィルタリングに使用されます。未設定の場合、Telegramは`allowFrom`にフォールバックします。

> **警告:**
> よくある間違い:`groupAllowFrom`はTelegramのグループ許可リストではありません。
>
> - `-1001234567890`のような負のTelegramグループ/スーパーグループチャットIDは`channels.telegram.groups`に配置してください。
> - `8734062810`のようなTelegramユーザーIDは、許可されたグループ内でBotをトリガーできるユーザーを制限する場合に`groupAllowFrom`に配置してください。

例:特定グループで全メンバーを許可:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          groupPolicy: "open",
          requireMention: false,
        },
      },
    },
  },
}
例:特定グループで特定ユーザーのみ許可:
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          requireMention: true,
          allowFrom: ["8734062810", "745123456"],
        },
      },
    },
  },
}

メンション動作

グループ返信はデフォルトでメンションが必要です。

メンションの検出対象:

- ネイティブの`@botusername`メンション
- メンションパターン(`agents.list[].groupChat.mentionPatterns`、`messages.groupChat.mentionPatterns`)

セッションレベルのコマンドトグル:

- `/activation always`
- `/activation mention`

永続的な設定例:
{
  channels: {
    telegram: {
      groups: {
        "*": { requireMention: false },
      },
    },
  },
}

ランタイム動作

  • TelegramはGatewayプロセスが所有します。
  • ルーティングは決定的です:Telegram受信は常にTelegramに返信します。
  • グループセッションはグループIDで隔離されます。フォーラムトピックは:topic:<threadId>を追加してトピック間を隔離します。
  • ロングポーリングはgrammYランナーとチャット/スレッドごとのシーケンシングを使用します。

機能リファレンス

ライブストリームプレビュー(メッセージ編集)
OpenClawは部分的な返信をリアルタイムでストリーミングできます。

- `channels.telegram.streaming`:`off | partial | block | progress`(デフォルト:`partial`)
- `progress`はTelegramでは`partial`にマッピング

テキストのみの返信では、OpenClawは同じプレビューメッセージを保持し最終編集をインプレースで行います(2番目のメッセージなし)。

メディアペイロードを含む返信では、通常の最終配信にフォールバックしてプレビューメッセージをクリーンアップします。
フォーマットとHTMLフォールバック
送信テキストはTelegramの`parse_mode: "HTML"`を使用します。

- Markdown風テキストはTelegram安全なHTMLにレンダリングされます
- 生のモデルHTMLはTelegramパースエラーを減らすためにエスケープされます
- TelegramがパースされたHTMLを拒否した場合、プレーンテキストとして再試行します

リンクプレビューはデフォルトで有効であり、`channels.telegram.linkPreview: false`で無効にできます。
ネイティブコマンドとカスタムコマンド
Telegramコマンドメニュー登録は起動時に`setMyCommands`で処理されます。

- `commands.native: "auto"`はTelegramのネイティブコマンドを有効にします

カスタムコマンドメニューエントリの追加:
{
  channels: {
    telegram: {
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
    },
  },
}
ルール:名前は正規化されます(先頭の`/`を除去、小文字化)。パターン:`a-z`、`0-9`、`_`、長さ`1..32`。カスタムコマンドはネイティブコマンドをオーバーライドできません。
インラインボタン
インラインキーボードスコープの設定:
{
  channels: {
    telegram: {
      capabilities: {
        inlineButtons: "allowlist",
      },
    },
  },
}
スコープ:`off`、`dm`、`group`、`all`、`allowlist`(デフォルト)

メッセージアクション例:
{
  action: "send",
  channel: "telegram",
  to: "123456789",
  message: "Choose an option:",
  buttons: [
    [
      { text: "Yes", callback_data: "yes" },
      { text: "No", callback_data: "no" },
    ],
    [{ text: "Cancel", callback_data: "cancel" }],
  ],
}
コールバッククリックはテキストとしてAgentに渡されます:`callback_data: <value>`
フォーラムトピックとスレッド動作
フォーラムスーパーグループ:

- トピックセッションキーに`:topic:<threadId>`が追加される
- 返信とタイピングはトピックスレッドをターゲット
- トピック設定パス:`channels.telegram.groups.<chatId>.topics.<threadId>`

トピック継承:トピックエントリは`requireMention`、`allowFrom`、`skills`、`systemPrompt`、`enabled`、`groupPolicy`をオーバーライドしない限りグループ設定を継承します。

**トピックごとのAgentルーティング**:各トピックに`agentId`を設定することで異なるAgentにルーティングできます。

```json5
{
  channels: {
    telegram: {
      groups: {
        "-1001234567890": {
          topics: {
            "1": { agentId: "main" },
            "3": { agentId: "zu" },
            "5": { agentId: "coder" }
          }
        }
      }
    }
  }
}
```
音声、動画、スタンプ
Telegramはボイスノートと音声ファイルを区別します。デフォルトは音声ファイル動作です。Agent返信で`[[audio_as_voice]]`タグを使用するとボイスノートとして送信されます。

受信スタンプの処理:静的WEBPはダウンロードして処理されます。アニメーションTGSとビデオWEBMはスキップされます。

スタンプアクションの有効化:`channels.telegram.actions.sticker: true`
リアクション通知
Telegramリアクションは`message_reaction`更新として到着します。

設定:

- `channels.telegram.reactionNotifications`:`off | own | all`(デフォルト:`own`)
- `channels.telegram.reactionLevel`:`off | ack | minimal | extensive`(デフォルト:`minimal`)

`own`はBot送信メッセージへのユーザーリアクションのみ(送信済みメッセージキャッシュベースのベストエフォート)。
確認リアクション
`ackReaction`はOpenClawが受信メッセージを処理中に確認用の絵文字を送信します。

解決順序:

- `channels.telegram.accounts.<accountId>.ackReaction`
- `channels.telegram.ackReaction`
- `messages.ackReaction`
- Agent IDの絵文字フォールバック

Telegramはユニコード絵文字を使用します(例:"eyes")。`""`で無効化できます。
ロングポーリング vs Webhook
デフォルト:ロングポーリング。

Webhookモード:

- `channels.telegram.webhookUrl`を設定
- `channels.telegram.webhookSecret`(webhookUrl設定時は必須)
- オプション:`channels.telegram.webhookPath`(デフォルト`/telegram-webhook`)
- オプション:`channels.telegram.webhookHost`(デフォルト`127.0.0.1`)
- オプション:`channels.telegram.webhookPort`(デフォルト`8787`)
制限、リトライ、CLIターゲット
- `channels.telegram.textChunkLimit`デフォルトは4000
- `channels.telegram.chunkMode="newline"`で段落境界を優先して分割
- `channels.telegram.mediaMaxMb`(デフォルト100)で受信/送信Telegramメディアサイズを制限
- `channels.telegram.retry`設定はTelegram送信ヘルパーに適用

CLIの送信ターゲットは数値チャットIDまたはユーザー名:
openclaw message send --channel telegram --target 123456789 --message "hi"
openclaw message send --channel telegram --target @name --message "hi"
Telegramでの実行承認
Telegramは承認者DMでの実行承認をサポートし、オプションで元のチャットやトピックに承認プロンプトを投稿できます。

設定パス:

- `channels.telegram.execApprovals.enabled`
- `channels.telegram.execApprovals.approvers`
- `channels.telegram.execApprovals.target`(`dm` | `channel` | `both`、デフォルト:`dm`)

承認者は数値のTelegramユーザーIDである必要があります。

関連ドキュメント:[実行承認](/docs/tools/exec-approvals)

トラブルシューティング

Botがメンションなしのグループメッセージに応答しない
- `requireMention=false`の場合、Telegramのプライバシーモードで完全な可視性が必要です
  - BotFather:`/setprivacy` → Disable
  - その後グループからBotを削除して再追加
- クイックセッションテスト:`/activation always`
Botがグループメッセージを全く受信しない
- `channels.telegram.groups`が存在する場合、グループがリストされている必要あり(または`"*"`を含む)
- グループ内のBotメンバーシップを確認
- ログを確認:`openclaw logs --follow`でスキップ理由を確認
コマンドが部分的または全く動作しない
- 送信者IDを認証(ペアリングおよび/または数値`allowFrom`)
- グループポリシーが`open`でもコマンド認可は引き続き適用
- `setMyCommands failed`と`BOT_COMMANDS_TOO_MUCH`の場合はネイティブメニューのエントリ数を削減
ポーリングまたはネットワークの不安定性
- 一部のホストは`api.telegram.org`をIPv6で先に解決します。IPv6送信が壊れている場合、断続的なTelegram APIエラーが発生する可能性があります
- VPSホストでは`channels.telegram.proxy`でTelegram APIコールをプロキシ経由でルーティングしてください:
channels:
  telegram:
    proxy: socks5://<user>:<password>@proxy-host:1080

その他の支援:チャンネルトラブルシューティング

Telegram設定リファレンスポインター

主なリファレンス:

  • channels.telegram.enabled:チャンネル起動の有効/無効

  • channels.telegram.botToken:Botトークン(BotFather)

  • channels.telegram.dmPolicypairing | allowlist | open | disabled(デフォルト:pairing)

  • channels.telegram.allowFrom:DM許可リスト(数値TelegramユーザーID)

  • channels.telegram.groupPolicyopen | allowlist | disabled(デフォルト:allowlist)

  • channels.telegram.groupAllowFrom:グループ送信者許可リスト

  • channels.telegram.groups:グループごとのデフォルト + 許可リスト

  • channels.telegram.capabilities.inlineButtonsoff | dm | group | all | allowlist

  • channels.telegram.replyToModeoff | first | all(デフォルト:off

  • channels.telegram.streamingoff | partial | block | progress(デフォルト:partial

  • channels.telegram.textChunkLimit:送信チャンクサイズ(文字数)

  • channels.telegram.mediaMaxMb:受信/送信メディア上限(MB、デフォルト:100)

  • channels.telegram.proxy:Bot APIコール用プロキシURL(SOCKS/HTTP)

  • channels.telegram.webhookUrl:Webhookモードを有効化

  • channels.telegram.webhookSecret:Webhookシークレット(webhookUrl設定時は必須)

  • 設定リファレンス - Telegram

関連項目