# WeChat Official Account

Source: https://langbot.app/docs/ja/usage/platforms/wxoa

LangBot で WeChat 公式アカウント AI ボットを構築。LLM を WeChat 公衆号に接続。

WeChat Official Account ボットをデプロイして LangBot に接続します。

## LangBot WeChat Official Account 統合モード

新しい公式アカウントアダプターでは、次の 3 種類を選択できます。変更後はボット設定を保存してください。既存の設定は自動変更されず、デフォルトは `drop` です。旧版アダプターには `auto` はありません。

| モード           | 返信の仕組み                                                                             |
| ------------- | ---------------------------------------------------------------------------------- |
| `auto`        | 処理中のメッセージを返し、バックグラウンドで回答を生成します。カスタマーサービス API で送信し、利用制限がある場合は次のメッセージで受け取る方式に切り替えます。 |
| `passive`     | 処理中のメッセージを返し、回答を保存します。ユーザーが再度メッセージを送ると受け取れます。カスタマーサービス API は呼び出しません。               |
| `drop`（デフォルト） | 現在のコールバック内で返信します。5 秒以内に完了する処理向けです。カスタマーサービス API や受け取り方式への切り替えは使用しません。              |

### auto の判定方法

`auto` は認証状態を事前に取得しません。処理器が回答を送信する際にカスタマーサービス API を呼び出し、その結果で判定します。

- 成功した場合、追加メッセージを送らずに回答を受信できます。
- 権限不足（`48001`）、返信期限切れ（`45015`）、送信枠の上限（`45047`）、受信者が未フォロー（`43004`）の場合、回答を保存し、次のメッセージで受け取れるようにします。
- 認証情報、IP ホワイトリスト、ネットワークなどのその他のエラーは記録されます。一律に権限不足として扱うことはありません。

判定は返信ごとに行います。処理中の表示は回答の生成完了を意味しません。回答が届かない場合は処理器の実行ログを確認してください。

### 認証と返信期限

コールバックには認証の有無にかかわらず **5 秒以内**に応答する必要があります。`drop` はこの仕組みを使います。WeChat の再試行を安定した 15 秒の生成時間として利用することはできません。[公式の受動返信ドキュメント](https://developers.weixin.qq.com/doc/service/guide/product/message/Passive_user_reply_message.html)を参照してください。

カスタマーサービス API ではコールバック終了後も返信できます。現在の公式仕様では、公式アカウントとサービスアカウントは企業主体の認証が必要です。本人確認だけでこの権限が付与されるわけではありません。利用可否は実際の権限と API の応答で決まります。

| ユーザーの操作                           | 送信可能数 | 有効期限  |
| --------------------------------- | ----- | ----- |
| メッセージを送信                          | 5 件   | 48 時間 |
| 対象のカスタムメニューをクリック、フォロー、QR コードをスキャン | 3 件   | 1 分   |

これは AI の生成タイムアウトではなく、プラットフォームの制限です。最新の条件は[公式のカスタマーサービス API ドキュメント](https://developers.weixin.qq.com/doc/service/api/customer/message/api_sendcustommessage)を確認してください。

### 回答の受け取り

`passive` または `auto` の切り替え後は、次のメッセージは前の回答の受け取りに使われ、**同時に新しい質問として処理されません**。回答が未完成なら処理中の表示を再度返します。回答を受け取ってから新しい質問を送ってください。

`LoadingMessage` は `auto` と `passive` に適用され、`drop` には適用されません。`auto` では「処理中です。回答が届かない場合は、しばらくしてから任意のメッセージを送って受け取ってください」などを設定できます。空欄の場合は表示用のメッセージを送らずにコールバックの受信を確認します。

回答はメモリ上に保存され、LangBot の再起動やボット設定の再読み込みで消去されます。どのモードでも WeChat の内容や文字数の制限が適用されます。

イベントルーティングで処理器を接続してください。モードは Agent のすべてのテキスト出力を自動送信するものではありません。Agent には現在の会話への返信ツールを許可して使用するよう指示してください。プラグイン処理器は返信 API を呼び出す必要があります。

## ボットの作成

[WeChat Official Account Platform](https://mp.weixin.qq.com/)に入り、すでに公式アカウントをお持ちの場合は、QR コードをスキャンしてログインしてコンソールに入ります。
以前に公式アカウントを登録したことがない場合は、今すぐ登録をクリックし、「公式アカウント」を選択し、順番に情報を入力し、コンソールに入ります。コンソールは次のようになります：
![Console Page](https://langbot.app/docs/images/zh/deploy/bots/wxoa/wxoa1.png)

## コールバックアドレスの設定

> idea:
>
> **WeChat 公式アカウントにはパブリックドメインと HTTPS が必要です。** サーバーがない場合、[LangBot Cloud](https://space.langbot.app/cloud) にはドメイン解決が組み込まれており、登録するだけですぐに使用できます。

### 設定項目の取得

「設定と開発」、「開発インターフェイス管理」をクリックすると、次のようなページが表示されます：
![Set Development Items](https://langbot.app/docs/images/zh/deploy/bots/wxoa/wxoa2.png)

「開発者 ID（AppID）」、「開発者パスワード（AppSecret）」を記録し、LangBot がデプロイされているサーバーを「IP ホワイトリスト」に追加します。

### LangBot のリバースプロキシの設定

WeChat Official Accounts は http（ポート 80）と https（ポート 443）のみをサポートしているため、ドキュメント [HTTP リバースプロキシと SSL の設定](https://langbot.app/docs/en/workshop/production/proxy-and-ssl.md)に従って設定してください。

### コールバックアドレスの保存

サーバー設定を設定をクリックし、「Token」、「EncodingAESKey」を入力し、メッセージの暗号化/復号化方式を「Safe Mode」に変更します。

この時点で、LangBot Webui ページを開き、新しいボットを作成し、取得した 4 つの設定項目（AppID、AppSecret、token、EncodingAESKey）を入力します

![Set Development Items](https://langbot.app/docs/images/zh/deploy/bots/wxoa/connect_to_langbot.png)

設定項目の「Mode」で、上記の比較を参考に `auto`、`passive`、`drop` を選択してください。デフォルトは `drop` です。

「LoadingMessage」は `auto` と `passive` の処理中メッセージを設定します。「enable」を「true」に設定します。

正常に入力した後、LangBot ホームページで対応するボットを有効にして選択し、設定ページをクリックして入り、Webhook コールバックアドレスをコピーし、WeChat Official Account ボット設定ページに戻って「URL」に入力します。たとえば、URL を「https\://your\_domain\_name/bots/xxxxx」として入力します。ここで「your\_domain\_name」は Caddy に入力したドメイン名です。保存をクリックします。正常に保存できれば、デプロイは成功です。**システムエラー、後でもう一度お試しください**が表示された場合は、上記の設定内容が正しく入力されているかどうかを再確認してください。
