次の方法で共有


Twilio Conversations チャットから Azure Communication Services に移行する

この記事では、既存の Twilio Conversations 実装を Azure Communication Services Chat SDK に移行する方法について説明します。 Twilio Conversations と、Azure Communication Services Chat SDK はクラウドベースのプラットフォームであり、開発者はこれらを使ってチャット機能を Web アプリケーションに追加することができます。

ただし、移行する場合には、プラットフォームの選択に影響したり、既存のコードを変更したりすることが必要になる可能性がある主な違いがいくつかあります。 Twilio では、チャットはマルチチャネル インスタンスである会話に埋め込まれます。 Azure Communication Services Chat SDK はチャット用の単一チャネルです。 この記事では、両方のプラットフォームの主な機能を比較し、既存の Twilio Conversations チャット実装を Azure Communication Services Chat SDK に移行する方法に関するガイダンスを提供します。

この記事では、チャット アプリケーションのトークンを管理するサービスレベルの作成については説明しません。 チャット アーキテクチャの詳細については、「チャットに関する概念」を参照してください。 アクセス トークンの詳細については、ユーザー アクセス トークンに関する記事を参照してください。

重要な考慮事項

認証およびセキュリティ

Azure Communication Services は、ID 管理のために Microsoft Entra ID と深く統合されます。 Twilio では、独自の ID システムが使用されます。 場合によっては、ユーザー認証の処理方法を見直す必要があります。

イベント処理

Twilio の Webhook ベースのアプローチでは、ACS のイベント駆動型モデルとは異なるアーキテクチャが場合によっては必要になります。

その他のサービス

お使いのアプリケーションが他の Twilio サービス (SMS や Voice など) に依存している場合、同等の Azure サービスを見つけるか、ハイブリッド ソリューションを維持する必要があります。

移行では、場合によっては、API 呼び出しの置換だけでなく、アプリケーションのアーキテクチャというもっと広い文脈の中でこれらの通信サービスとアプリケーションの対話方法を再考する必要があります。

Azure Communication Services Chat SDK で使用できる主な機能

機能 JavaScript SDK iOS SDK Android SDK .NET SDK Java SDK Python SDK
インストール ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
インポート ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
認証 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
リアルタイム メッセージング ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
送信メッセージの更新 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
グループ会話 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
直接 (一対一) の会話 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドのトピックの更新 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
参加者の追加または削除 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドの参加者の一覧 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドの削除 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット履歴の共有 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
メディア サポート (画像やファイルなど) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
メッセージ配信確認 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
入力インジケーター ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
開封確認メッセージ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
プッシュ通知 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
マルチデバイスのサポート ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
メッセージ検索 - - - - - -
メッセージ編集 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
メッセージ削除 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ユーザーのロールとアクセス許可 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
会話モデレーション ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
参加者管理 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
その他の Azure サービスとの統合 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
クライアント側暗号化 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
サーバー側メッセージ ストレージ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ボットの統合 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
カスタム メッセージ メタデータ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ユーザー プレゼンス状態 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ローカライズされた多言語サポート ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
機能のグループ 機能 Azure CLI JavaScript Java .NET Python iOS Android
コア機能 2 人以上のユーザー間のチャット スレッドを作成する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドのトピックを更新する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドの参加者を追加または削除する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
追加する参加者とチャット メッセージの履歴を共有するかどうかを選択する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドの参加者の一覧を取得する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドを削除する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Communication ユーザーを指定して、そのユーザーが属するチャット スレッドの一覧を取得する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
特定のチャット スレッドに関する情報を取得する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット スレッドでメッセージを送受信する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
送信したメッセージの内容を更新する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
以前に送信したメッセージを削除する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャットの他の参加者が確認済みメッセージの開封確認 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
参加者がチャット スレッドにメッセージを入力中であることを示す通知を受け取る ✔️ ✔️ ✔️
チャット スレッド内のすべてのメッセージを取得する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
メッセージ コンテンツの一部として Unicode の絵文字を送信する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
チャット メッセージにメタデータを追加する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
入力インジケーター通知に表示名を追加する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
リアルタイムの通知 (独自のシグナリング パッケージで対応**) チャット クライアントは、受信メッセージや、チャット スレッドで発生しているその他の操作のリアルタイム更新を取得するためにサブスクライブできます。 リアルタイム通知でサポートされている更新の一覧を確認するには、「チャットに関する概念」をご覧ください ✔️ ✔️ ✔️
通知ハブによるモバイル プッシュ通知 Chat SDK には、Azure の通知ハブを Communication Services リソースに接続して、チャット スレッドで発生した受信メッセージや他の操作に対してクライアントに通知を受け取る API が提供されます。 モバイル アプリがフォアグラウンドで実行されていない状況では、ポップアップ通知を起動 ("トースト") して、エンド ユーザーに通知するというパターンを使うことができます。「チャットに関する概念」をご覧ください。 ✔️ ✔️
レポート
(この情報は、Azure portal のお使いの Communication Services リソースの [監視] タブにあります)
Azure メトリックス エクスプローラーで公開されたメトリックを監視してチャット アプリからの API トラフィックを理解し、アラートを設定して異常を検出する ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
お使いのリソースの診断ログを有効にして、お使いの Communication Services ソリューションを監視およびデバッグする ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

前提条件

  • Azure アカウント: Azure アカウントがアクティブであることを確認してください。 新しいユーザーは、Microsoft Azure で無料アカウントを作成できます。
  • Node.js 18: Node.js 18 がシステムにインストールされていることを確認してください。 Node.js からダウンロードします。
  • Communication Services リソース: Azure portal を使用して Communication Services リソースを設定し、接続文字列をメモします。
  • Azure CLI: 指示に従って Windows に Azure CLI をインストールします。
  • ユーザー アクセス トークン: チャット クライアントのインスタンスを作成するユーザー アクセス トークンを生成します。 これは Azure CLI を使用して次のように作成できます。
az communication identity token issue --scope voip --connection-string "yourConnectionString"

詳細については、「Azure CLI を使用してアクセス トークンを作成および管理する」を参照してください。

インストール

Azure Communication Services Chat SDK をインストールする

JavaScript 用の Azure Communication Services SDK をインストールするには、npm install コマンドを使用します。

npm install @azure/communication-chat --save

--save オプションを使用すると、--save ファイル内の依存関係としてライブラリが追加されます。

プロジェクトから Twilio SDK を削除する

パッケージをアンインストールすることで、プロジェクトから Twilio SDK を削除できます。

npm uninstall twilio-conversations

オブジェクト モデル

JavaScript 用 Azure Communication Services Chat SDK が備える主な機能のいくつかは、以下のクラスとインターフェイスにより処理されます。

名前 説明
ChatClient このクラスはチャット機能に必要です。 自分のサブスクリプション情報を使用してインスタンスを生成し、それを使用してスレッドを作成、取得、削除し、チャット イベントをサブスクライブします。
ChatThreadClient このクラスはチャット スレッド機能に必要です。 ChatClient を介してインスタンスを取得し、それを使用してメッセージの送信、受信、更新、削除、ユーザーの追加、削除、取得、入力通知の送信、開封確認を行います。

チャット クライアントを初期化する

Twilio

/* Initialization */
import { Client } from '@twilio/conversations';

const token = await fetch(token_url);
const client = new Client(token);
client.on('stateChanged', (state) => {
  if (state === 'failed') {
    // The client failed to initialize
    return;
  }

  if (state === 'initialized') {
    // Use the client
  }
});

Azure Communication Services

Twilio と同様に、最初の手順は、前提条件手順の一部として生成されたアクセス トークンと Communication Service エンドポイントを取得することです。 コード内のプレースホルダーを置換します。

import { ChatClient } from '@azure/communication-chat';
import { AzureCommunicationTokenCredential } from '@azure/communication-common';

// Your unique Azure Communication service endpoint
let endpointUrl = '<replace with your resource endpoint>';
// The user access token generated as part of the pre-requisites
let userAccessToken = '<USER_ACCESS_TOKEN>';

let chatClient = new ChatClient(endpointUrl, new AzureCommunicationTokenCredential(userAccessToken));
console.log('Azure Communication Chat client created!');

チャット スレッドを開始する

Twilio

Twilio Conversations でチャット スレッドを開始します。 FriendlyName を使用し、人間が判読できる名前をこの会話に付けます。

let conversation = await client.createConversation({
    friendlyName: "Testing Chat"
});
await conversation.join();

Azure Communication Services

チャット スレッドは、createThread メソッドを使用して作成します。

createThreadRequest を使用し、スレッド要求を記述します。

  • このチャットにトピックを指定するには、topic を使用します。 UpdateThread 関数を使用してチャット スレッドを作成した後、topic を更新します。
  • チャット スレッドに追加する参加者をリストアップするには、participants を使用します。

解決されると、createChatThread メソッドから CreateChatThreadResult が返されます。 このモデルには chatThread プロパティが含まれており、そこから、新しく作成されたスレッドの id にアクセスすることができます。 その後、id を使用して ChatThreadClient のインスタンスを取得します。 次に、ChatThreadClient を使用し、メッセージの送信や参加者の一覧表示など、スレッド内で操作を実行します。

async function createChatThread() {
  const createChatThreadRequest = {
    topic: "Hello, World!"
  };
  const createChatThreadOptions = {
    participants: [
      {
        id: { communicationUserId: '<USER_ID>' },
        displayName: '<USER_DISPLAY_NAME>'
      }
    ]
  };
  const createChatThreadResult = await chatClient.createChatThread(
    createChatThreadRequest,
    createChatThreadOptions
  );
  const threadId = createChatThreadResult.chatThread.id;
  return threadId;
}

チャット スレッド クライアントを取得する

Twilio

Twilio でチャット スレッド (会話) を取得します。

if (selectedConversation) {
      conversationContent = (
        <Conversation
          conversationProxy={selectedConversation}
          myIdentity={this.state.name}
        />
      );
    } else if (status !== "success") {
      conversationContent = "Loading your conversation!";
    } else {
      conversationContent = "";
    }

Azure Communication Services

`createClient` メソッドは、既に存在するスレッドの `ChatThreadClient` を返します。 それを使用し、作成されたスレッド上で、参加者の追加やメッセージの送信などの操作を実行します。 threadId は、既存のチャット スレッドの一意の ID です。

let chatThreadClient = chatClient.getChatThreadClient(threadId);
console.log(`Chat Thread client for threadId:${threadId}`);

client.js<CREATE CHAT THREAD CLIENT> コメントの代わりにこのコードを追加し、ブラウザー タブを最新の情報に更新し、コンソールを確認します。 次のような結果が表示されます。

Chat Thread client for threadId: <threadId>

チャット スレッドに参加者としてユーザーを追加する

チャット スレッドを作成した後、そこにユーザーを追加したり、削除したりできます。 追加したユーザーには、チャット スレッドにメッセージを送信したり、他の参加者を追加、削除したりできるアクセス権が与えられます。

Twilio

チャット スレッドに参加者を追加します。

// add chat participant to the conversation by its identity
await conversation.add('identity');

// adds yourself as a conversations sdk user to this conversation
// use after creating the conversation from the SDK
await conversation.join();

conversation.on('participantJoined', (participant) => {
  // fired when a participant has joined the conversation
});

Azure Communication Services

addParticipants メソッドを呼び出す前に、そのユーザーの新しいアクセス トークンと ID が取得されることを確認します。 そのアクセス トークンは、ユーザーがチャット クライアントを初期化するために必要になります。

addParticipantsRequest は要求オブジェクトを表します。その中では、チャット スレッドに追加する参加者が participants を使用してリストアップされます。

  • id (必須) は、チャット スレッドに追加するコミュニケーション識別子です。
  • displayName (省略可) は、スレッド参加者の表示名です。
  • shareHistoryTime (省略可) は、参加者との間でチャット履歴が共有される際の起点となる時刻です。 チャット スレッドの始めから履歴を共有する場合は、スレッドの作成日時と同じかそれ以前の任意の日付にこのプロパティを設定してください。 参加者が追加された時点よりも前の履歴は共有しない場合は、現在の日付に設定します。 履歴を部分的に共有するには、目的の日付に設定します。

const addParticipantsRequest =
{
  participants: [
    {
      id: { communicationUserId: '<NEW_PARTICIPANT_USER_ID>' },
      displayName: 'Jane'
    }
  ]
};

await chatThreadClient.addParticipants(addParticipantsRequest);

NEW_PARTICIPANT_USER_ID新しいユーザー ID で置換する

チャット スレッドにメッセージを送信する

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを送信するための個別の機能はありません。

Twilio

Twilio でテキスト メッセージを送信するには。

// Send Text Message
await conversation
  .prepareMessage()
  .setBody('Hello!')
  .setAttributes({foo: 'bar'})
  .build()
  .send();

Twilio でメディアを送信するには。

 const file =
  await fetch("https://v.fastcdn.co/u/ed1a9b17/52533501-0-logo.svg");
const fileBlob = await file.blob();
// Send a media message
const sendMediaOptions = {
    contentType: file.headers.get("Content-Type"),
    filename: "twilio-logo.svg",
    media: fileBlob
};

await conversation
  .prepareMessage()
  .setBody('Here is some media!')
  .addMedia(sendMediaOptions);

Azure Communication Services

threadId で識別されるスレッドにメッセージを送信するには、sendMessage メソッドを使用します。

メッセージ要求は、sendMessageRequest を使用して記述します。

  • チャット メッセージの内容は、content を使用して設定します。

sendMessageOptions を使用し、操作の省略可能なパラメーターを記述します。

  • 送信者の表示名を指定するには、senderDisplayName を使用します。
  • type を使用し、texthtml などのメッセージの種類を指定します。

Twilio で "Media" プロパティを再作成するには。

  • 必要に応じて、metadata を使用して、メッセージと共に送信するその他のデータを含めます。 このフィールドによって開発者はチャット メッセージ機能を拡張したり、ユース ケースに合わせてカスタム情報を追加したりできます。 たとえば、メッセージ内でファイル リンクを共有する場合、hasAttachment: true をメタデータに追加することで、受信者のアプリケーションがそれを解析して適切に表示できます。 詳細については、「ファイル共有」を参照してください。

SendChatMessageResult は、メッセージの送信から返される応答です。 これには、ID (そのメッセージの一意の ID) が含まれています。

const sendMessageRequest =
{
  content: 'Please take a look at the attachment'
};
let sendMessageOptions =
{
  senderDisplayName : 'Jack',
  type: 'text',
  metadata: {
    'hasAttachment': 'true',
    'attachmentUrl': 'https://contoso.com/files/attachment.docx'
  }
};
const sendChatMessageResult = await chatThreadClient.sendMessage(sendMessageRequest, sendMessageOptions);
const messageId = sendChatMessageResult.id;
console.log(`Message sent!, message id:${messageId}`);

チャット スレッドからチャット メッセージを受信する

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを受信するための個別の機能はありません。 Azure Communication Services は Azure Event Grid を使用してイベントを処理します。 詳細は、イベント処理に関する記事を参照してください。

Twilio

Twilio でテキスト メッセージを受信するには。

// Receive text message
 let paginator =
  await conversation.getMessages(
    30,0,"backwards"
  );

const messages = paginator.items;

Twilio でメディアを受信するには。

// Receive media
// Return all media attachments (possibly empty array), without temporary urls
const media = message.attachedMedia;

// Get a temporary URL for the first media returned by the previous method
const mediaUrl = await media[0].getContentTemporaryUrl();

Azure Communication Services

リアルタイム シグナリングを使用すると、新しい受信メッセージをサブスクライブしてリッスンし、それに応じてメモリ内の現在のメッセージを更新することができます。 Azure Communication Services は、[サブスクライブ可能な一連のイベント](../../../concepts/chat/concepts.md#real-time-notifications)をサポートしています。

// open notifications channel
await chatClient.startRealtimeNotifications();
// subscribe to new notification
chatClient.on("chatMessageReceived", (e) => {
  console.log("Notification chatMessageReceived!");
  // your code here
});

チャット メッセージは、特定の間隔で `listMessages` メソッドをポーリングすることによって取得することもできます。


const messages = chatThreadClient.listMessages();
for await (const message of messages) {
   // your code here
}

listMessages では、chatMessage.type で識別できるさまざまな種類のメッセージが返されます。

詳細については、「メッセージの種類」を参照してください。

リアル タイム通知の接続状態をサブスクライブする

Twilio と同様に、Azure Communication Services ではイベント通知をサブスクライブできます。

イベント realTimeNotificationConnected および realTimeNotificationDisconnected をサブスクライブすると、呼び出しサーバーへの接続がアクティブになっている状態がわかります。

// subscribe to realTimeNotificationConnected event
chatClient.on('realTimeNotificationConnected', () => {
  console.log("Real time notification is now connected!");
  // your code here
});
// subscribe to realTimeNotificationDisconnected event
chatClient.on('realTimeNotificationDisconnected', () => {
  console.log("Real time notification is now disconnected!");
  // your code here
});

前提条件

概念上の相違点

Twilio Conversations と Azure Communication Services Chat はどちらも同様の機能を提供しますが、その実装は、周囲のエコシステムと基盤のプラットフォームの方針に起因して異なります。 Twilio Conversations からはマルチチャネル通信 API が提供されます。 Azure Communication Services Chat の基軸は主に Azure エコシステム内のチャットです。 この移行ガイドは Twilio の一般的な操作と Azure Communication Services Chat での同等の操作の間の基本的なマッピングを提供するものであり、.NET コードの移行に役立ちます。

ID

Twilio

Twilio Conversations では、ID 文字列が直接使用されます。

Azure Communication Services

Azure Communication Services では、CommunicationIdentityClient を使用してユーザーを作成する必要があります。

設定

パッケージをインストールする

Twilio Conversations チャットからの移行を開始するには、最初の手順として、.NET 用の Azure Communication Services Chat SDK をプロジェクトにインストールします。

dotnet add package Azure.Communication.Chat

オブジェクト モデル

C# 用 Azure Communication Services Chat SDK が備える主な機能のいくつかは、以下のクラスにより処理されます。

名前 説明
ChatClient このクラスは、チャット機能に必要となります。 サブスクリプション情報を使用してインスタンス化し、それを使用してスレッドを作成、取得、削除します。
ChatThreadClient このクラスは、チャット スレッド機能に必要となります。 ChatClient を介してインスタンスを取得し、それを使用して、メッセージの送信、受信、更新、削除、参加者の追加、削除、取得、入力通知の送信、開封確認を行います。

チャット クライアントを作成する

Twilio

Twilio では、アカウント資格情報を使用して Twilio クライアントを設定する必要があります。

var twilio = new TwilioRestClient(accountSid, authToken);

Azure Communication Services

Azure Communication Services でチャット クライアントを作成するには、Communication Services エンドポイントと、前提条件の手順で生成されたアクセス トークンを使用します。 ユーザーを作成し、トークンを発行して自分のチャット クライアントに渡すには、Identity SDK の CommunicationIdentityClient クラスを使用する必要があります。

詳細については、ユーザー アクセス トークンに関するページを参照してください。

// Your unique Azure Communication service endpoint
Uri endpoint = new Uri("<replace with your resource endpoint>");
CommunicationTokenCredential communicationTokenCredential = new CommunicationTokenCredential(<Access_Token>);
ChatClient chatClient = new ChatClient(endpoint, communicationTokenCredential);

チャット スレッドを開始する

Twilio Conversations

var conversation = ConversationResource.Create(
    friendlyName: "My Conversation",
    messagingServiceSid: "<MessagingServiceSid>"
);

Azure Communication Services

Azure Communication Services では、Twilio での会話と同等のスレッドを作成します。

チャット スレッドを作成するには、chatClient で createChatThread メソッドを使用します。

  • このチャットにトピックを指定するには、topic を使用します。UpdateTopic 関数を使用してチャット スレッドを作成した後に topic を更新できます。
  • participants プロパティを使用して、チャット スレッドに追加する ChatParticipant オブジェクトのリストを渡します。 CommunicationIdentifier オブジェクトを使用して ChatParticipant オブジェクトを初期化します。 CommunicationIdentifier の型には、CommunicationUserIdentifierMicrosoftTeamsUserIdentifier、または PhoneNumberIdentifier が想定されます。 たとえば、CommunicationIdentifier オブジェクトを取得するには、「ユーザーの作成」の手順に従って作成したアクセス ID を渡す必要があります。

createChatThread メソッドからの応答オブジェクトには、chatThread の詳細が含まれています。 チャット スレッドの操作 (参加者の追加、メッセージの送信、メッセージの削除など) とやり取りするには、ChatClient クライアントで GetChatThreadClient メソッドを使用し、chatThreadClient クライアント インスタンスのインスタンスを作成します。

var chatParticipant = new ChatParticipant(identifier: new CommunicationUserIdentifier(id: "<Access_ID>"))
{
    DisplayName = "UserDisplayName"
};
CreateChatThreadResult createChatThreadResult = await chatClient.CreateChatThreadAsync(topic: "Hello world!", participants: new[] { chatParticipant });
ChatThreadClient chatThreadClient = chatClient.GetChatThreadClient(threadId: createChatThreadResult.ChatThread.Id);
string threadId = chatThreadClient.Id;

チャット スレッド クライアントを取得する

Twilio

Twilio Conversations では、会話の SID (一意識別子) を使用して会話と直接やり取りします。 会話を取得して対話する方法は通常、次のようになります。

var conversationSid = "<CONVERSATION_SID>";
var conversation = ConversationResource.Fetch(pathSid: conversationSid);

// Example: Fetching all messages in the conversation
var messages = MessageResource.Read(pathConversationSid: conversationSid);
foreach (var message in messages)
{
    Console.WriteLine(message.Body);
}

Azure Communication Services

GetChatThreadClient メソッドは、既に存在するスレッドのスレッド クライアントを返します。 それを使用し、作成されたスレッド上で、メンバーの追加やメッセージの送信などの操作を実行できます。 threadId は、既存のチャット スレッドの一意の ID です。

string threadId = "<THREAD_ID>";
ChatThreadClient chatThreadClient = chatClient.GetChatThreadClient(threadId: threadId);

すべてのチャット スレッドを一覧表示する

Twilio

Twilio Conversations では、UserConversations リソースにクエリを実行することで、ユーザーが参加しているすべての会話を取得できます。 このリソースからは、特定のユーザーの会話の一覧が提供されます。

/ Initialize Twilio Client
string accountSid = "<YOUR_ACCOUNT_SID>";
string authToken = "<YOUR_AUTH_TOKEN>";
TwilioClient.Init(accountSid, authToken);

// The identity of the user you're querying
string userIdentity = "user@example.com";

// Retrieve all conversations the user is part of
var userConversations = UserConversationResource.Read(pathUserSid: userIdentity);

foreach (var userConversation in userConversations)
{
    Console.WriteLine($"Conversation SID: {userConversation.ConversationSid}");
    // You can fetch more details about the conversation if needed
    var conversation = Twilio.Rest.Conversations.V1.ConversationResource.Fetch(pathSid: userConversation.ConversationSid);
    Console.WriteLine($"Conversation Friendly Name: {conversation.FriendlyName}");
}

Azure Communication Services

ユーザーが属しているすべてのチャット スレッドを取得するには、GetChatThreads を使用します。

AsyncPageable<ChatThreadItem> chatThreadItems = chatClient.GetChatThreadsAsync();
await foreach (ChatThreadItem chatThreadItem in chatThreadItems)
{
    Console.WriteLine($"{ chatThreadItem.Id}");
}

チャット スレッドにメッセージを送信する

Twilio

次のコード スニペットからは、テキスト メッセージの送信方法がわかります。

var message = MessageResource.Create(
    body: "Hello, world!",
    from: "user@example.com",
    pathConversationSid: conversation.Sid
);

次のコード スニペットからは、メディア ファイルの送信方法がわかります。

// The SID of the conversation you want to send the media message to
string conversationSid = "<CONVERSATION_SID>";

// The URL of the media file you want to send
var mediaUrl = new List<Uri>
{
    new Uri("https://example.com/path/to/media/file.jpg") // Replace with your actual media URL
};

// Send the media message
var message = MessageResource.Create(
    body: "Here is an image for you!",
    from: "user@example.com", // Sender's identity (optional)
    mediaUrl: mediaUrl,
    pathConversationSid: conversationSid
);

Azure Communication Services

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを送信するための個別の機能はありません。

スレッドにメッセージを送信するには、SendMessage を使用します。

  • メッセージの内容を提供するには、content を使用します (必須)。
  • TextHtml などのメッセージのコンテンツの種類には type を使用します。 指定しない場合の既定は、Text です。
  • 送信者の表示名を指定するには、senderDisplayName を使用します。 指定されない場合、空の文字列が既定になります。
  • メッセージと共に送信するデータが他にあれば、必要に応じて metadata を使用してそのデータを含めます。 このフィールドは、開発者がチャット メッセージ機能を拡張し、ユース ケースに応じたカスタム情報を追加するためのメカニズムを提供します。 たとえば、メッセージ内でファイル リンクを共有する場合、hasAttachment:true をメタデータに追加することで、受信者のアプリケーションがそれを解析して適切に表示できます。
SendChatMessageOptions sendChatMessageOptions = new SendChatMessageOptions()
{
    Content = "Please take a look at the attachment",
    MessageType = ChatMessageType.Text
};
sendChatMessageOptions.Metadata["hasAttachment"] = "true";
sendChatMessageOptions.Metadata["attachmentUrl"] = "https://contoso.com/files/attachment.docx";

SendChatMessageResult sendChatMessageResult = await chatThreadClient.SendMessageAsync(sendChatMessageOptions);

string messageId = sendChatMessageResult.Id;

チャット スレッドからチャット メッセージを受信する

Twilio

Twilio では通常、Webhook を使用して受信メッセージをサーバーに通知します。

次のコード スニペットからは、テキスト メッセージを受信する方法がわかります。

public IActionResult ReceiveMessage()
{
    var incomingMessage = Request.Form["Body"];
    // Process the incoming message
    return Ok();
}

次のコード スニペットからは、メディア ファイルを受信する方法がわかります。

 for (var i = 0; i < numMedia; i++)
            {
                var mediaUrl = Request.Form[$"MediaUrl{i}"];
                Trace.WriteLine(mediaUrl);
                var contentType = Request.Form[$"MediaContentType{i}"];

                var filePath = GetMediaFileName(mediaUrl, contentType);
                await DownloadUrlToFileAsync(mediaUrl, filePath);
            }

Azure Communication Services

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを受信するための個別の機能はありません。

Azure Communication Services Chat を使用すると、アプリケーション内でイベントを直接サブスクライブできます。

チャット メッセージは、チャット スレッド クライアントで、特定の間隔で GetMessages メソッドをポーリングすることによって取得できます。

AsyncPageable<ChatMessage> allMessages = chatThreadClient.GetMessagesAsync();
await foreach (ChatMessage message in allMessages)
{
    Console.WriteLine($"{message.Id}:{message.Content.Message}");
}

GetMessages には、省略可能な DateTimeOffset パラメーターがあります。 そのオフセットが指定されている場合、その後に受信、更新、または削除されたメッセージを受信します。 オフセット時刻よりも前に受信したものの、その後で編集または削除されたメッセージも返されます。

GetMessages は、メッセージに対して UpdateMessageDeleteMessage を使用して行われた編集や削除を含む、最新バージョンのメッセージを返します。 削除されたメッセージについては、そのメッセージがいつ削除されたかを示す datetime 値が chatMessage.DeletedOn から返されます。 編集されたメッセージについては、メッセージがいつ編集されたかを示す datetime が chatMessage.EditedOn から返されます。 メッセージの最初の作成日時に chatMessage.CreatedOn を使用してアクセスし、それをメッセージの並べ替えに使用できます。

GetMessages からは、chatMessage.Type で識別できるさまざまな種類のメッセージが返されます。 次の種類があります。

  • Text:スレッド メンバーによって送信された通常のチャット メッセージ。

  • Html:書式設定されたテキスト メッセージ。 Communication Services ユーザーは現在、RichText メッセージを送信できないことに注意してください。 このメッセージ型は、Teams の相互運用シナリオで、Teams ユーザーから Communication Services ユーザーに送信されるメッセージでサポートされています。

  • TopicUpdated:トピックが更新されたことを示すシステム メッセージ。 (読み取り専用)

  • ParticipantAdded: 1 人以上の参加者がチャット スレッドに追加されたことを示すシステム メッセージ。 (読み取り専用)

  • ParticipantRemoved:参加者がチャット スレッドから削除されたことを示すシステム メッセージ。

詳細については、「メッセージの種類」を参照してください。

チャット スレッドに参加者としてユーザーを追加する

Twilio

var participant = ParticipantResource.Create(
    pathConversationSid: conversation.Sid,
    identity: "user@example.com"
);

Azure Communication Services

Azure Communication Services では、チャット スレッドの作成時またはその後に参加者を追加します。

スレッドを作成した後、ユーザーを追加したり、削除したりできます。 追加したユーザーには、スレッドにメッセージを送信したり、他の参加者を追加、削除したりできるアクセス権が与えられます。 AddParticipants を呼び出す前に、そのユーザーの新しいアクセス トークンと ID が取得されることを確認します。 アクセス トークンは、ユーザーがチャット クライアントを初期化するために必要になります。

チャット スレッドに 1 人以上の参加者を追加するには、AddParticipants を使用します。 各スレッド参加者でサポートされている属性は次のとおりです。

  • `id` (必須) は、スレッド参加者の ID です。
  • displayName (省略可) は、スレッド参加者の表示名です。
  • shareHistoryTime (省略可) は、参加者との間でチャット履歴が共有される際の起点となる時刻です。
var josh = new CommunicationUserIdentifier(id: "<Access_ID_For_Josh>");
var gloria = new CommunicationUserIdentifier(id: "<Access_ID_For_Gloria>");
var amy = new CommunicationUserIdentifier(id: "<Access_ID_For_Amy>");

var participants = new[]
{
    new ChatParticipant(josh) { DisplayName = "Josh" },
    new ChatParticipant(gloria) { DisplayName = "Gloria" },
    new ChatParticipant(amy) { DisplayName = "Amy" }
};

await chatThreadClient.AddParticipantsAsync(participants: participants);

スレッド参加者を取得する

Twilio

Twilio Conversations では、ConversationResource を使用して特定の会話の参加者を取得します。 その後、その会話に関連付けられているすべての参加者を一覧表示できます。

// The SID of the conversation you want to retrieve participants from
string conversationSid = "<CONVERSATION_SID>";

// Retrieve all participants in the conversation
var participants = ParticipantResource.Read(pathConversationSid: conversationSid);

// Output details of each participant
foreach (var participant in participants)
{
    Console.WriteLine($"Participant SID: {participant.Sid}");
            
}

Azure Communication Services

チャット スレッドの参加者を取得するには、GetParticipants を使用します。

AsyncPageable<ChatParticipant> allParticipants = chatThreadClient.GetParticipantsAsync();
await foreach (ChatParticipant participant in allParticipants)
{
    Console.WriteLine($"{((CommunicationUserIdentifier)participant.User).Id}:{participant.DisplayName}:{participant.ShareHistoryTime}");
}

開封確認メッセージを送信する

Twilio
// Find your Account SID and Auth Token at twilio.com/console
        // and set the environment variables. See http://twil.io/secure
        string accountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
        string authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");

        TwilioClient.Init(accountSid, authToken);

        var message = await MessageResource.FetchAsync(
            pathConversationSid: "CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            pathSid: "IMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

        Console.WriteLine(message.Delivery);
    }

Azure Communication Services

メッセージがユーザーに読まれたことを他の参加者に通知するには、SendReadReceipt を使用します。

await chatThreadClient.SendReadReceiptAsync(messageId: messageId);

前提条件

  • Azure アカウント: Azure アカウントがアクティブであることを確認してください。 新しいユーザーは、Microsoft Azure で無料アカウントを作成できます。
  • Communication Services リソース: Azure portal を使用して Communication Services リソースを設定し、接続文字列をメモします。
  • Azure CLI: 指示に従って Windows に Azure CLI をインストールします。
  • ユーザー アクセス トークン: 通話クライアントのインスタンスを作成するユーザー アクセス トークンを生成します。 これは Azure CLI を使用して次のように作成できます。
az communication identity token issue --scope voip --connection-string "yourConnectionString"

詳細については、「Azure CLI を使用してアクセス トークンを作成および管理する」を参照してください。

インストール

ライブラリをインストールする

Twilio Conversations Chat からの移行を開始するには、最初の手順として、iOS 用の Azure Communication Services Chat SDK をプロジェクトにインストールします。 これらのパラメーターは、CocoaPods を使用して構成できます。

  1. アプリケーションのポッドファイルを作成します。 ターミナルを開き、プロジェクト フォルダーに移動し、次を実行します。

pod init

  1. ポッドファイルに次のコードを追加して保存します ("target" がプロジェクトの名前と一致していることを確認してください)。
pod 'AzureCommunicationChat', '~> 1.3.5'
  1. .xcworkspace プロジェクトのセットアップします。
pod install
  1. Xcode の pod インストールによって作成された .xcworkspace を開きます。

SDK に対する認証

Azure Communication Services Chat SDK を使用するには、アクセス トークンを使用して認証する必要があります。

Twilio

次のコード スニペットは、Twilio Services 用の有効なアクセス トークンが利用できることを前提としています。

static func getTokenUrlFromDefaults(identity: String, password: String) -> URL? {
        // Get token service absolute URL from settings
        guard let tokenServiceUrl = UserDefaults.standard.string(forKey: "ACCESS_TOKEN_SERVICE_URL"), !tokenServiceUrl.isEmpty else {
            return nil
        }
        return constructLoginUrl(tokenServiceUrl, identity: identity, password: password)
    }

Azure Communication Services

次のコード スニペットは、CallClient を開始するために有効なアクセス トークンが必要です。

有効なトークンが必要です。 詳細については、「アクセス トークンの作成と管理」を参照してください。

// Create an instance of CallClient 
let callClient = CallClient() 
 
// A reference to the call agent, it will be initialized later 
var callAgent: CallAgent? 
 
// Embed the token in a CommunicationTokenCredential object 
let userCredential = try? CommunicationTokenCredential(token: "<USER_TOKEN>") 
 
// Create a CallAgent that will be used later to initiate or receive calls 
callClient.createCallAgent(userCredential: userCredential) { callAgent, error in 
 if error != nil { 
        // Raise the error to the user and return 
 } 
 self.callAgent = callAgent         
} 

チャット クライアントを初期化する

Twilio

次のコード スニペットでは、Twilio でチャット クライアントが初期化されます。

func fetchAccessTokenAndInitializeClient() {
        let identity = "user_identity" // Replace with actual user identity
        let urlString = "http://localhost:3000/token?identity=\(identity)"
        
        guard let url = URL(string: urlString) else { return }
        
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil else {
                print("Error fetching token: \(String(describing: error))")
                return
            }
            
            do {
                if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
                   let token = json["token"] as? String {
                    self.initializeConversationsClient(withToken: token)
                }
            } catch {
                print("Error parsing token JSON: \(error)")
            }
        }
        
        task.resume()
    }
```m = TwilioVideoSDK.connect(options: connectOptions, delegate: self)

Azure Communication Services

チャット クライアントを作成するには、Communication Services エンドポイントと、前提条件の手順で生成されたアクセス トークンを使用します。

`` を、実際の Azure Communication Services リソースのエンドポイントに置き換えます。 `` を 有効な Communication Services アクセス トークンに置き換えます。

let endpoint = "<ACS_RESOURCE_ENDPOINT>"
let credential =
try CommunicationTokenCredential(
    token: "<ACCESS_TOKEN>"
)
let options = AzureCommunicationChatClientOptions()

let chatClient = try ChatClient(
    endpoint: endpoint,
    credential: credential,
    withOptions: options
)

オブジェクト モデル

iOS 用 Azure Communication Services Chat SDK が備える主な機能のいくつかは、以下のクラスとインターフェイスにより処理されます。

名前 説明
ChatClient このクラスはチャット機能に必要です。 サブスクリプション情報を使用してインスタンス化し、それを使用してスレッドを作成、取得、削除し、チャット イベントにサブスクライブします。
ChatThreadClient このクラスはチャット スレッド機能に必要です。 ChatClient を介してインスタンスを取得し、それを使用してメッセージを送信、受信、更新、削除します。 これを使用してユーザーの追加、削除、取得、入力通知と開封確認メッセージの送信を行うこともできます。

チャット スレッドを開始する

Twilio

次のコード スニペットでは、新しいチャット スレッドを作成できます。

    // the unique name of the conversation you create
    private let uniqueConversationName = "general"

    // For the quickstart, this will be the view controller
    weak var delegate: QuickstartConversationsManagerDelegate?

    // MARK: Conversations variables
    private var client: TwilioConversationsClient?
    private var conversation: TCHConversation?
    private(set) var messages: [TCHMessage] = []
    private var identity: String?

    func conversationsClient(_ client: TwilioConversationsClient, synchronizationStatusUpdated status: TCHClientSynchronizationStatus) {
        guard status == .completed else {
            return
        }

        checkConversationCreation { (_, conversation) in
           if let conversation = conversation {
               self.joinConversation(conversation)
           } else {
               self.createConversation { (success, conversation) in
                   if success, let conversation = conversation {
                       self.joinConversation(conversation)
                   }
               }
           }
        }

Azure Communication Services

チャット スレッドの作成から返された応答が CreateChatThreadResult です。 これには、ChatThreadProperties オブジェクトである chatThread プロパティが含まれています。 このオブジェクトには threadId が含まれています。これは、作成されたスレッドに対する操作 (参加者の追加やメッセージの送信など) を実行するための ChatThreadClient を取得するために使用できます。

コメント <CREATE A CHAT THREAD> を次のコード スニペットに置換します。

let request = CreateChatThreadRequest(
    topic: "Quickstart",
    participants: [
        ChatParticipant(
            id: CommunicationUserIdentifier("<USER_ID>"),
            displayName: "Jack"
        )
    ]
)

var threadId: String?
chatClient.create(thread: request) { result, _ in
    switch result {
    case let .success(result):
        threadId = result.chatThread?.id

    case .failure:
        fatalError("Failed to create thread.")
    }
    semaphore.signal()
}
semaphore.wait()

`` は、有効な Communication Services のユーザー ID に置き換えます。

ここで、セマフォを使用して、処理を続行する前に完了ハンドラーを待機します。 後続の手順で、完了ハンドラーに返された応答の threadId を使用します。

チャット スレッド クライアントを取得する

Twilio

次のコード スニペットからは、Twilio でチャット スレッド クライアントを取得する方法がわかります。

func conversationsClient(_ client: TwilioConversationsClient, synchronizationStatusUpdated status: TCHClientSynchronizationStatus) {
        guard status == .completed else {
            return
        }

        checkConversationCreation { (_, conversation) in
           if let conversation = conversation {
               self.joinConversation(conversation)
           } else {
               self.createConversation { (success, conversation) in
                   if success, let conversation = conversation {
                       self.joinConversation(conversation)
                   }
               }
           }
        }
    }

Azure Communication Services

`createClient` メソッドは、既に存在するスレッドの `ChatThreadClient` を返します。 それを使用し、作成されたスレッド上で、参加者の追加やメッセージの送信などの操作を実行できます。

threadId は、既存のチャット スレッドの一意の ID です。

`` コメントを、次のコードに置き換えます。

let chatThreadClient = try chatClient.createClient(forThread: threadId!)

チャット スレッドにメッセージを送信する

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを送信するための個別の機能はありません。

Twilio

Twilio で通常のテキスト メッセージを送信します。

    func sendMessage(_ messageText: String,
                     completion: @escaping (TCHResult, TCHMessage?) -> Void) {

        let messageOptions = TCHMessageOptions().withBody(messageText)
        conversation?.sendMessage(with: messageOptions, completion: { (result, message) in
            completion(result, message)
        })

    }

Twilio でメディアを送信します。

/ The data for the image you would like to send
let data = Data()

// Prepare the message and send it
self.conversation.prepareMessage
    .addMedia(data: data, contentType: "image/jpeg", filename: "image.jpg", listener: .init(onStarted: {
        // Called when upload of media begins.
        print("Media upload started")
    }, onProgress: { bytes in
        // Called as upload progresses, with the current byte count.
        print("Media upload progress: \(bytes)")
    }, onCompleted: { sid in
        // Called when upload is completed, with the new mediaSid if successful.
        // Full failure details will be provided through sendMessage's completion.
        print("Media upload completed")
    }, onFailed: { error in
        // Called when upload is completed, with the new mediaSid if successful.
        // Full failure details will be provided through sendMessage's completion.
        print("Media upload failed with error: \(error)")
    }))
    .buildAndSend { result, message in
        if !result.isSuccessful {
            print("Creation failed: \(String(describing: result.error))")
        } else {
            print("Creation successful")
        }
    }

Azure Communication Services

threadId で識別されるスレッドにメッセージを送信するには、send メソッドを使用します。

SendChatMessageRequest を使用し、メッセージ要求を記述します。

  • チャット メッセージの内容は、content を使用して設定します。
  • 送信者の表示名を指定するには、senderDisplayName を使用します。
  • type を使用し、texthtml などのメッセージの種類を指定します。
  • メッセージと共に送信する情報が他にあれば、必要に応じて metadata を使用してその情報を含めます。 このフィールドは、開発者がチャット メッセージ機能を拡張し、ユース ケースに応じたカスタム情報を追加するためのメカニズムを提供します。 たとえば、メッセージ内でファイル リンクを共有する場合、hasAttachment:true をメタデータに追加することで、受信者のアプリケーションがそれを解析して適切に表示できます。

メッセージの送信から返される応答は SendChatMessageResult です。 これには、ID (そのメッセージの一意の ID) が含まれています。

コメント <SEND A MESSAGE> を次のコード スニペットに置換します。

let message = SendChatMessageRequest(
                        content: "Hello!",
                        senderDisplayName: "Jack",
                        type: .text,
                        metadata: [
                            "hasAttachment": "true",
                            "attachmentUrl": "https://contoso.com/files/attachment.docx"
                        ]
                    )

var messageId: String?

chatThreadClient.send(message: message) { result, _ in
    switch result {
    case let .success(result):
        print("Message sent, message id: \(result.id)")
        messageId = result.id
    case .failure:
        print("Failed to send message")
    }
    semaphore.signal()
}
semaphore.wait()

チャット スレッドからチャット メッセージを受信する

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを受信するための個別の機能はありません。

Twilio

次のコード スニペットからは、Twilio でテキスト メッセージを受信する方法がわかります。

// Called whenever a conversation we've joined receives a new message
    func conversationsClient(_ client: TwilioConversationsClient, conversation: TCHConversation,
                    messageAdded message: TCHMessage) {
        messages.append(message)

        // Changes to the delegate should occur on the UI thread
        DispatchQueue.main.async {
            if let delegate = self.delegate {
                delegate.reloadMessages()
                delegate.receivedNewMessage()
            }
        }
    }

Twilio でメディアを受信します。

conversationsClient.getTemporaryContentUrlsForMedia(message.attachedMedia) { result, mediaSidToUrlMap in
    guard result.isSuccessful else {
        print("Couldn't get temporary urls with error: \(String(describing: result.error))")
        return
    }

    for (sid, url) in sidToUrlMap {
        print("\(sid) -> \(url)")
    }
}

Azure Communication Services

リアルタイム シグナリングを使用すると、新しい受信メッセージをサブスクライブしてリッスンし、それに応じてメモリ内の現在のメッセージを更新することができます。 Azure Communication Services は、[サブスクライブ可能な一連のイベント](../../../concepts/chat/concepts.md#real-time-notifications)をサポートしています。

コメント <RECEIVE MESSAGES> を、次のコードに置き換えます。 通知を有効にした後、新しいメッセージを送信して ChatMessageReceivedEvents を確認してみてください。

chatClient.startRealTimeNotifications { result in
    switch result {
    case .success:
        print("Real-time notifications started.")
    case .failure:
        print("Failed to start real-time notifications.")
    }
    semaphore.signal()
}
semaphore.wait()

chatClient.register(event: .chatMessageReceived, handler: { response in
    switch response {
    case let .chatMessageReceivedEvent(event):
        print("Received a message: \(event.message)")
    default:
        return
    }
})

チャット メッセージは、特定の間隔で `listMessages` メソッドをポーリングすることによって取得することもできます。 listMessages に対して次のコード スニペットを実行します。

chatThreadClient.listMessages { result, _ in
    switch result {
    case let .success(messagesResult):
        guard let messages = messagesResult.pageItems else {
            print("No messages returned.")
            return
        }

        for message in messages {
            print("Received message with id: \(message.id)")
        }

    case .failure:
        print("Failed to receive messages")
    }
    semaphore.signal()
}
semaphore.wait()

プッシュ通知

Twilio と同様に、Azure Communication Services では、プッシュ通知がサポートされています。 プッシュ通知では、モバイル アプリがフォアグラウンドで動作していない場合、チャット スレッドでメッセージの着信をユーザーに通知します。

現在、Notification Hub を使用したチャット プッシュ通知の送信は、iOS SDK バージョン 1.3.0 でサポートされています。

詳細については、「チャット アプリでプッシュ通知を有効にする」を参照してください。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウントを作成します。 詳細については、アカウントの無料作成に関するページを参照してください。

  • Visual Studio のインストール。

  • Azure Communication Services リソースを作成します。 詳細については、Azure Communication Services リソースの作成に関するページを参照してください。 リソースのエンドポイントと接続文字列をメモします。

  • ユーザー アクセス トークン。 スコープを必ず chat に設定し、トークン文字列と user_id 文字列をメモします。 Azure CLI を使用し、接続文字列を指定して次のコマンドを実行して、ユーザーとアクセス トークンを作成することもできます。

    az communication identity token issue --scope chat --connection-string "yourConnectionString"
    

    詳細については、「Azure CLI を使用してアクセス トークンを作成および管理する」を参照してください。

概念上の相違点

Twilio Conversations と Azure Communication Services Chat はどちらも同様の機能を提供しますが、その実装は、周囲のエコシステムと基盤のプラットフォームの方針に起因して異なります。 Twilio Conversations からはマルチチャネル通信 API が提供されます。 Azure Communication Services Chat の基軸は主に Azure エコシステム内のチャットです。 この移行ガイドは Twilio の一般的な操作と Azure Communication Services Chat での同等の操作の間の基本的なマッピングを提供するものであり、.NET コードの移行に役立ちます。

ID

Twilio

Twilio Conversations では、ID 文字列が直接使用されます。

Azure Communication Services

Azure Communication Services では、CommunicationIdentityClient を使用してユーザーを作成する必要があります。

設定

パッケージをインストールする

Twilio Conversations チャットからの移行を開始するには、最初の手順として、.NET 用の Azure Communication Services Chat SDK をプロジェクトにインストールします。

dotnet add package Azure.Communication.Chat

オブジェクト モデル

C# 用 Azure Communication Services Chat SDK が備える主な機能のいくつかは、以下のクラスにより処理されます。

名前 説明
ChatClient このクラスは、チャット機能に必要となります。 サブスクリプション情報を使用してインスタンス化し、それを使用してスレッドを作成、取得、削除します。
ChatThreadClient このクラスは、チャット スレッド機能に必要となります。 ChatClient を介してインスタンスを取得し、それを使用して、メッセージの送信、受信、更新、削除、参加者の追加、削除、取得、入力通知の送信、開封確認を行います。

チャット クライアントを作成する

Twilio

Twilio では、アカウント資格情報を使用して Twilio クライアントを設定する必要があります。

var twilio = new TwilioRestClient(accountSid, authToken);

Azure Communication Services

Azure Communication Services でチャット クライアントを作成するには、Communication Services エンドポイントと、前提条件の手順で生成されたアクセス トークンを使用します。 ユーザーを作成し、トークンを発行して自分のチャット クライアントに渡すには、Identity SDK の CommunicationIdentityClient クラスを使用する必要があります。

詳細については、ユーザー アクセス トークンに関するページを参照してください。

// Your unique Azure Communication service endpoint
Uri endpoint = new Uri("<replace with your resource endpoint>");
CommunicationTokenCredential communicationTokenCredential = new CommunicationTokenCredential(<Access_Token>);
ChatClient chatClient = new ChatClient(endpoint, communicationTokenCredential);

チャット スレッドを開始する

Twilio Conversations

var conversation = ConversationResource.Create(
    friendlyName: "My Conversation",
    messagingServiceSid: "<MessagingServiceSid>"
);

Azure Communication Services

Azure Communication Services では、Twilio での会話と同等のスレッドを作成します。

チャット スレッドを作成するには、chatClientcreateChatThread メソッドを使用します。

  • このチャットにトピックを指定するには、topic を使用します。UpdateTopic 関数を使用してチャット スレッドを作成した後に topic を更新できます。
  • participants プロパティを使用して、チャット スレッドに追加する ChatParticipant オブジェクトのリストを渡します。 CommunicationIdentifier オブジェクトを使用して ChatParticipant オブジェクトを初期化します。 CommunicationIdentifier の型には、CommunicationUserIdentifierMicrosoftTeamsUserIdentifier、または PhoneNumberIdentifier が想定されます。 たとえば、CommunicationIdentifier オブジェクトを取得するには、「ユーザーの作成」の手順に従って作成したアクセス ID を渡す必要があります。

createChatThread メソッドからの応答オブジェクトには、chatThread の詳細が含まれています。 チャット スレッドの操作 (参加者の追加、メッセージの送信、メッセージの削除など) とやり取りするには、ChatClient クライアントで GetChatThreadClient メソッドを使用し、chatThreadClient クライアント インスタンスのインスタンスを作成します。

var chatParticipant = new ChatParticipant(identifier: new CommunicationUserIdentifier(id: "<Access_ID>"))
{
    DisplayName = "UserDisplayName"
};
CreateChatThreadResult createChatThreadResult = await chatClient.CreateChatThreadAsync(topic: "Hello world!", participants: new[] { chatParticipant });
ChatThreadClient chatThreadClient = chatClient.GetChatThreadClient(threadId: createChatThreadResult.ChatThread.Id);
string threadId = chatThreadClient.Id;

チャット スレッド クライアントを取得する

Twilio

Twilio Conversations では、会話の SID (一意識別子) を使用して会話と直接やり取りします。 会話を取得して対話する方法は通常、次のようになります。

var conversationSid = "<CONVERSATION_SID>";
var conversation = ConversationResource.Fetch(pathSid: conversationSid);

// Example: Fetching all messages in the conversation
var messages = MessageResource.Read(pathConversationSid: conversationSid);
foreach (var message in messages)
{
    Console.WriteLine(message.Body);
}

Azure Communication Services

GetChatThreadClient メソッドは、既に存在するスレッドのスレッド クライアントを返します。 それを使用し、作成されたスレッド上で、メンバーの追加やメッセージの送信などの操作を実行できます。 threadId は、既存のチャット スレッドの一意の ID です。

string threadId = "<THREAD_ID>";
ChatThreadClient chatThreadClient = chatClient.GetChatThreadClient(threadId: threadId);

すべてのチャット スレッドを一覧表示する

Twilio

Twilio Conversations では、UserConversations リソースにクエリを実行することで、ユーザーが参加しているすべての会話を取得できます。 このリソースからは、特定のユーザーの会話の一覧が提供されます。

/ Initialize Twilio Client
string accountSid = "<YOUR_ACCOUNT_SID>";
string authToken = "<YOUR_AUTH_TOKEN>";
TwilioClient.Init(accountSid, authToken);

// The identity of the user you're querying
string userIdentity = "user@example.com";

// Retrieve all conversations the user is part of
var userConversations = UserConversationResource.Read(pathUserSid: userIdentity);

foreach (var userConversation in userConversations)
{
    Console.WriteLine($"Conversation SID: {userConversation.ConversationSid}");
    // You can fetch more details about the conversation if needed
    var conversation = Twilio.Rest.Conversations.V1.ConversationResource.Fetch(pathSid: userConversation.ConversationSid);
    Console.WriteLine($"Conversation Friendly Name: {conversation.FriendlyName}");
}

Azure Communication Services

ユーザーが属しているすべてのチャット スレッドを取得するには、GetChatThreads を使用します。

AsyncPageable<ChatThreadItem> chatThreadItems = chatClient.GetChatThreadsAsync();
await foreach (ChatThreadItem chatThreadItem in chatThreadItems)
{
    Console.WriteLine($"{ chatThreadItem.Id}");
}

チャット スレッドにメッセージを送信する

Twilio

次のコード スニペットからは、テキスト メッセージの送信方法がわかります。

var message = MessageResource.Create(
    body: "Hello, world!",
    from: "user@example.com",
    pathConversationSid: conversation.Sid
);

次のコード スニペットからは、メディア ファイルの送信方法がわかります。

// The SID of the conversation you want to send the media message to
string conversationSid = "<CONVERSATION_SID>";

// The URL of the media file you want to send
var mediaUrl = new List<Uri>
{
    new Uri("https://example.com/path/to/media/file.jpg") // Replace with your actual media URL
};

// Send the media message
var message = MessageResource.Create(
    body: "Here is an image for you!",
    from: "user@example.com", // Sender's identity (optional)
    mediaUrl: mediaUrl,
    pathConversationSid: conversationSid
);

Azure Communication Services

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを送信するための個別の機能はありません。

スレッドにメッセージを送信するには、SendMessage を使用します。

  • メッセージのコンテンツは、content を使用して設定します (必須)。
  • TextHtml などのメッセージのコンテンツの種類には type を使用します。 指定しない場合の既定は、Text です。
  • 送信者の表示名を指定するには、senderDisplayName を使用します。 指定されない場合、空の文字列が既定になります。
  • 必要に応じて、metadata を使用して、メッセージと共に送信するその他のデータを含めます。 このフィールドは、開発者がチャット メッセージ機能を拡張し、ユース ケースに応じたカスタム情報を追加するためのメカニズムを提供します。 たとえば、メッセージ内でファイル リンクを共有する場合、hasAttachment:true をメタデータに追加することで、受信者のアプリケーションがそれを解析して適切に表示できます。
SendChatMessageOptions sendChatMessageOptions = new SendChatMessageOptions()
{
    Content = "Please take a look at the attachment",
    MessageType = ChatMessageType.Text
};
sendChatMessageOptions.Metadata["hasAttachment"] = "true";
sendChatMessageOptions.Metadata["attachmentUrl"] = "https://contoso.com/files/attachment.docx";

SendChatMessageResult sendChatMessageResult = await chatThreadClient.SendMessageAsync(sendChatMessageOptions);

string messageId = sendChatMessageResult.Id;

チャット スレッドからチャット メッセージを受信する

Twilio

Twilio では通常、Webhook を使用して受信メッセージをサーバーに通知します。

次のコード スニペットからは、テキスト メッセージを受信する方法がわかります。

public IActionResult ReceiveMessage()
{
    var incomingMessage = Request.Form["Body"];
    // Process the incoming message
    return Ok();
}

次のコード スニペットからは、メディア ファイルを受信する方法がわかります。

 for (var i = 0; i < numMedia; i++)
            {
                var mediaUrl = Request.Form[$"MediaUrl{i}"];
                Trace.WriteLine(mediaUrl);
                var contentType = Request.Form[$"MediaContentType{i}"];

                var filePath = GetMediaFileName(mediaUrl, contentType);
                await DownloadUrlToFileAsync(mediaUrl, filePath);
            }

Azure Communication Services

Twilio とは異なり、Azure Communication Services には、テキスト メッセージやメディアを受信するための個別の機能はありません。

Azure Communication Services Chat を使用すると、アプリケーション内でイベントを直接サブスクライブできます。

チャット メッセージは、チャット スレッド クライアントで、特定の間隔で GetMessages メソッドをポーリングすることによって取得できます。

AsyncPageable<ChatMessage> allMessages = chatThreadClient.GetMessagesAsync();
await foreach (ChatMessage message in allMessages)
{
    Console.WriteLine($"{message.Id}:{message.Content.Message}");
}

GetMessages には、省略可能な DateTimeOffset パラメーターがあります。 そのオフセットが指定されている場合、その後に受信、更新、または削除されたメッセージを受信します。 オフセット時刻よりも前に受信したものの、その後で編集または削除されたメッセージも返されます。

GetMessages は、メッセージに対して UpdateMessageDeleteMessage を使用して行われた編集や削除を含む、最新バージョンのメッセージを返します。 削除されたメッセージについては、そのメッセージがいつ削除されたかを示す datetime 値が chatMessage.DeletedOn から返されます。 編集されたメッセージについては、メッセージがいつ編集されたかを示す datetime が chatMessage.EditedOn から返されます。 メッセージの最初の作成日時に chatMessage.CreatedOn を使用してアクセスし、それをメッセージの並べ替えに使用できます。

GetMessages は、chatMessage.Type で識別できるさまざまな種類のメッセージを返します。 次の種類があります。

  • Text:スレッド メンバーによって送信された通常のチャット メッセージ。

  • Html:書式設定されたテキスト メッセージ。 Communication Services ユーザーは現在、RichText メッセージを送信できません。 このメッセージ型は、Teams の相互運用シナリオで、Teams ユーザーから Communication Services ユーザーに送信されるメッセージでサポートされています。

  • TopicUpdated:トピックが更新されたことを示すシステム メッセージ。 (読み取り専用)

  • ParticipantAdded: 1 人以上の参加者がチャット スレッドに追加されたことを示すシステム メッセージ。 (読み取り専用)

  • ParticipantRemoved:参加者がチャット スレッドから削除されたことを示すシステム メッセージ。

詳細については、「メッセージの種類」を参照してください。

チャット スレッドに参加者としてユーザーを追加する

Twilio

var participant = ParticipantResource.Create(
    pathConversationSid: conversation.Sid,
    identity: "user@example.com"
);

Azure Communication Services

Azure Communication Services では、チャット スレッドの作成時またはその後に参加者を追加します。

スレッドを作成した後、ユーザーを追加したり、削除したりできます。 追加したユーザーには、スレッドにメッセージを送信したり、他の参加者を追加、削除したりできるアクセス権が与えられます。 AddParticipants を呼び出す前に、そのユーザーの新しいアクセス トークンと ID が取得されることを確認します。 アクセス トークンは、ユーザーがチャット クライアントを初期化するために必要になります。

チャット スレッドに 1 人以上の参加者を追加するには、AddParticipants を使用します。 各スレッド参加者でサポートされている属性は次のとおりです。

  • `id` (必須) は、スレッド参加者の ID です。
  • displayName (省略可) は、スレッド参加者の表示名です。
  • shareHistoryTime (省略可) は、参加者との間でチャット履歴が共有される際の起点となる時刻です。
var josh = new CommunicationUserIdentifier(id: "<Access_ID_For_Josh>");
var gloria = new CommunicationUserIdentifier(id: "<Access_ID_For_Gloria>");
var amy = new CommunicationUserIdentifier(id: "<Access_ID_For_Amy>");

var participants = new[]
{
    new ChatParticipant(josh) { DisplayName = "Josh" },
    new ChatParticipant(gloria) { DisplayName = "Gloria" },
    new ChatParticipant(amy) { DisplayName = "Amy" }
};

await chatThreadClient.AddParticipantsAsync(participants: participants);

スレッド参加者を取得する

Twilio

Twilio Conversations では、ConversationResource を使用して特定の会話の参加者を取得します。 その後、その会話に関連付けられているすべての参加者を一覧表示できます。

// The SID of the conversation you want to retrieve participants from
string conversationSid = "<CONVERSATION_SID>";

// Retrieve all participants in the conversation
var participants = ParticipantResource.Read(pathConversationSid: conversationSid);

// Output details of each participant
foreach (var participant in participants)
{
    Console.WriteLine($"Participant SID: {participant.Sid}");
            
}

Azure Communication Services

チャット スレッドの参加者を取得するには、GetParticipants を使用します。

AsyncPageable<ChatParticipant> allParticipants = chatThreadClient.GetParticipantsAsync();
await foreach (ChatParticipant participant in allParticipants)
{
    Console.WriteLine($"{((CommunicationUserIdentifier)participant.User).Id}:{participant.DisplayName}:{participant.ShareHistoryTime}");
}

開封確認メッセージを送信する

Twilio
// Find your Account SID and Auth Token at twilio.com/console
        // and set the environment variables. See http://twil.io/secure
        string accountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID");
        string authToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN");

        TwilioClient.Init(accountSid, authToken);

        var message = await MessageResource.FetchAsync(
            pathConversationSid: "CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            pathSid: "IMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

        Console.WriteLine(message.Delivery);
    }

Azure Communication Services

メッセージがユーザーに読まれたことを他の参加者に通知するには、SendReadReceipt を使用します。

await chatThreadClient.SendReadReceiptAsync(messageId: messageId);

前提条件

設定

Chat SDK のパッケージ参照を追加する

Twilio

Java アプリケーションで Twilio Conversations Chat API を使用するには、次の依存関係を pom.xml に追加します。

<dependencies>
    <!-- Twilio Java SDK -->
    <dependency>
        <groupId>com.twilio.sdk</groupId>
        <artifactId>twilio</artifactId>
        <version>8.31.1</version>
    </dependency>
</dependencies>

Azure Communication Services

POM ファイルで、チャット API を使用して azure-communication-chat パッケージを参照します。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-chat</artifactId>
    <version><!-- Please refer to https://search.maven.org/artifact/com.azure/azure-communication-chat for the latest version --></version>
</dependency>

認証の場合、クライアントは azure-communication-common パッケージを参照する必要があります。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-common</artifactId>
    <version><!-- Please refer to https://search.maven.org/artifact/com.azure/azure-communication-common for the latest version --></version>
</dependency>

オブジェクト モデル

Java 用 Azure Communication Services Chat SDK が備える主な機能のいくつかは、以下のクラスとインターフェイスにより処理されます。

名前 説明
ChatClient このクラスはチャット機能に必要です。 サブスクリプション情報を使用してそのインスタンスを作成し、それを使用してスレッドを作成、取得、削除します。
ChatAsyncClient このクラスは、非同期チャット機能に必要となります。 サブスクリプション情報を使用してそのインスタンスを作成し、それを使用してスレッドを作成、取得、削除します。
ChatThreadClient このクラスはチャット スレッド機能に必要です。 ChatClient を介してインスタンスを取得し、それを使用してメッセージの送信、受信、更新、削除、ユーザーの追加、削除、取得、入力通知の送信、開封確認を行います。
ChatThreadAsyncClient このクラスは、非同期チャット スレッド機能に必要となります。 ChatAsyncClient を介してインスタンスを取得し、それを使用してメッセージの送信、受信、更新、削除、ユーザーの追加、削除、取得、入力通知の送信、開封確認を行います。

インポート

Twilio

import com.twilio.Twilio;
import com.twilio.rest.conversations.v1.Conversation;

Azure Communication Services

package com.communication.quickstart;

import com.azure.communication.chat.*;
import com.azure.communication.chat.models.*;
import com.azure.communication.common.*;
import com.azure.core.http.rest.PagedIterable;

import java.io.*;
import java.util.*;

チャット クライアントを作成する

Twilio

Twilio では、アカウント SID と認証トークンを使用してクライアントを初期化します。 クライアントを初期化する方法は通常、次のとおりです。

String accountSid = "<YOUR_ACCOUNT_SID>";
String authToken = "<YOUR_AUTH_TOKEN>";
        
// Initialize Twilio client
Twilio.init(accountSid, authToken);

Azure Communication Services

チャット クライアントを作成するには、Communications Service エンドポイントと、前提条件の手順で生成されたアクセス トークンを使用します。 ユーザーのアクセス トークンを使用することで、Azure Communication Services に対して直接認証を行うクライアント アプリケーションを作成できます。 サーバーでこれらのトークンを生成した後、それらをクライアント デバイスに渡します。 チャット クライアントにトークンを渡すには、Common SDK の CommunicationTokenCredential クラスを使用する必要があります。

詳細については、[チャットのアーキテクチャ](../../../concepts/chat/concepts.md)に関するドキュメントを参照してください

import ステートメントを追加するときは、 com.azure.communication.chat.implementation 名前空間ではなく、com.azure.communication.chat および com.azure.communication.chat.models 名前空間からのインポートのみを必ず追加してください。 Maven を使用して生成された App.java ファイルで、次のコードを使用して開始できます。

// Your unique Azure Communication service endpoint
String endpoint = "<replace with your resource endpoint>";

// User access token fetched from your trusted service
String userAccessToken = "<USER_ACCESS_TOKEN>";

// Create a CommunicationTokenCredential with the given access token, which is only valid until the token is valid
CommunicationTokenCredential userCredential = new CommunicationTokenCredential(userAccessToken);

// Initialize the chat client
final ChatClientBuilder builder = new ChatClientBuilder();
    builder.endpoint(endpoint)
        .credential(userCredential);
    ChatClient chatClient = builder.buildClient();

チャット スレッドを開始する

Twilio

Twilio での会話の作成は、Conversation.creator() メソッドを使用して簡単に行うことができます。

setFriendlyName を使用し、このチャットにトピックを指定します。

// Create a new conversation
        Conversation conversation = Conversation.creator().setFriendlyName("New Conversation").create();
        System.out.println(conversation.getSid());

Azure Communication Services

チャット スレッドは、createChatThread メソッドを使用して作成します。

  • createChatThreadOptions を使用し、スレッド要求を記述します。
  • このチャットにトピックを指定するには、コンストラクターの topic パラメーターを使用します。UpdateThread 関数を使用してチャット スレッドが作成された後に「トピック」を更新します。
  • スレッドに追加するスレッド参加者をリストアップするには、participants を使用します。 ChatParticipant には、ユーザー アクセス トークンに関するクイックスタートで作成したユーザーが渡されます。

CreateChatThreadResult は、チャット スレッドの作成から返された応答です。 これには、スレッド クライアントを取得するために使用できる ChatThread オブジェクトを返す getChatThread() メソッドが含まれています。そのスレッド クライアントからは、作成されたスレッドに対して参加者の追加、メッセージの送信などを含む操作を実行するための ChatThreadClient を取得できます。

ChatThread オブジェクトには、スレッドの一意の ID を取得する getId() メソッドも含まれています。

CommunicationUserIdentifier identity1 = new CommunicationUserIdentifier("<USER_1_ID>");
CommunicationUserIdentifier identity2 = new CommunicationUserIdentifier("<USER_2_ID>");

ChatParticipant firstThreadParticipant = new ChatParticipant()
    .setCommunicationIdentifier(identity1)
    .setDisplayName("Participant Display Name 1");

ChatParticipant secondThreadParticipant = new ChatParticipant()
    .setCommunicationIdentifier(identity2)
    .setDisplayName("Participant Display Name 2");

CreateChatThreadOptions createChatThreadOptions = new CreateChatThreadOptions("Topic")
    .addParticipant(firstThreadParticipant)
    .addParticipant(secondThreadParticipant);

CreateChatThreadResult result = chatClient.createChatThread(createChatThreadOptions);
String chatThreadId = result.getChatThread().getId();

チャット スレッドを一覧表示する

Twilio

Java を使用して Twilio のすべての会話を一覧表示するには:

public static void main(String[] args) {
        // List all conversations
        ResourceSet<Conversation> conversations = Conversation.reader().read();

        for (Conversation conversation : conversations) {
            System.out.println("Conversation SID: " + conversation.getSid());
            System.out.println("Friendly Name: " + conversation.getFriendlyName());
            System.out.println("Date Created: " + conversation.getDateCreated());
        }
    }

Azure Communication Services

listChatThreads メソッドを使用して、既存のチャット スレッドの一覧を取得します。

PagedIterable<ChatThreadItem> chatThreads = chatClient.listChatThreads();

chatThreads.forEach(chatThread -> {
    System.out.printf("ChatThread id is %s.\n", chatThread.getId());
});

チャット スレッド クライアントを取得する

Twilio

Java を使用して Twilio で特定の会話を取得し、それと対話する方法は次のようになります。

// Retrieve a specific conversation by its SID
Conversation conversation = Conversation.fetcher(conversationSid).fetch();
System.out.println("Retrieved Conversation SID: " + conversation.getSid());
System.out.println("Friendly Name: " + conversation.getFriendlyName())

Azure Communication Services

getChatThreadClient メソッドは、既に存在するスレッドのスレッド クライアントを返します。 それを使用し、作成されたスレッド上で、参加者の追加やメッセージの送信などの操作を実行します。 chatThreadId は、既存のチャット スレッドの一意の ID です。

ChatThreadClient chatThreadClient = chatClient.getChatThreadClient(chatThreadId);

チャット スレッドにメッセージを送信する

Twilio

Twilio でメッセージを送信するとき、Message.creator() メソッドが使用されます。

import com.twilio.rest.conversations.v1.conversation.Message;

Message message = Message.creator(conversationSid)
    .setBody("Hello, World!")
    .create();
System.out.println("Message SID: " + message.getSid());

Twilio では、メッセージの送信時にメディア URL を提供することでメディア ファイルを送信できます。

List<URI> mediaUrls = Arrays.asList(URI.create("https://example.com/image.jpg"));
Message message = Message.creator(conversationSid)
    .setBody("Check out this image!")
    .setMediaUrl(mediaUrls)
    .create();
System.out.println("Message SID: " + message.getSid());

Azure Communication Services

Twilio とは異なり、Azure Communication Services には、メディアを送信するための個別の機能はありません。 作成したスレッド (chatThreadId で指定) にメッセージを送信するには、sendMessage メソッドを使用します。

sendChatMessageOptions を使用し、チャット メッセージ要求を記述します。

  • チャット メッセージの内容は、content を使用して設定します。
  • type を使用し、チャット メッセージのコンテンツの種類 (TEXT または HTML) を指定します。
  • 送信者の表示名を指定するには、senderDisplayName を使用します。
  • メッセージと共に送信するデータがあれば、必要に応じて metadata を使用してそのデータを含めます。 このフィールドによって開発者はチャット メッセージ機能を拡張したり、ユース ケースに合わせてカスタム情報を追加したりできます。 たとえば、メッセージ内でファイル リンクを共有する場合、hasAttachment:true をメタデータに追加することで、受信者のアプリケーションがそれを解析して適切に表示できます。

応答である sendChatMessageResult には、id (そのメッセージの一意の ID) が含まれています。

Map<String, String> metadata = new HashMap<String, String>();
metadata.put("hasAttachment", "true");
metadata.put("attachmentUrl", "https://contoso.com/files/attachment.docx");

SendChatMessageOptions sendChatMessageOptions = new SendChatMessageOptions()
    .setContent("Please take a look at the attachment")
    .setType(ChatMessageType.TEXT)
    .setSenderDisplayName("Sender Display Name")
    .setMetadata(metadata);

SendChatMessageResult sendChatMessageResult = chatThreadClient.sendMessage(sendChatMessageOptions);
String chatMessageId = sendChatMessageResult.getId();

チャット スレッドからチャット メッセージを受信する

Twilio

Twilio Conversations では、Webhook を使用してメッセージを受信します。 通常、Twilio コンソールで Webhook URL を設定します。

// This would be handled by a servlet or similar in a Java web application
public void handleIncomingMessage(HttpServletRequest request, HttpServletResponse response) {
    String body = request.getParameter("Body");
    System.out.println("Received message: " + body);
}

Twilio でメディア ファイルを受信するには。

private static final Logger logger = Logger.getLogger(TwilioWebhookServlet.class.getName());

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Get the number of media items attached to the message
        String numMedia = request.getParameter("NumMedia");

        int mediaCount = Integer.parseInt(numMedia);

        if (mediaCount > 0) {
            // Loop through each media file received
            for (int i = 0; i < mediaCount; i++) {
                // Get the media URL from the request
                String mediaUrl = request.getParameter("MediaUrl" + i);
                String mediaContentType = request.getParameter("MediaContentType" + i);

                logger.info("Received media file: " + mediaUrl + " with content type: " + mediaContentType);

                // Process the media file (e.g., download, store, etc.)
                // Example: Download and save the file, or send it to another service
            }
        } else {
            // Handle a message with no media
            String messageBody = request.getParameter("Body");
            logger.info("Received text message: " + messageBody);
        }

Azure Communication Services

チャット メッセージは、チャット スレッド クライアントで、特定の間隔で listMessages メソッドをポーリングすることによって取得できます。

chatThreadClient.listMessages().forEach(message -> {
    System.out.printf("Message id is %s.\n", message.getId());
});

listMessages は、メッセージに対して .editMessage().deleteMessage() を使用して行われた編集や削除を含む、最新バージョンのメッセージを返します。 削除されたメッセージについては、そのメッセージがいつ削除されたかを示す datetime 値が chatMessage.getDeletedOn() から返されます。 編集されたメッセージについては、メッセージがいつ編集されたかを示す datetime が chatMessage.getEditedOn() から返されます。 メッセージの最初の作成日時には、chatMessage.getCreatedOn() を使用してアクセスできます。これをメッセージの並べ替えに使用することができます。

メッセージの種類の詳細については、「メッセージの種類」をご覧ください。

開封確認メッセージを送信する

Twilio

Twilio Conversations には、開封確認メッセージを送信するための直接 API がありません。 Twilio Conversations では、開封確認メッセージが自動的に管理されます。

Azure Communication Services

`sendReadReceipt` メソッドを使用すると、ユーザーに代わって開封確認イベントをチャット スレッドに送信できます。

chatMessageId は、開封されたチャット メッセージの一意の ID です。

String chatMessageId = message.getId();
chatThreadClient.sendReadReceipt(chatMessageId);

チャット参加者を一覧表示する

Twilio

Twilio 会話の参加者を取得するには:

ResourceSet<Participant> participants = Participant.reader(conversationSid).read();

for (Participant participant : participants) {
    System.out.println("Participant SID: " + participant.getSid());
}

Azure Communication Services

chatThreadId によって識別されるチャット スレッドの参加者を含むページ コレクションを取得するには、listParticipants を使用します。

PagedIterable<ChatParticipant> chatParticipantsResponse = chatThreadClient.listParticipants();
chatParticipantsResponse.forEach(chatParticipant -> {
    System.out.printf("Participant id is %s.\n", ((CommunicationUserIdentifier) chatParticipant.getCommunicationIdentifier()).getId());
});

チャット スレッドに参加者としてユーザーを追加する

Twilio

Participant.creator() メソッドを使用して会話に参加者を追加します。

import com.twilio.rest.conversations.v1.conversation.Participant;

Participant participant = Participant.creator(conversationSid)
    .setIdentity("user@example.com")
    .create();
System.out.println("Participant SID: " + participant.getSid());

Azure Communication Services

チャット スレッドの作成後、ユーザーを追加したり削除したりすることができます。 追加したユーザーには、チャット スレッドにメッセージを送信したり、他の参加者を追加、削除したりできるアクセス権が与えられます。 まず、そのユーザーの新しいアクセス トークンと ID を取得します。 addParticipants メソッドを呼び出す前に、そのユーザーの新しいアクセス トークンと ID を取得していることを確認してください。 そのアクセス トークンは、ユーザーがチャット クライアントを初期化するために必要になります。

スレッドに参加者を追加するには、addParticipants メソッドを使用します。

  • communicationIdentifier (必須) は、ユーザー アクセス トークンに関するクイックスタートで CommunicationIdentityClient を使用して作成した CommunicationIdentifier です。
  • displayName (省略可) は、スレッド参加者の表示名です。
  • shareHistoryTime (省略可) は、参加者との間でチャット履歴が共有される際の起点となる時刻です。 チャット スレッドの始めから履歴を共有する場合は、スレッドの作成日時と同じかそれ以前の任意の日付にこのプロパティを設定してください。 参加者が追加された時点よりも前の履歴は共有しない場合は、現在の日付に設定します。 部分的に履歴を共有するには、必要な日付に設定します。
List<ChatParticipant> participants = new ArrayList<ChatParticipant>();

CommunicationUserIdentifier identity3 = new CommunicationUserIdentifier("<USER_3_ID>");
CommunicationUserIdentifier identity4 = new CommunicationUserIdentifier("<USER_4_ID>");

ChatParticipant thirdThreadParticipant = new ChatParticipant()
    .setCommunicationIdentifier(identity3)
    .setDisplayName("Display Name 3");

ChatParticipant fourthThreadParticipant = new ChatParticipant()
    .setCommunicationIdentifier(identity4)
    .setDisplayName("Display Name 4");

participants.add(thirdThreadParticipant);
participants.add(fourthThreadParticipant);

chatThreadClient.addParticipants(participants);