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()
)
関連ドキュメント
- アダプタ SendDSL 詳解 - Send チェーン式送信インターフェース
- イベント変換標準 - メッセージセグメント変換規格
- Event パッケージクラス - Event.reply_ob12() メソッド