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

ErisPulse PlatformFeatures ドキュメント

ベースラインプロトコル: OneBot12

本文ドキュメントはプラットフォーム固有の機能ガイドです。以下を含みます:

  • 各アダプターがサポートするSendメソッドのチェーン呼び出し例
  • プラットフォーム固有のイベント/メッセージ形式の説明

一般的な使用方法は以下のドキュメントを参照してください:


プラットフォーム固有の機能

このセクションは、各アダプターの開発者が保守し、OneBot12 標準との差異および拡張機能を説明するものです。以下の各プラットフォームの詳細ドキュメントを参照してください:

さらに sandbox アダプターもありますが、このアダプターにはプラットフォーム特有のドキュメントを保守する必要はありません。

一般的インターフェース

Sendのチェーン呼び出し

すべてのアダプターは以下の標準的な呼び出し方法をサポートしています。

注意: ドキュメント内の {AdapterName} は実際のアダプター名(例: yunhu、telegram、onebot11、email など)に置き換える必要があります。

  1. 型とIDを指定: To(type,id).Func()
    # アダプターインスタンスを取得
    my_adapter = adapter.get("{AdapterName}")
    
    # メッセージを送信
    await my_adapter.Send.To("user", "U1001").Text("Hello")
    
    # 例:
    yunhu = adapter.get("yunhu")
    await yunhu.Send.To("user", "U1001").Text("Hello")
    
  2. IDのみを指定: To(id).Func()
    my_adapter = adapter.get("{AdapterName}")
    await my_adapter.Send.To("U1001").Text("Hello")
    
    # 例:
    telegram = adapter.get("telegram")
    await telegram.Send.To("U1001").Text("Hello")
    
  3. 送信アカウントを指定: Using(account_id)
    my_adapter = adapter.get("{AdapterName}")
    await my_adapter.Send.Using("bot1").To("U1001").Text("Hello")
    
    # 例:
    onebot11 = adapter.get("onebot11")
    await onebot11.Send.Using("bot1").To("U1001").Text("Hello")
    
  4. 直接呼び出し: Func()
    my_adapter = adapter.get("{AdapterName}")
    await my_adapter.Send.Text("Broadcast message")
    
    # 例:
    email = adapter.get("email")
    await email.Send.Text("Broadcast message")
    

非同期送信と結果処理

Send DSLのメソッドはasyncio.Taskオブジェクトを返すため、結果を即座に待つかどうかを選択できます。

# アダプターインスタンスを取得
my_adapter = adapter.get("{AdapterName}")

# 結果を待たずに、バックグラウンドでメッセージを送信
task = my_adapter.Send.To("user", "123").Text("Hello")

# 送信結果を取得したい場合は、後で待機します
result = await task

送信ルールデコレータ

実際の開発では、送信成功後に後続の処理を実行する、失敗時に自動的に再試行する、タイムアウトでキャンセルする、送信の進行状況を監視するなどが必要になることがよくあります。Send DSLには、ルールをチェーンメソッドで追加できる送信ルールデコレータの仕組みが内蔵されています。

メソッド 説明
.Hook(callback) 送信成功後に実行するコールバック(複数回呼び出し可能)
.Retry(times=1) 失敗時に自動的にN回再試行(初回含めて合計N+1回)
.Timeout(seconds) 単回送信のタイムアウト、タイムアウト時にキャンセル(Retryと重ねて使用可能)
.Defer(seconds) 送信を遅延(プロセス内でのタイマー、永続化されない)
.OnProgress(callback) 各段階の進行状況のコールバック、SendContextを渡す
.OnError(callback) 最終的に失敗したときのエラーコールバック(1回のみ発動)
yunhu = adapter.get("yunhu")

# 送信成功後にポイントを減らす
await (yunhu.Send.To("user", "123")
       .Hook(lambda r: deduct_points("123"))
       .Text("消費成功"))

# 失敗時の再試行 + タイムアウト + 進行状況の監視
def on_progress(ctx):
    print(f"段階: {ctx.stage}, 試行: {ctx.attempt + 1}/{ctx.max_attempts}")

task = (yunhu.Send.To("user", "123")
        .Retry(3)              # 最大3回再試行
        .Timeout(10)           # 各試行のタイムアウトは10秒
        .OnProgress(on_progress)
        .OnError(lambda ctx: notify_admin(ctx.error))
        .Text("重要通知"))

ルールメソッドはselfを返すため、送信メソッド(Text/Imageなど)の前に呼び出す必要があります。SendContextには、stage(pending/sending/retrying/success/failed/timeout)、attempt、elapsed、error、resultなどのフィールドが含まれており、監視に便利です。

バッチ構築モード(Build)

1つのチェーンで複数の送信メソッドを構築し、最後に一括して実行します。これは「一気に複数のメッセージを送る」ような場面に適しています。

yunhu = adapter.get("yunhu")

# 複数のメッセージを構築し、一括送信
results = await (yunhu.Send.To("user", "123")
                .Build()                     # 構築モードに入る
                .Text("通知一")
                .Image("pic.jpg")
                .Text("通知二")
                .send_all())                 # 一括実行
# results = [Textの結果, Imageの結果, Textの結果]

.send_all()はデフォルトで並列実行(並行送信、効率が高い)します。メッセージの到着順序を保証する必要がある場合は、.Sequential()で逐次実行します。

# 逐次実行(順序を保証)+ 失敗時の再試行
await (yunhu.Send.To("group", "456")
       .Build()
       .Sequential()                # 順番に送信
       .Retry(2)                     # 失敗した項目はそれぞれ再試行
       .Text("第一条").Text("第二条")
       .send_all())

バッチ実行では失敗しても継続する戦略を採用しています。1つのメッセージが失敗しても他のメッセージの送信は中断されず、失敗したメッセージは自動的に再試行されます。バッチ実行では、全メッセージが成功した後にトリガーされるHook、失敗した場合にトリガーされるOnError、進行状況のコールバックであるOnProgressもサポートしています。

詳細なルールとバッチ構築の説明は、SendDSL 详解をご覧ください。

イベントの監視

3つのイベント監視方法があります。

  1. プラットフォーム独自のイベント監視:

    from ErisPulse.Core import adapter, logger
    
    @adapter.on("event_type", raw=True, platform="{AdapterName}")
    async def handler(data):
        logger.info(f"{AdapterName}の独自イベントを受信: {data}")
    
  2. OneBot12標準イベントの監視:

    from ErisPulse.Core import adapter, logger
    
    # OneBot12標準イベントを監視
    @adapter.on("event_type")
    async def handler(data):
        logger.info(f"標準イベントを受信: {data}")
    
    # 特定プラットフォームの標準イベントを監視
    @adapter.on("event_type", platform="{AdapterName}")
    async def handler(data):
        logger.info(f"{AdapterName}の標準イベントを受信: {data}")
    
  3. Eventモジュールによるイベント監視: Eventのイベントはadapter.on()関数に基づいているため、Eventが提供するイベント形式はOneBot12標準イベントです。

    from ErisPulse.Core.Event import message, notice, request, command
    
    message.on_message()(message_handler)
    notice.on_notice()(notice_handler)
    request.on_request()(request_handler)
    command("hello", help="送信する挨拶メッセージ", usage="hello")(command_handler)
    
    async def message_handler(event):
        logger.info(f"メッセージを受信: {event}")
    async def notice_handler(event):
        logger.info(f"通知を受信: {event}")
    async def request_handler(event):
        logger.info(f"リクエストを受信: {event}")
    async def command_handler(event):
        logger.info(f"コマンドを受信: {event}")
    

この中で最も推奨されるのは、Eventモジュールを使用したイベント処理です。Eventモジュールは豊富なイベントタイプとイベント処理メソッドを提供しているためです。

標準フォーマット

参考の便宜上、ここでは簡単なイベントフォーマットを示します。詳細情報が必要な場合は、上記のリンクを参照してください。

注意: 以下のフォーマットは基本的な OneBot12 標準フォーマットです。各アダプターはこの基本フォーマットに拡張フィールドを追加する場合があります。詳細は、各アダプターの特定機能説明を参照してください。

標準イベントフォーマット

すべてのアダプターが実装しなければならないイベント変換フォーマット:

{
  "id": "event_123",
  "time": 1752241220,
  "type": "message",
  "detail_type": "group",
  "platform": "example_platform",
  "self": {"platform": "example_platform", "user_id": "bot_123"},
  "message_id": "msg_abc",
  "message": [
    {"type": "text", "data": {"text": "你好"}}
  ],
  "alt_message": "你好",
  "user_id": "user_456",
  "user_nickname": "ExampleUser",
  "group_id": "group_789"
}

標準レスポンスフォーマット

メッセージ送信成功

{
  "status": "ok",
  "retcode": 0,
  "data": {
    "message_id": "1234",
    "time": 1632847927.599013
  },
  "message_id": "1234",
  "message": "",
  "echo": "1234",
  "{platform}_raw": {...}
}

メッセージ送信失敗

{
  "status": "failed",
  "retcode": 10003,
  "data": null,
  "message_id": "",
  "message": "必要なパラメータが不足しています",
  "echo": "1234",
  "{platform}_raw": {...}
}

参考リンク

ErisPulse プロジェクト:

関連する公式ドキュメント:

参加貢献

私たちは、より多くの開発者がアダプタのドキュメントの作成とメンテナンスに参加することを歓迎します!以下の手順に従って貢献を提出してください:

  1. ErisPuls リポジトリを Fork します。
  2. docs/platform-features/ ディレクトリに Markdown ファイルを作成し、ファイル名を <プラットフォーム名>.md という形式で指定します。
  3. 本 README.md ファイルに、ご貢献いただいたアダプタへのリンクと関連する公式ドキュメントを追加します。
  4. Pull Request を提出します。

ご支援ありがとうございます!