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

MessageBuilder 详解

MessageBuilder は ErisPulse が提供する OneBot12 標準のメッセージセグメント構築ツールであり、構造化されたメッセージ内容を構築し、Send.Raw_ob12() と共に使用します。

導入方法

MessageBuilder は以下の2つの導入方法をサポートしています(効果は同じで、1つ目の方法を推奨します):

from ErisPulse.Core.Event import MessageBuilder        # 推奨、パッケージからのエクスポート
from ErisPulse.Core.Event.message_builder import MessageBuilder  # モジュールを直接インポート

雙モードメカニズム

MessageBuilder は、Python の descriptor メカニズム(__get__)を用いて、クラスレベルとインスタンスレベルの異なる動作を実現する 2 つの使用モードを提供します。クラスからメソッドを呼び出す場合、__get__ は静的メソッドの実行結果を返します。インスタンスから呼び出す場合、self を返すことで、メソッドチェーン(連鎖呼び出し)をサポートします。

チェーン呼び出しモード(インスタンス)

MessageBuilder() をインスタンス化して使用し、各メソッドは self を返すため、連鎖呼び出し(メソッドチェーン)が可能で、最後に .build() を用いてメッセージセグメントのリストを取得します。

from ErisPulse.Core.Event.message_builder import MessageBuilder

segments = (
    MessageBuilder()
    .text("你好!")
    .image("https://example.com/photo.jpg")
    .build()
)
# [
#     {"type": "text", "data": {"text": "你好!"}},
#     {"type": "image", "data": {"file": "https://example.com/photo.jpg"}}
# ]

快速構築モード(静的)

クラスから直接メソッドを呼び出すことで、各メソッドは直接メッセージセグメントのリストを返し、単一のメッセージセグメント構築に適しています。

# build() を必要とせず、直接 list[dict] を返します
segments = MessageBuilder.text("你好!")
# [{"type": "text", "data": {"text": "你好!"}}]

メッセージセグメントの種類

メソッド タイプ データパラメータ 説明
text(text) text text テキストメッセージ
image(file) image file 画像メッセージ
audio(file) audio file 音声メッセージ
video(file) video file 動画メッセージ
file(file, filename?) file file, filename ファイルメッセージ
mention(user_id, user_name?) mention user_id, user_name ユーザーを@でメンション
at(user_id, user_name?) mention user_id, user_name mention の別名
reply(message_id) reply message_id メッセージへの返信
at_all() mention_all - 全員を@でメンション
custom(type, data) 自定義 自定義 自定義メッセージセグメント

Send との連携

構築されたメッセージセグメントのリストは、Send.Raw_ob12() を使用して送信されます:

from ErisPulse import sdk
from ErisPulse.Core.Event.message_builder import MessageBuilder

# チェーンで構築 + 送信
segments = (
    MessageBuilder()
    .mention("user123", "張三")
    .text(" こちらの画像をご覧ください")
    .image("https://example.com/photo.jpg")
    .build()
)
await sdk.adapter.myplatform.Send.To("group", "group456").Raw_ob12(segments)

Event との連携(返信)

from ErisPulse.Core.Event import command

@command("report")
async def report_handler(event):
    await event.reply_ob12(
        MessageBuilder()
        .text("📊 日報集計\n")
        .text("本日完了したタスク: 5\n")
        .text("進行中のタスク: 3")
        .build()
    )

ツールメソッド

copy()

現在のビルダーをコピーし、同じ基礎内容に基づいて複数のメッセージバリエーションを作成します:

base = MessageBuilder().text("基礎内容").mention("admin")

# 同じプレフィックスに基づいて異なるメッセージを構築
msg1 = base.copy().text(" 変体A").build()
msg2 = base.copy().text(" 変体B").image("img.jpg").build()

clear()

追加されたメッセージセグメントをクリアし、同じビルダーを再利用します:

builder = MessageBuilder()

for user_id in ["user1", "user2", "user3"]:
    builder.clear()
    msg = builder.mention(user_id).text(" 你好!").build()
    await adapter.Send.To("user", user_id).Raw_ob12(msg)

len() / bool()

builder = MessageBuilder()
print(bool(builder))   # False

builder.text("Hello")
print(len(builder))    # 1
print(bool(builder))   # True

自定义メッセージセグメント

custom() メソッドを使用してプラットフォーム拡張メッセージセグメントを追加します:

# プラットフォーム固有のメッセージセグメントを追加
segments = (
    MessageBuilder()
    .text("フォームに記入してください:")
    .custom("yunhu_form", {"form_id": "12345"})
    .build()
)

自定义メッセージセグメントは、対応するプラットフォームのアダプターでのみ有効であり、他のアダプターは認識できないメッセージセグメントを無視します。

完整例

複数要素のメッセージ

segments = (
    MessageBuilder()
    .reply(event.get_id())                    # 元のメッセージに返信
    .mention(event.get_user_id())             # 送信者を@する
    .text(" これはあなたのクエリ結果です:\n")             # テキスト
    .image("https://example.com/chart.png")   # 画像
    .text("\n詳細データは添付ファイルをご覧ください:")
    .file("https://example.com/data.csv", filename="data.csv")
    .build()
)
await event.reply_ob12(segments)

静的ファクトリ + チェーン混合

# 単一のメッセージセグメントを迅速に構築
simple_msg = MessageBuilder.text("シンプルなテキスト")

# チェーンで複雑なメッセージを構築
complex_msg = (
    MessageBuilder()
    .at_all()
    .text(" 📢 お知らせ:")
    .text("今日の午後3時に会議があります")
    .build()
)

関連ドキュメント