RBM エージェントは、Cloud Pub/Sub とのパブリッシュ/サブスクライブ関係を介してメッセージとイベントを受信します。ユーザーがエージェントにメッセージを送信したり、イベントを生成すると、メッセージ アプリは、その情報をエージェントの Pub/Sub サブスクリプションに送信します。これにより、エージェントはメッセージやイベントにアクセスできます。メッセージを受信するをご覧ください。
エージェントの Pub/Sub サブスクリプション タイプによってエージェントがメッセージを受信する方法が決まるため、エージェントがメッセージを受信する前に Pub/Sub サブスクリプションを構成する必要があります。RBM エージェントは、pull と push の両方のサブスクリプションをサポートします。
pull サブスクリプション
pull サブスクリプションでは、エージェントは Cloud Pub/Sub に接続し、メッセージ、イベント、その他のリクエストを取得します。
前提条件
始める前に、RBM エージェントが必要です。
設定
- Business Communications デベロッパー コンソールを開き、RBM の Google アカウントでログインしてエージェントをクリックします。
- 画面左のナビゲーションで [Integrations] をクリックします。
- [定期購入を編集] をクリックします。
- [pull] を選択し、[保存] をクリックします。
- pull サブスクリプションを使用するようにエージェントを構成します。
- pull サブスクリプションでサンプル エージェントを使用する場合は、サンプルの README ファイルの手順に沿って操作してください。
- サンプル エージェントを使用しない場合は、pull を使用してメッセージを受信するで、エージェントが pull サブスクリプションを使用できるようにするためのコードを確認してください。プログラミング言語によっては、エージェントのプロジェクト ID が必要になる場合があります。
プロジェクト ID を探す
一部の pull サブスクリプション メカニズムでは、エージェントの Google Cloud プロジェクト(GCP)プロジェクト ID を指定する必要があります。エージェントのプロジェクト ID は、project/
の後に続く pull サブスクリプション名に埋め込まれます。
- Business Communications デベロッパー コンソールを開き、RBM の Google アカウントでログインしてエージェントをクリックします。
- 画面左のナビゲーションで [Integrations] をクリックします。
- エージェントのサブスクリプション名を確認します。
project/
とそれに続く/
の間のテキスト セグメントを見つけます。これはエージェントのプロジェクト ID です。たとえば、サブスクリプション名がprojects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription
の場合、エージェントのプロジェクト ID はrbm-growing-tree-bank-nbdjkl6t
です。
C#
private async void InitPullMessages(string projectId, string jsonPath) { GoogleCredential googleCredential = null; using (var jsonStream = new FileStream(jsonPath, FileMode.Open, FileAccess.Read, FileShare.Read)) { googleCredential = GoogleCredential.FromStream(jsonStream) .CreateScoped(SubscriberServiceApiClient.DefaultScopes); } SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId); SubscriberClient subscriber = new SubscriberClientBuilder { SubscriptionName = subscriptionName, GoogleCredential = googleCredential }.Build(); // setup listener for pubsub messages await subscriber.StartAsync( async (PubsubMessage message, CancellationToken cancel) => { string text = System.Text.Encoding.UTF8.GetString(message.Data.ToArray()); JObject jsonObject = JObject.Parse(jsonAsString); string userResponse = GetResponseText(jsonObject); string eventType = (string)jsonObject["eventType"]; // check if the message is a user response message if ((userResponse.Length > 0) && (eventType == null)) { string messageId = (string)jsonObject["messageId"]; string msisdn = (string)jsonObject["senderPhoneNumber"]; // let the user know their message has been read kitchenSinkBot.SendReadMessage(messageId, msisdn); HandleUserResponse(userResponse, msisdn); } await Console.Out.WriteLineAsync( $"Message {message.MessageId}: {jsonAsString}"); return SubscriberClient.Reply.Ack; }); } }このコードは、RBM サンプル エージェントからの抜粋です。
push サブスクリプション
push サブスクリプションを使用すると、Cloud Pub/Sub はメッセージ、イベント、その他のリクエストを、指定された Webhook URL に push します。
前提条件
始める前に、以下が必要です。
- RBM エージェント
- 以下をサポートするライブ Webhook エンドポイント URL
- HTTPS と有効な SSL 証明書
POST
件のリクエスト- 検証リクエストに応じてパラメータをエコーする機能
設定
- Business Communications デベロッパー コンソールを開き、RBM の Google アカウントでログインしてエージェントをクリックします。
- 画面左のナビゲーションで [Integrations] をクリックします。
- [定期購入を編集] をクリックします。
- [プッシュ] を選択します。
- [Webhook エンドポイント URL] に、「https://」で始まる Webhook の URL を入力します。
指定された
clientToken
パラメータを含むPOST
リクエストを受け入れ、secret
パラメータの値を含む200 OK
レスポンスを送信するように Webhook を構成します。たとえば、Webhook が次の本文を含む POST リクエストを受信した場合、
{ "clientToken":"SJENCPGJESMGUFPY", "secret":"1234567890" }
Webhook は
clientToken
値を確認し、clientToken
が正しい場合は本文がsecret: 1234567890
の200 OK
レスポンスを返す必要があります。コンソールで [確認] をクリックします。
RBM プラットフォームが Webhook を検証すると、[Webhook の構成] ダイアログが閉じます。
[保存] をクリックします。
Webhook からメッセージを受信するようにエージェントを構成します。
- push サブスクリプションでサンプル エージェントを使用する場合は、サンプルの README ファイルの手順に沿って操作してください。
- サンプル エージェントを使用しない場合は、Webhook からエージェントにメッセージを渡すようにインフラストラクチャを構成します。
Node.js
let requestBody = req.body; if ((requestBody.hasOwnProperty('clientToken')) && (requestBody.hasOwnProperty('secret'))) { console.log('RBM webhook verification request'); // Confirm that the clientToken is the one we are seeing in the RBM console if (requestBody.clientToken == CLIENT_TOKEN) { console.log('Tokens match, returning secret'); res.status(200).send('secret: ' + requestBody.secret); } else { // Client tokens did not match - sending permission denied console.log('Tokens do not match'); res.sendStatus(403); } }
受信メールを確認する
Webhook はどの送信者からでもメッセージを受信できるため、メッセージの内容を処理する前に、Google が受信メッセージを送信したことを確認する必要があります。
Google から送信したメッセージを確認する手順は次のとおりです。
- メールの
X-Goog-Signature
ヘッダーを抽出します。これは、メッセージ本文のペイロードのハッシュされ、base64 でエンコードされたコピーです。 - リクエストの
message.body
要素内の RBM ペイロードを Base64 でデコードします。 - Webhook のクライアント トークン(push サブスクリプションの設定時に指定した)をキーとして使用し、base-64 でデコードされたメッセージ ペイロードのバイトの SHA512 HMAC を作成し、結果を base64 でエンコードします。
X-Goog-Signature
ハッシュと作成したハッシュを比較します。- ハッシュが一致する場合は、Google がメッセージを送信したと確認されています。
ハッシュが一致しない場合は、既知の正常なメッセージのハッシュ化プロセスを確認します。
ハッシュ化プロセスが正常に機能し、不正に送信されたと思われるメッセージを受け取った場合は、Google にお問い合わせください。
Node.js
if ((requestBody.hasOwnProperty('message')) && (requestBody.message.hasOwnProperty('data'))) { // Validate the received hash to ensure the message came from Google RBM let userEventString = Buffer.from(requestBody.message.data, 'base64'); let hmac = crypto.createHmac('sha512', CLIENT_TOKEN); let data = hmac.update(userEventString); let genHash = data.digest('base64'); let headerHash = req.header('X-Goog-Signature'); if (headerHash === genHash) { let userEvent = JSON.parse(userEventString); console.log('userEventString: ' + userEventString); handleMessage(userEvent); } else { console.log('hash mismatch - ignoring message'); } } res.sendStatus(200);
次のステップ
サブスクリプションを構成して、Cloud Pub/Sub と通信するようにエージェントを設定すると、エージェントはテストデバイスからメッセージを受信できます。メッセージを送信して設定を検証します。