Skip to main content
Agent 連携

メッセージチャネル連携

Forward Channel API を通じて外部 IM プラットフォームを連携するユーザーに向けて、チャネル認可、fixed/pairing 実行コンテキストモード、および各チャネルでのアプリ / ボットの作成方法、必要な権限の設定、取得すべき認証情報について説明します。

現段階では「QR コードバインディング」によるチャネル認可の利用を推奨します。必要でない限り、認証情報の直接設定は推奨しません。DingTalk、Feishu、WeCom、個人 WeChat のいずれも QR コードバインディングをサポートします。Channel 作成時に channel_config.credentials を省略し、QR Session による QR スキャン認可でバインディングを完了できます。App Secret などの機微な認証情報をアプリ側に保存する必要がなく、セキュリティ性が高く、運用コストも低くなります。QR コードバインディングでは要件を満たせない場合(無人のサーバーサイド自動化など)のみ、以下の各チャネルの「直接認証情報」方式を検討してください。

チャネル認可と Channel Pairing の区別

Forward Channel には 2 つの独立した設定次元があります:
次元解決する課題選択肢
チャネル認可Forward が IM ボット接続と送受信権限を取得する方法QR Session スキャン(推奨)または直接認証情報
Identity 解決受信メッセージに対してどの Identity と Template を使用するかfixed または pairing
QR Session での「QR コードバインディング」はチャネル認証情報の認可であり、Channel Pairing とは異なります。pairing モードの Channel も、まずチャネル認可を完了して binding_status=bound にする必要があります。その後、実際の IM 会話で初めてメッセージがトリガーされると、Forward はペアリングコードを生成してそのメッセージスコープの実行コンテキストをバインドします。

QR コードバインディングのフロー(推奨)

QR コードバインディングは dingtalkfeishuwecomwechat のすべてのチャネルで利用でき、手順は次のとおりです:
  1. Channel を作成する: Channel の作成 API を呼び出し、namechannel_type、および希望する Identity 解決モードを渡します。channel_config.credentials は省略しますfixed モードでは identity_idtemplate_id も渡します。pairing モードでは identity_resolution.mode=pairing を渡し、identity_idtemplate_id は渡しません。
  2. QR Session を作成する: Channel QR Session の作成 API を呼び出し、qr_code_image_base64(QR コード画像)または qr_code_content(認可 URL)を取得します。poll_interval_seconds はオプションの互換性フィールドであり、安定した返却値として依存すべきではありません。
  3. QR コードを表示して認可する: QR コードをユーザーに表示し、対応するチャネルのクライアントで QR コードを読み取り、認可を確認します。
  4. 認可状態をポーリングする: Channel QR Session の取得 を呼び出し、status をポーリングします。poll_interval_seconds がある場合はその値を使用し、なければデフォルトの 3 秒間隔でポーリングします。confirmed になるまで継続します(他の状態: waitingscannedexpireddeniederror)。
  5. チャネル認可を完了する: status=confirmed の後に Channel の詳細を再取得すると、binding_statusbound になります。fixed モードの Channel は固定の実行コンテキストで受信メッセージを処理できます。pairing モードの Channel はペアリングされていないメッセージに対してペアリングコードを返します。メッセージが Agent に到達する前に Channel Pairing(下記)を完了してください。
QR コードの有効期限は短めです。expired または denied になった場合は、QR Session を再作成して再度読み取ってください。

Identity 解決モード

fixed モード

fixed がデフォルトです。Channel 作成時に identity_idtemplate_id を指定する必要があり、すべての受信メッセージはこの固定の実行コンテキストを使用します:
{
  "identity_id": "idn_019eabc123",
  "identity_resolution": {
    "mode": "fixed"
  },
  "template_id": "tmpl_support",
  "channel_type": "feishu",
  "name": "Support Feishu channel"
}

pairing モード

pairing モードでは、Channel は IM トランスポート接続のみを表し、作成時に Identity や Template は指定しません:
{
  "identity_resolution": {
    "mode": "pairing"
  },
  "channel_type": "feishu",
  "name": "Support Feishu channel"
}
チャネル認可が完了した後のペアリングフローは次のとおりです:
  1. ユーザーが実際の IM の個人チャットまたはグループチャットからボットにメッセージを送信します。
  2. Channel Gateway はペアリングされていない direct/room スコープにペアリング待ちのレコードを作成し、ペアリングコードの案内を送信します。Session は作成されません。
  3. 管理者が Channel のペアリング API を code + identity_id + template_id で呼び出します。認可を自動化する場合は、先にペアリングの一覧を取得し、channel_id + scope_type + scope_external_id を独自のルールと照合してから、channel_pairing_id + identity_id + template_id を送信できます。
  4. 以降のメッセージは Pairing を通じて Identity と Template を解決し、Session を作成または再利用します。
  5. バインディングを解除するには、Pair レスポンスの id を使用して Channel のペアリング解除 API を呼び出します。
direct スコープではリモートユーザーをペアリング境界として使用し、room スコープでは安定したグループ / チャネル ID をペアリング境界として使用します。同じ room 内の異なるメンバーやスレッドは Pairing を共有しますが、Session と返信は会話 / スレッドごとに分離されます。ペアリングをトリガーした元のメッセージはペアリング成功後に再送されません。ユーザーはリクエストを再度送信する必要があります。
identity_resolution.mode は作成後に変更できません。fixedpairing を切り替えるには、Channel を削除して再作成する必要があります。

直接認証情報による連携(必要に応じて)

直接認証情報を使用する必要がある場合は、対応する開放プラットフォームでアプリ / ボットを作成し、権限を設定して認証情報を取得したうえで、Channel の作成 API の channel_config.credentials に渡します。各チャネルの channel_type と認証情報フィールドの対応:
チャネルchannel_typechannel_config.credentials フィールドQR バインディングをサポート
DingTalkdingtalkclient_idclient_secretはい(推奨)
Feishufeishuapp_idapp_secretはい(推奨)
WeComwecombot_idsecretはい(推奨)
個人 WeChatwechat認証情報は不要QR バインディングのみ
Microsoft Teams(Global)teamsapp_idtenant_idclient_secretいいえ
認証情報は Channel の作成 / 更新時にのみ書き込まれ、平文では返されません。

DingTalk

DingTalk アプリを作成する

  1. DingTalk 開放プラットフォーム にアクセスします。開発者権限を持つ組織を選択するか、いずれかの組織を選択して開発者権限を取得してください。適切な組織がない場合は、モバイル版 DingTalk で QR コードをスキャンして組織を素早く作成できます。
  2. トップナビゲーションの アプリ開発 をクリックし、DingTalk アプリのページで アプリを作成 をクリックします。

DingTalk ボットを作成する

  1. アプリを作成したら、左側ナビゲーションで アプリ機能を追加 を選択し、右側のボットカード下の 追加 ボタンをクリックします。
  2. ボット設定ページで、ボット設定を有効にします。
  3. メッセージ受信モードStream モード を選択し、公開 をクリックしてボット設定を完了します。

権限を設定する

アプリの 権限管理 で、以下の権限を有効にします:
権限説明
Card.Streaming.Writeカードメッセージのストリーミング書き込み
Card.Instance.Writeカードインスタンスの作成 / 更新
qyapi_robot_sendmsgボットのメッセージ送信

アプリを公開する

  1. 左側ナビゲーションで バージョン管理と公開 を選択し、新規バージョンを作成 をクリックします。
  2. アプリのバージョン番号とバージョン説明を入力し、業務のニーズに応じてアプリの利用可能範囲を選択し、保存 をクリックして公開を完了します。
利用可能範囲を全社員に設定すると、公開後、現在の企業内のすべての社員に対してアプリが表示されます。

認証情報を取得する

左側ナビゲーションの 認証情報と基本情報 ページで Client IDClient Secret を記録します。これらはそれぞれ API の client_idclient_secret に対応します。

Feishu

Feishu アプリを作成する

  1. Feishu 開放プラットフォーム にアクセスし、右上の 開発者コンソール をクリックします。
  2. 企業向けカスタムアプリを作成 をクリックし、必要な情報を入力して 作成 をクリックします。

ボットの追加と設定

  1. 左側ナビゲーションで アプリ機能を追加 を選択し、ボットカードの 追加 ボタンをクリックします。
  2. ボット設定カードの「利用の始め方」の右側にある編集アイコンをクリックします。
  3. メッセージカードのコールバックリクエスト方式 領域で 設定へ をクリックし、購読方式として 長時間接続によるコールバック受信 を選択して保存します。
  4. イベント設定 をクリックし、購読方式として同様に 長時間接続によるコールバック受信 を選択して保存します。
  5. イベント設定ページで、次の 4 つのイベントを追加して保存します:
    • ボットがグループに参加
    • ボットがグループから削除
    • メッセージ既読
    • メッセージ受信

権限を設定する

権限管理 > 権限の有効化権限の一括インポート / エクスポート をクリックし、以下の JSON を貼り付けて必要な権限をワンクリックでインポートし、確認後 申請して有効化 をクリックします:
{
  "scopes": {
    "tenant": [
      "contact:contact.base:readonly",
      "docx:document:readonly",
      "im:chat:read",
      "im:chat:update",
      "im:message.group_at_msg:readonly",
      "im:message.p2p_msg:readonly",
      "im:message.pins:read",
      "im:message.pins:write_only",
      "im:message.reactions:read",
      "im:message.reactions:write_only",
      "im:message:readonly",
      "im:message:recall",
      "im:message:send_as_bot",
      "im:message:send_multi_users",
      "im:message:send_sys_msg",
      "im:message:update",
      "im:resource",
      "application:application:self_manage",
      "cardkit:card:write",
      "cardkit:card:read"
    ],
    "user": [
      "contact:user.employee_id:readonly",
      "offline_access",
      "base:app:copy",
      "base:field:create",
      "base:field:delete",
      "base:field:read",
      "base:field:update",
      "base:record:create",
      "base:record:delete",
      "base:record:retrieve",
      "base:record:update",
      "base:table:create",
      "base:table:delete",
      "base:table:read",
      "base:table:update",
      "base:view:read",
      "base:view:write_only",
      "base:app:create",
      "base:app:update",
      "base:app:read",
      "board:whiteboard:node:create",
      "board:whiteboard:node:read",
      "calendar:calendar:read",
      "calendar:calendar.event:create",
      "calendar:calendar.event:delete",
      "calendar:calendar.event:read",
      "calendar:calendar.event:reply",
      "calendar:calendar.event:update",
      "calendar:calendar.free_busy:read",
      "contact:contact.base:readonly",
      "contact:user.base:readonly",
      "contact:user:search",
      "docs:document.comment:create",
      "docs:document.comment:read",
      "docs:document.comment:update",
      "docs:document.media:download",
      "docs:document:copy",
      "docx:document:create",
      "docx:document:readonly",
      "docx:document:write_only",
      "drive:drive.metadata:readonly",
      "drive:file:download",
      "drive:file:upload",
      "im:chat.members:read",
      "im:chat:read",
      "im:message",
      "im:message.group_msg:get_as_user",
      "im:message.p2p_msg:get_as_user",
      "im:message:readonly",
      "search:docs:read",
      "search:message",
      "space:document:delete",
      "space:document:move",
      "space:document:retrieve",
      "task:comment:read",
      "task:comment:write",
      "task:task:read",
      "task:task:write",
      "task:task:writeonly",
      "task:tasklist:read",
      "task:tasklist:write",
      "wiki:node:copy",
      "wiki:node:create",
      "wiki:node:move",
      "wiki:node:read",
      "wiki:node:retrieve",
      "wiki:space:read",
      "wiki:space:retrieve",
      "wiki:space:write_only"
    ]
  }
}

アプリを公開する

  1. 左側ナビゲーションで バージョン管理と公開 を選択します。
  2. バージョンを作成 をクリックし、必要な情報を入力して 保存 をクリックします。

認証情報を取得する

アプリの 認証情報と基本情報 ページで App IDcli_xxx のような形式)と App Secret をコピーします。これらはそれぞれ API の app_idapp_secret に対応します。

WeCom

スマートボットを作成する

  1. WeCom 管理コンソール にアクセスし、左側ナビゲーションで セキュリティと管理 > 管理ツール をクリックし、ボットを作成 をクリックしてから 手動で作成 をクリックします。
  2. ボットの表示範囲を設定します。
  3. ページの下部までスクロールして API モードで作成 をクリックし、接続方法として 長時間接続を使用 を選択します。

認証情報を取得する

設定方法の Secret 領域で クリックして取得 をクリックし、Bot IDSecret を記録します。これらはそれぞれ API の bot_idsecret に対応します。

個人 WeChat

個人 WeChat は QR コードバインディング のみをサポートし、開放プラットフォームでアプリを作成する必要も、直接認証情報を設定する必要もありません。Channel 作成時に channel_typewechat を渡し、上記の QR コードバインディングのフロー(推奨) に従って認可を完了してください。

Microsoft Teams 連携

Microsoft Teams は Global でのみ利用できます。連携する前に、顧客の Microsoft Entra テナントでアプリケーションを作成し、対応する Bot を Teams にインストールしてください。現在、個人チャット、標準 Team チャネル、グループチャットのテキスト、画像、ファイルメッセージをサポートしています。

Microsoft Entra アプリケーションを作成する

  1. Microsoft Entra 管理センター を開き、対象テナントでアプリ登録を作成します。
  2. Supported account typesSingle tenant に設定します。
  3. Application (client) IDDirectory (tenant) ID を記録し、それぞれ app_idtenant_id として使用します。
  4. Certificates & secrets で Client secret を作成し、その Valueclient_secret として記録します。
Client secret の Value は作成時に一度だけ表示されます。Secret ID を代わりに使用しないでください。

ファイル送受信に必要な Microsoft Graph 権限を設定する

Teams のグループチャットとチャネルのファイルは、OneDrive または SharePoint に保存されます。グループチャットと標準 Team チャネルでファイルを送受信するには、上記で作成した Entra アプリケーションに、以下の Microsoft Graph Application permissions(アプリケーション権限。Delegated permissions ではありません)を付与する必要があります。
権限用途
Sites.ReadWrite.AllSharePoint/OneDrive のファイルを読み書きし、受信ファイルのダウンロードと送信ファイルのアップロード・共有に使用します。
ChatMember.Read.Allグループチャットの全メンバー一覧を読み取り、グループメンバーのみがアクセスできる送信ファイルの共有リンクを作成します。
設定手順:
  1. Microsoft Entra 管理センターで対象のアプリ登録を開き、API permissions に移動します。
  2. Add a permission > Microsoft Graph > Application permissions を選択します。
  3. Sites.ReadWrite.AllChatMember.Read.All を追加します。
  4. テナント管理者が Grant admin consent を選択し、両方の権限が付与済みになっていることを確認します。
権限の範囲: これらはテナント全体に適用されるアプリケーション権限です。Sites.ReadWrite.All はテナント内のすべてのサイトコレクションのドキュメントとリスト項目を読み書きでき、ChatMember.Read.All はすべてのチャットのメンバー情報を読み取れます。顧客のテナント管理者が評価したうえで同意してください。個人チャットで Teams FileConsent を使用してファイルを送受信する場合、この 2 つの Graph 権限は不要ですが、Teams アプリの manifest で supportsFiles を有効にする必要があります。

Azure Bot を作成して設定する

  1. Azure Portal で Azure Bot を作成し、Microsoft App Type に Single Tenant を選択します。
  2. Entra アプリケーションの App ID と Tenant ID を Azure Bot に関連付けます。
  3. Configuration で、Messaging endpoint に Global 環境から提供された完全な Teams コールバック URL を設定します。パスは /channels/teams/messages です。
  4. Azure Bot で Microsoft Teams チャネルを有効にします。

Teams アプリを作成して公開する

  1. Developer Portal for Teams を開き、Teams アプリを作成します。
  2. Bot capability を追加し、Azure Bot と同じ App ID を関連付けます。
  3. 必要な personalteamgroupChat スコープを選択します。
  4. Teams アプリの manifest の Bot 設定で supportsFiles: true を指定し、個人チャットでの FileConsent によるファイル送受信を有効にします。
  5. manifest v1.12 以降で、グループチャットとチャネルの受信ファイルを解析するための RSC メッセージ読み取り権限を宣言します。グループチャットには ChatMessage.Read.Chat、標準 Team チャネルには ChannelMessage.Read.Group を使用します。
  6. アプリパッケージをダウンロードし、顧客の Teams 管理センターまたは組織の App catalog から公開して、対象の個人チャット、グループチャット、または Team にインストールします。manifest の権限を更新した後は、アプリを再公開し、対象のグループチャットまたは Team で再インストールまたは再同意が必要です。
manifest の主要な設定例:
{
  "webApplicationInfo": {
    "id": "<Application (client) ID>",
    "resource": "api://<Application (client) ID>"
  },
  "authorization": {
    "permissions": {
      "resourceSpecific": [
        {
          "name": "ChatMessage.Read.Chat",
          "type": "Application"
        },
        {
          "name": "ChannelMessage.Read.Group",
          "type": "Application"
        }
      ]
    }
  },
  "bots": [
    {
      "botId": "<Application (client) ID>",
      "scopes": ["personal", "team", "groupChat"],
      "supportsFiles": true
    }
  ]
}
RSC 権限は Teams アプリの manifest で宣言し、Entra の API permissions ページには追加しません。権限の範囲は、そのアプリがインストールされている対象のグループチャットまたは Team に限定されます。現在の受信メッセージの Bot コールバックに完全な添付ファイル情報が含まれていない場合、ChatMessage.Read.ChatChannelMessage.Read.Group を使用して、Graph からそのメッセージと添付ファイルを補完取得します。これらの権限を付与しても、既存の @Bot によるトリガー要件は変わりません。 標準 Team チャネルとグループチャットでは、ユーザーが明示的に @Bot をメンションする必要があります。個人チャットではメンションは不要です。

Teams Channel を作成する

Channel の作成 を呼び出し、channel_type=teams を設定して、channel_config.credentialsapp_idtenant_idclient_secret を指定します。 作成後、enabled=true かつ binding_status=bound であることを確認し、個人チャット、標準 Team チャネル、グループチャットのそれぞれでテキスト、画像、ファイルの送受信をテストします。グループチャットとチャネルでは、明示的に @Bot をメンションしたメッセージでテストしてください。
現在の Teams 連携は、テキスト、画像、ファイルメッセージとテキストベースの承認操作をサポートします。個人チャットのファイル送受信には Teams FileConsent を使用し、グループチャットと標準 Team チャネルのファイルは SharePoint/OneDrive と Bot Connector で処理します。汎用カード、プロアクティブメッセージ、会議、音声は引き続きサポートしません。グループチャットとチャネルの受信ファイル情報を補完取得するには、上記の RSC 権限が必要です。ただし、現在も個人チャットのメッセージ、または明示的に @Bot をメンションしたグループチャット / チャネルのメッセージのみを処理し、すべてのメッセージを監視するわけではありません。
Microsoft の参考ドキュメント:

関連

メッセージチャネル連携 - Qoder