简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

Telegramプラットフォームの特徴ドキュメント

TelegramAdapter は、Telegram Bot API を基に構築されたアダプタであり、さまざまなメッセージタイプとイベント処理に対応しています。


ドキュメント情報

基本情報

標準Apiアクション(Api DSL)

アダプターは OB12 標準アクションを Telegram Bot API にマッピングし、data フィールドを標準化します:

OB12 標準アクション Telegram API data フィールド
get_self_info getMe user_id / user_name / user_displayname
get_user_info(user_id) getChat user_id / user_name / user_displayname
get_group_info(group_id) getChat group_id / group_name
get_group_member_info(group_id, user_id) getChatMember user_id / user_name / telegram_role
delete_message(message_id) deleteMessage 自動的にメッセージ登録表から chat_id を補完
leave_group(group_id) leaveChat -

拡張アクション:get_group_admin_list(group_id)(管理者リスト)、get_chat_member_count(chat_id)(メンバー数)。

from ErisPulse import sdk
telegram = sdk.adapter.get("telegram")

result = await telegram.Api.get_self_info()
result = await telegram.Api.get_group_info(group_id=-100123)
result = await telegram.Api.get_group_admin_list(-100123)
await telegram.Api.delete_message(message_id=55)   # 自動的に chat_id を補完
result = await telegram.Api.Using("main").get_self_info()

Telegram Bot API には友達リスト/グループリストを取得するインターフェースがなく、get_friend_list/get_group_list は errorcode=10002 を返します。

要求操作(Request DSL)

加群申請(chat_join_request イベント)を処理し、approveChatJoinRequest / declineChatJoinRequest を使用します。

from ErisPulse.Core.Event import request

@request.on_request()
async def handle_join_request(event):
    if event.get("platform") != "telegram":
        return
    # event["request_id"] は合成された識別子(tjr_{chat_id}_{user_id}_{date})です
    if event.get("user_nickname"):
        await event.approve()          # 同意
    # await event.reject()             # 拒絶

# 手動呼び出し(対応する要求イベントを事前に受信してコンテキストを登録しておく必要があります)
await telegram.Request(event["request_id"]).accept()
await telegram.Request(event["request_id"]).reject()
await telegram.Request(event["request_id"]).Using("main").accept()

支援されるメッセージ送信タイプ

すべての送信メソッドは、チェーン式の構文で実装されています。例:

from ErisPulse.Core import adapter
telegram = adapter.get("telegram")

await telegram.Send.To("user", user_id).Text("Hello World!")

基本送信メソッド

メソッド 説明 パラメータ
.Text(text) 純粋なテキストメッセージを送信 text: str
.Face(emoji) エモジーダイスを送信 emoji: str(例: 🎲 🎯 🏀)
.Markdown(text, content_type) Markdown形式のメッセージを送信 content_type はデフォルトで "MarkdownV2"
.HTML(text) HTML形式のメッセージを送信 text: str
.Sticker(file) ステッカーを送信 file: str (file_id/URL) | bytes
.Location(lat, lng) 位置情報を送信 latitude: float, longitude: float
.Venue(lat, lng, title, addr) 地点情報を送信 タイトルと住所を含む
.Contact(phone, first, last) 連絡先を送信 電話番号と名前を含む

メディア送信メソッド

すべてのメディアメソッドは、bytes(アップロード)と str(file_id / URL)の2種類の入力をサポートします:

メソッド 説明
.Image(file, caption, content_type) 画像を送信
.Video(file, caption, content_type) 動画を送信
.Voice(file, caption) 音声を送信
.Audio(file, caption, content_type) 音楽を送信
.File(file, caption) ファイルを送信
.Document(file, caption, content_type) Fileのエイリアス

メッセージ管理メソッド

メソッド 説明
.Edit(message_id, text, content_type) 既存のメッセージを編集
.Recall(message_id) 指定したメッセージを削除
.Forward(from_chat_id, message_id) メッセージを転送(元の送信元を保持)
.CopyMessage(from_chat_id, message_id) メッセージをコピー(送信元を保持しない)
.AnswerCallback(callback_query_id, text, show_alert) コールバッククエリに応答

原始メッセージ送信

チェーン式修飾メソッド

メソッド 説明
.At(user_id) 指定ユーザーを@する(Telegramのentitiesで実現、複数回呼び出し可能)
.AtAll() 全員を@する(@Allテキストを送信)
.Reply(message_id) 指定メッセージに返信
.Keyboard(inline_keyboard) インラインキーボードを設定(list[list[dict]])
.ProtectContent(protect) 内容を保護(転送や保存を防止)
.Silent(silent) 静かに送信(ユーザーに通知しない)

送信例

# 基本文本送信
await telegram.Send.To("user", user_id).Text("Hello World!")

# インラインキーボード付きメッセージ
from ErisPulse import sdk
telegram = sdk.adapter.get("telegram")
keyboard = [
    [{"text": "ボタン1", "callback_data": "btn1"}, {"text": "ボタン2", "callback_data": "btn2"}],
    [{"text": "公式サイトにアクセス", "url": "https://example.com"}],
]
await telegram.Send.To("group", group_id).Keyboard(keyboard).Text("選択してください:")

# メディア送信(URL方式)
await telegram.Send.To("group", group_id).Image("https://example.com/image.jpg", caption="画像")

# @ユーザー
await telegram.Send.To("group", group_id).At("6117725680").Text("こんにちは!")

# 返信 + 内容保護
await telegram.Send.To("group", group_id).Reply("12345").ProtectContent().Text("機密メッセージ")

# 静かに送信
await telegram.Send.To("group", group_id).Silent().Text("静かに通知")

# コールバッククエリに応答
await telegram.Send.AnswerCallback(callback_query_id, text="処理完了", show_alert=False)

# OneBot12 組み込みメッセージ
ob12_message = [
    {"type": "text", "data": {"text": "複雑なメッセージ:"}},
    {"type": "mention", "data": {"user_id": "6117725680", "user_name": "ユーザー名"}},
    {"type": "reply", "data": {"message_id": "12345"}},
    {"type": "image", "data": {"file": "https://http.cat/200"}}
]
await telegram.Send.To("group", group_id).Raw_ob12(ob12_message)

# ステッカーを送信
await telegram.Send.To("user", user_id).Sticker("CAACAgIAAxkBAA...")  # file_id

# 位置情報を送信
await telegram.Send.To("user", user_id).Location(39.9042, 116.4074)

特有イベントタイプ

Telegram イベントの変換は OneBot12 標準に従い、telegram_ プレフィックスによるプラットフォーム拡張を提供します。

メッセージイベント detail_type マッピング

Telegram chat.type OneBot12 detail_type 送信先タイプ
private private user
group group group
supergroup group group
channel channel channel

特有イベントタイプ

detail_type 説明
telegram_callback_query コールバッククエリ(インラインキーボードボタンクリック)
telegram_inline_query インラインクエリ
telegram_chosen_inline_result 選択されたインライン結果
telegram_poll 投票イベント
telegram_poll_answer 投票回答
telegram_my_chat_member Bot 自身のメンバー状態変更
telegram_chat_member チャットメンバー変更
telegram_chat_join_request チャットへの参加リクエスト
telegram_shipping_query 配送料金クエリ
telegram_pre_checkout_query 事前決済クエリ

標準メッセージセグメントタイプ

変換後のメッセージセグメントは OneBot12 標準形式を使用します:

メッセージセグメントタイプ 説明 data フィールド
text 純粋なテキスト(@ユーザー名を含まない) text
mention @ユーザー(標準 OB12) user_id, user_name
reply メッセージへの返信引用 message_id, user_id
image 画像 file_id, url
video 動画 file_id, url, duration, width, height
voice 音声 file_id, url, duration
audio 音楽 file_id, url, duration, title, performer
file 一般ファイル file_id, url, file_name, file_size, mime_type
location 位置情報 latitude, longitude, オプションで title, address

プラットフォーム拡張メッセージセグメント

telegram_ プレフィックスで識別される拡張メッセージセグメント:

メッセージセグメントタイプ 説明 data フィールド
telegram_sticker スタンプ file_id, emoji, sticker_type, url
telegram_animation GIF アニメーション file_id, url, duration, caption
telegram_contact 連絡先 phone_number, first_name, last_name, user_id
telegram_inline_keyboard インラインキーボード inline_keyboard

イベントの例

グループチャットメッセージ(@ユーザーのメンション付き)

{
  "type": "message",
  "detail_type": "group",
  "platform": "telegram",
  "user_id": "6117725680",
  "user_nickname": "WSu2059",
  "group_id": "-1002850921906",
  "message_id": "172",
  "message": [
    {"type": "text", "data": {"text": "/it.echo "}},
    {"type": "mention", "data": {"user_id": "", "user_name": "@nm123_91178"}}
  ],
  "alt_message": "/it.echo @nm123_91178",
  "telegram_chat": {
    "id": -1002850921906,
    "title": "ErisPulse",
    "username": "erispulse",
    "type": "supergroup"
  }
}

コールバッククエリイベント

{
  "type": "notice",
  "detail_type": "telegram_callback_query",
  "user_id": "123456",
  "user_nickname": "YingXinche",
  "telegram_callback_id": "cb_123",
  "telegram_callback_data": "callback_data",
  "message_id": "msg_456"
}

インラインクエリイベント

{
  "type": "request",
  "detail_type": "telegram_inline_query",
  "user_id": "789012",
  "user_nickname": "YingXinche",
  "telegram_query_id": "iq_789",
  "telegram_query_text": "search_text",
  "telegram_query_offset": "0"
}

インラインキーボード付きメッセージ

{
  "type": "message",
  "detail_type": "group",
  "message": [
    {"type": "text", "data": {"text": "選択してください:"}},
    {
      "type": "telegram_inline_keyboard",
      "data": {
        "inline_keyboard": [
          [{"text": "ボタン1", "callback_data": "btn1"}],
          [{"text": "アクセス", "url": "https://example.com"}]
        ]
      }
    }
  ]
}

Event Mixin 拡張メソッド

アダプターは、platform == "telegram" の場合にのみ利用可能な以下のプラットフォーム固有メソッドを登録しています。

メッセージ関連

メソッド 戻り値の型 説明
is_bot_message() bool メッセージがロボットから送信されたものかどうかを判定します
is_edited_message() bool メッセージが編集されたものかどうかを判定します
is_topic_message() bool トピック/Topic メッセージかどうかを判定します
get_update_id() int Telegram update ID を取得します
get_chat_title() str チャットのタイトルを取得します
get_chat_username() str チャットのユーザーネームを取得します
get_forward_from() dict 転送元の情報を取得します
get_topic_id() str トピック ID を取得します

コールバッククエリ関連

メソッド 戻り値の型 説明
get_callback_data() str コールバッククエリの callback_data を取得します
get_callback_id() str コールバッククエリ ID(応答に使用)を取得します

メッセージセグメントデータの抽出

メソッド 戻り値の型 説明
get_inline_keyboard() list メッセージに含まれるインラインキーボードを取得します
get_sticker_info() dict ステッカーの情報を取得します
get_contact_info() dict 連絡先の情報を取得します
get_location() dict 位置情報を取得します

使用例

from ErisPulse.Core.Event import message, notice

@message.on_message()
async def handle_message(event):
    if event.get("platform") != "telegram":
        return

    # メッセージ属性
    if event.is_bot_message():
        return  # ロボットからのメッセージを無視

    if event.is_edited_message():
        print("これは編集されたメッセージです")

    # チャット情報
    title = event.get_chat_title()
    username = event.get_chat_username()

    # 転送元
    forward = event.get_forward_from()

    # メッセージセグメントデータ
    sticker = event.get_sticker_info()
    contact = event.get_contact_info()
    location = event.get_location()
    keyboard = event.get_inline_keyboard()

    # トピック
    if event.is_topic_message():
        topic_id = event.get_topic_id()

@notice.on_notice()
async def handle_notice(event):
    if event.get("platform") != "telegram":
        return

    if event.get("detail_type") == "telegram_callback_query":
        callback_data = event.get_callback_data()
        callback_id = event.get_callback_id()

        # コールバッククエリへの応答
        telegram = sdk.adapter.get("telegram")
        await telegram.Send.AnswerCallback(callback_id, text="クリックしました")

        # メッセージへの返信
        await event.reply(f"あなたがクリックしたのは:{callback_data}")

拡張フィールドの説明

設定オプション

Telegram アダプターは、複数アカウントの設定をサポートしています。

設定例

[Telegram_Adapter.accounts.default]
token = "YOUR_BOT_TOKEN"
enabled = true

[Telegram_Adapter.accounts.bot2]
token = "ANOTHER_BOT_TOKEN"
enabled = true

実行モード

Telegram アダプターは Polling(ポーリング) モードのみをサポートしており、Webhook モードは削除されました。

代理設定

Telegram API にプロキシ経由で接続する場合は、システムレベルのプロキシ(環境変数 ALL_PROXY / HTTPS_PROXY)を使用してください。

旧版設定の移行

旧版の単一トークンの設定は自動的に互換性があります:

# 旧版の形式(引き続き使用可能ですが、移行することを推奨します)
[Telegram_Adapter]
token = "YOUR_BOT_TOKEN"

新しい形式への移行を推奨します:

[Telegram_Adapter.accounts.default]
token = "YOUR_BOT_TOKEN"
enabled = true