OpenClaw Telegram 連携完全ガイド
Telegram ボットを作成して OpenClaw に接続する方法を学びます。ボット作成、設定、コマンド、グループチャット設定を網羅した完全チュートリアル。
OpenClaw Guides
Tutorial Authors
概要
Telegram 連携により、専用の Telegram ボットを通じて OpenClaw と対話できます。OpenClaw はデフォルトでロングポーリングに grammY フレームワークを使用し、本番デプロイ向けにオプションで Webhook もサポートしています。
前提条件
- OpenClaw がインストールされ実行中であること
- Telegram アカウント
ステップ1:Telegram ボットを作成
BotFather と会話
- Telegram を開き
@BotFatherを検索 - チャットを開始して
/newbotを送信 - プロンプトに従います:
You: /newbot
BotFather: Alright, a new bot. How are we going to call it?
Please choose a name for your bot.
You: My OpenClaw Assistant
BotFather: Good. Now let's choose a username for your bot.
It must end in `bot`. Like this, for example:
TetrisBot or tetris_bot.
You: myopenclaw_bot
BotFather: Done! Congratulations on your new bot. You will find it at
t.me/myopenclaw_bot. You can now add a description, about
section and profile picture for your bot.
Use this token to access the HTTP API:
123456789:ABCdefGHIjklMNOpqrsTUVwxyz
Keep your token secure and store it safely.
ボットトークンを保存してください -- 次のステップで必要になります。
プライバシーモードを無効化(グループでの使用推奨)
グループチャットでボットを使用する予定がある場合、すべてのメッセージを読めるようにプライバシーモードを無効化します:
/setprivacy @myopenclaw_bot Disable
プライバシーモードを変更した後、変更を有効にするには既存のグループからボットを削除して再追加する必要があります。代替として、ボットをグループ管理者に昇格させることもできます -- 管理者ボットは常にすべてのメッセージを受信します。
ステップ2:OpenClaw を設定
トークンの保存
ボットトークンは2つの方法で保存できます。設定ファイルは環境変数より優先されます。
オプション A -- 環境変数:
# ~/.openclaw/.env に追加 TELEGRAM_BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz
オプション B -- 設定ファイルに直接記述:
// ~/.openclaw/openclaw.json
{
channels: {
telegram: {
botToken: "123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
}
}
}
最小構成
~/.openclaw/openclaw.json を編集:
{
channels: {
telegram: {
// 環境変数 TELEGRAM_BOT_TOKEN からトークンを取得、または botToken を直接設定
}
}
}
これだけで十分です -- Telegram チャンネルが設定されると、OpenClaw は自動的にロングポーリングを開始します。
ステップ3:ボットをテスト
- Telegram を開き、ボットのユーザー名を検索
/startでチャットを開始- メッセージを送信してテスト
アクセス制御 -- DM ポリシー
dmPolicy を使用して、プライベートチャットでボットにメッセージを送れるユーザーを制御します:
| ポリシー | 動作 |
|--------|----------|
| "pairing"(デフォルト) | 不明な送信者にはペアリングコード(有効期限付き)が発行され、CLI で承認します |
| "allowlist" | allowFrom に含まれるユーザー ID / @ユーザー名のみメッセージ可能 |
| "open" | 誰でもボットにメッセージを送信可能 |
| "disabled" | DM を完全に無効化 |
ペアリングモード(デフォルト)
新しいユーザーがボットにメッセージを送ると、ペアリングコードを受け取ります。以下で承認します:
# 保留中のペアリングリクエストを一覧表示 openclaw pairing list telegram # 特定のコードを承認 openclaw pairing approve telegram <CODE>
ペアリングコードは1時間後に期限切れになります。
allowlist モード
{
channels: {
telegram: {
dmPolicy: "allowlist",
allowFrom: [123456789, "@trusted_user"]
}
}
}
open モード
{
channels: {
telegram: {
dmPolicy: "open"
}
}
}
グループチャットサポート
グループアクセスを有効化
groups オブジェクトにグループ ID を追加します。すべてのグループを許可するには "*" を使用します:
{
channels: {
telegram: {
groups: {
"-1001234567890": {}, // デフォルト設定の特定グループ
"-1009876543210": { // オーバーライド設定の特定グループ
groupPolicy: "open",
requireMention: false,
systemPrompt: "You are a helpful coding assistant."
}
}
}
}
}
またはすべてのグループを許可:
{
channels: {
telegram: {
groups: "*"
}
}
}
グループポリシー
グループ内でボットと対話できるユーザーを制御します:
| 設定 | 説明 |
|---------|-------------|
| groupPolicy: "open" | グループメンバー全員がボットにメッセージ可能 |
| groupPolicy: "allowlist" | groupAllowFrom に含まれる送信者のみ対話可能 |
| groupPolicy: "disabled" | ボットはグループメッセージをすべて無視 |
{
channels: {
telegram: {
groupPolicy: "allowlist",
groupAllowFrom: [123456789, "@allowed_user"]
}
}
}
メンション要件
デフォルトでは、ボットはグループ内で @メンション を必要とします。グループごとに変更できます:
{
channels: {
telegram: {
groups: {
"-1001234567890": {
requireMention: false // ボットはすべてのメッセージに応答
}
}
}
}
}
またはグループチャットでセッション限定コマンド /activation always を使用します。
グループごとのオーバーライド
各グループエントリは以下のフィールドをサポートします:
| フィールド | 説明 |
|-------|-------------|
| groupPolicy | グローバルグループポリシーをオーバーライド |
| requireMention | @メンションが必要かどうか |
| skills | このグループで利用可能なスキル |
| allowFrom | このグループの送信者許可リスト |
| systemPrompt | このグループのカスタムシステムプロンプト |
| enabled | この特定のグループを有効/無効化 |
メッセージ形式とチャンキング
HTML パースモード
OpenClaw は Telegram の HTML パースモード(Markdown ではない)を使用してメッセージを送信します。LLM からの Markdown は自動的に HTML セーフタグに変換されます。Telegram が HTML を拒否した場合、プレーンテキストとして再送信されます。
テキストチャンキング
長いメッセージは複数の Telegram メッセージに分割されます:
{
channels: {
telegram: {
textChunkLimit: 4000, // メッセージあたりの最大文字数(デフォルト:4000)
chunkMode: "newline" // "length"(デフォルト)または "newline"
}
}
}
"length"-- 文字数制限で分割"newline"-- 文字数制限を適用する前に段落の境界で分割
メディア処理
メディアサイズ制限
{
channels: {
telegram: {
mediaMaxMb: 5 // 最大ファイルサイズ(MB)(デフォルト:5)
}
}
}
スタンプ
- 静止スタンプ(WEBP)はビジョンで処理され、LLM に説明が渡されます
- アニメーション/ビデオスタンプ はスキップされます
- スタンプの説明は
~/.openclaw/telegram/sticker-cache.jsonにキャッシュされ、冗長なビジョン呼び出しを回避します
ボットがスタンプを送信できるようにするには:
{
channels: {
telegram: {
actions: {
sticker: true // デフォルト:false
}
}
}
}
履歴とコンテキスト
{
channels: {
telegram: {
historyLimit: 50, // グループコンテキスト(デフォルト:50)
dmHistoryLimit: 100 // DM コンテキスト
}
}
}
ユーザーごとの DM オーバーライド:
{
channels: {
telegram: {
dms: {
"123456789": {
historyLimit: 200
}
}
}
}
}
0 に設定すると履歴が無効になります。
ストリーミング
OpenClaw はプライベートチャット(フォーラムトピック有効時)でドラフトベースのストリーミングをサポートしています:
| 設定 | 説明 |
|---------|-------------|
| streamMode: "off" | ストリーミング無効(デフォルト) |
| streamMode: "partial" | ドラフトメッセージへの連続更新 |
| streamMode: "block" | ドラフトメッセージへのチャンク更新 |
block モードの設定:
{
channels: {
telegram: {
streamMode: "block",
draftChunk: {
minChars: 200,
maxChars: 800,
breakPreference: "paragraph"
}
}
}
}
Webhook モード(本番環境)
本番デプロイでは、ロングポーリングの代わりに Webhook を使用します:
{
channels: {
telegram: {
webhookUrl: "https://your-domain.com/telegram-webhook",
webhookSecret: "your-random-secret-string",
webhookPath: "/telegram-webhook" // ローカルパス、デフォルト:/telegram-webhook
}
}
}
Webhook リスナーは 0.0.0.0:8787 にバインドされます。webhookUrl が設定されると、OpenClaw は自動的にポーリングから Webhook モードに切り替わります。
コマンド
ネイティブコマンド
OpenClaw は起動時にこれらのコマンドを Telegram のボットメニューに登録します:
| コマンド | 説明 |
|---------|-------------|
| /start | ウェルカムメッセージ |
| /status | ボットのステータスを表示 |
| /reset | 会話をリセット |
| /model | モデルの表示/切り替え |
カスタムコマンド
設定でメニューエントリを追加します(メニュー表示のみ -- 別途ハンドラーがない限り実行されません):
{
channels: {
telegram: {
customCommands: [
{ command: "weather", description: "Get weather forecast" },
{ command: "translate", description: "Translate text" }
]
}
}
}
コマンド名は小文字の
a-z0-9_、1〜32文字である必要があります。先頭の/は自動的に除去されます。ネイティブコマンドをオーバーライドすることはできません。
インラインボタン
インラインボタンの利用可能範囲を制御します:
| 設定 | スコープ |
|---------|-------|
| capabilities.inlineButtons: "off" | 無効 |
| capabilities.inlineButtons: "dm" | DM のみ |
| capabilities.inlineButtons: "group" | グループのみ |
| capabilities.inlineButtons: "all" | DM とグループの両方 |
| capabilities.inlineButtons: "allowlist" | 両方 + 送信者フィルタリング(デフォルト) |
ネットワークとプロキシ
{
channels: {
telegram: {
timeoutSeconds: 500, // Bot API リクエストタイムアウト(デフォルト:500)
network: {
autoSelectFamily: false // Happy Eyeballs を無効化(Node 22 でデフォルト有効)
},
proxy: "socks5://127.0.0.1:1080" // Bot API 用の SOCKS/HTTP プロキシ
}
}
}
トラブルシューティング
ボットが応答しない
- トークンが正しいか確認:
curl "https://api.telegram.org/bot<TOKEN>/getMe"
- OpenClaw のログを確認:
openclaw logs --follow
グループでメッセージが届かない
- プライバシーモードが無効化されている(
/setprivacy→ Disable)か、ボットが管理者である必要があります /activation always(セッション限定)でテストし、設定のrequireMention: falseで永続化します
IPv6 ルーティングの失敗
IPv6 ルーティングが失敗すると、ボットが無応答になる場合があります。api.telegram.org の DNS を確認します:
dig api.telegram.org AAAA
IPv6 送信を有効化するか、IPv4 を強制して修正します:
# /etc/hosts に追加 149.154.167.220 api.telegram.org
またはネットワーク設定を使用:
{
channels: {
telegram: {
network: {
autoSelectFamily: false
}
}
}
}
ロングポーリングの中断(Node 22以降)
Node 22 は AbortSignal インスタンスの処理がより厳格です。OpenClaw を最新バージョンにアップグレードするか、Node 20 にダウングレードしてください。
setMyCommands の失敗
api.telegram.org へのアウトバウンド HTTPS/DNS がブロックされている可能性があります。ファイアウォールルールを確認してください。
セキュリティベストプラクティス
- ボットトークンは絶対に共有しない -- 漏洩した場合は BotFather で直ちに無効化してください
- DM アクセス制御にはペアリングまたは allowlist を使用
- グループポリシーを設定 してグループ内で対話できるユーザーを制御
- ユーザー ID は安全に取得 --
openclaw logs --followまたは Bot API のgetUpdatesエンドポイントを使用し、サードパーティの ID ボットは避けてください - 本番デプロイではシークレット付きの Webhook を使用