事件是代理程式可以傳送及接收的通知。事件類型分為三種:
伺服器產生的事件
RBM 平台會傳送事件,通知代理程式伺服器層級的更新,例如訊息到期。
如需格式和值選項,請參閱 ServerEvent
。
代理啟用狀態已變更
RBM 平台會在代理程式的發布狀態每次變更時,傳送 AgentLaunchEvent
。舉例來說,如果代理商的狀態在電信業者核准後從 PENDING
變更為 LAUNCHED
,您會收到 AgentLaunchEvent
事件,指出這項變更。系統會針對所有 RBM 代理程式,以及所有電信業者啟動狀態變更,傳送這些事件。
Webhook 設定
你可以使用合作夥伴層級或服務專員層級的 Webhook 接收這些通知。
必要條件
- 設定 RBM 訊息的 Webhook (這是接收使用者訊息和使用者產生事件的必要條件)。
- 如要區分使用者產生的事件和代理程式啟動狀態事件,請檢查
message.attributes.type
路徑的值是否為agent_launch_event
。
事件酬載結構
AgentLaunchEvent
會以 Pub/Sub 訊息的形式傳送。範例如下:
{
"message": {
"attributes": {
"business_id": "rbm-chatbot-id@rbm.goog",
"event_type": "REJECTED",
"product": "RBM",
"project_number": "3338881441851",
"type": "agent_launch_event"
},
"data": "....BASE64-encoded-JSON-with-notification...",
"messageId": "14150481888479752",
"message_id": "14150481888479752",
"publishTime": "2025-03-05T18:50:21.88Z",
"publish_time": "2025-03-05T18:50:21.88Z"
},
"subscription": "projects/rbm-partner-gcp/subscriptions/rbm-sub"
}
事件酬載中的 AgentLaunchEvent.LaunchState
欄位會指出代理程式的新啟動狀態。可能的值包括:
值 | 代理程式啟動狀態 | 詳細資料 |
---|---|---|
UNLAUNCHED |
未發布 | 可編輯。 |
PENDING |
待處理 | 要求已送交電信業者審查。 |
LAUNCHED |
已推出 | 允許在特定電信業者上傳送訊息。 |
REJECTED |
遭特定貨運公司拒絕 | 註解中會說明拒絕原因。 |
SUSPENDED |
在特定貨運公司遭停權 | 註解中會說明停權原因。 |
資料欄位包含以 Base64 編碼的 JSON 物件,內含啟動狀態詳細資料。以下是解碼後的 JSON 範例:
{
"eventId": "rbm-chatbot-id/0a7ed168-676e-4a56-b422-b23434",
"agentId": "rbm-chatbot-id@rbm.goog",
"botDisplayName": "RBM Welcome Bot 7 - RBM Chatbot name",
"brandId": "bd38fbff-392a-437b-a6f2-7f2e43745b56",
"brandDisplayName": "Chatbots brand",
"regionId": "/v1/regions/fi-rcs",
"oldLaunchState": "PENDING",
"newLaunchState": "REJECTED",
"actingParty": "rbm-support@google.com",
"comment": "Carrier has rejected the launch: policy violation",
"sendTime": "2025-03-05T18:50:19.386436Z"
}
下表列出代理程式啟動狀態和觸發動作:
舊的發布狀態 | 新的發布狀態 | 觸發變更 |
---|---|---|
PENDING |
LAUNCHED |
待服務專員核准。 |
PENDING |
REJECTED |
已拒絕待處理的代理人。 |
LAUNCHED |
SUSPENDED |
已暫停發布的代理程式。 |
SUSPENDED |
LAUNCHED |
已重新啟用遭停權的代理人。 |
SUSPENDED |
TERMINATED |
已終止暫停的代理程式。 |
TERMINATED |
LAUNCHED |
已啟動終止的服務專員。 |
訊息已過期;撤銷成功
訊息已過期,並已成功撤銷。這個事件很適合做為備用訊息策略的觸發條件。
{ "phoneNumber": [phone number of recipient that the original message was intended for] , "messageId": [RCS message ID of the message], "agentId": [bot ID], "eventType": "TTL_EXPIRATION_REVOKED", "eventId": [unique ID generated by the RBM platform], "sendTime": [time at which the server sent this event] }
訊息已過期;撤銷失敗
訊息已過期,但未遭撤銷。
{ "phoneNumber": [phone number of recipient that the original message was intended for] , "messageId": [RCS message ID of the message], "agentId": [bot ID], "eventType": "TTL_EXPIRATION_REVOKE_FAILED", "eventId": [unique ID generated by the RBM platform], "sendTime": [time at which the server sent this event] }
我們無法保證訊息一定會送達。
- 如果訊息已送達,Webhook 會收到
DELIVERED
事件。 - 如果郵件未送達,請使用撤銷 API 傳送撤銷要求。
如果訊息具有時效性 (例如一次性密碼或詐欺警示),即使會導致使用者收到重複訊息,最好還是透過簡訊等其他管道傳送。
使用者產生的事件
與使用者訊息和功能檢查一樣,代理程式會以 JSON 格式接收使用者事件。
如需格式和值選項,請參閱 UserEvent
。
使用者收到服務專員訊息
這個事件表示郵件已傳送。
{ "senderPhoneNumber": "PHONE_NUMBER", "eventType": "DELIVERED", "eventId": "EVENT_ID", "messageId": "MESSAGE_ID", "agentId": "AGENT_ID" }
使用者閱讀服務專員訊息
這項事件表示郵件已開啟或確認。
{ "senderPhoneNumber": "PHONE_NUMBER", "eventType": "READ", "eventId": "EVENT_ID", "messageId": "MESSAGE_ID", "agentId": "AGENT_ID" }
使用者開始輸入文字
這項事件表示使用者正在輸入內容。
{ "senderPhoneNumber": "PHONE_NUMBER", "eventType": "IS_TYPING", "eventId": "EVENT_ID", "agentId": "AGENT_ID" }
使用者傳送簡訊
{ "senderPhoneNumber": "PHONE_NUMBER", "text": "Hi", "eventId": "EVENT_ID", "agentId": "AGENT_ID" }
使用者傳送檔案
{ "senderPhoneNumber": "PHONE_NUMBER", "userFile": { "payload": { "mimeType": "image/gif", "fileSizeBytes": 127806, "fileUri": "https://storage.googleapis.com/copper_test/77ddb795-24ad-4607-96ae-b08b4d86406a/d2dcc67ab888d34ee272899c020b13402856f81597228322079eb007e8c9", "fileName": "4_animated.gif" } }, "eventId": "EVENT_ID", "agentId": "AGENT_ID" }
使用者輕觸建議回覆
使用者輕觸建議回覆時,代理程式會收到含有回覆的後送資料和文字的事件。
{ "senderPhoneNumber": "PHONE_NUMBER", "eventId": "EVENT_ID", "agentId": "AGENT_ID", "suggestionResponse": { "postbackData": "postback_1234", "text": "Hello there!" } }
使用者輕觸建議的動作
使用者輕觸建議動作時,代理程式會收到含有動作回傳資料的事件。
{ "senderPhoneNumber": "PHONE_NUMBER", "eventId": "EVENT_ID", "agentId": "AGENT_ID", "suggestionResponse": { "postbackData": "postback_1234" } }
使用者取消訂閱對話
如果使用者不想再收到商家發送的非必要訊息 (例如促銷活動),可以在 Google 訊息中取消訂閱 RBM 對話。
UNSUBSCRIBE
事件表示使用者已取消訂閱與服務專員和商家 (服務專員代表的商家) 的對話。以下是 JSON 酬載的範例:
{ "senderPhoneNumber": "PHONE_NUMBER", "eventType": "UNSUBSCRIBE", "eventId": "EVENT_ID", "agentId": "AGENT_ID" }
運作方式
- 你隨時可以透過對話選單取消訂閱。如果是宣傳和多用途的智慧助理,在一定數量的未讀訊息後,這個選項也會直接顯示在對話中 (具體規則因國家/地區而異)。
選取「取消訂閱」會同時觸發兩項動作:Google 訊息會將特定國家/地區的關鍵字 (例如「STOP」) 傳送給服務專員,而 RBM 平台則會將 UNSUBSCRIBE 事件傳送至網路鉤子。
關鍵字取決於使用者電話號碼的國家/地區代碼 (由兩個字母組成)。下表列出各支援國家/地區的關鍵字。
國家/地區 (國家/地區代碼) 取消訂閱關鍵字 美國 (US)、印度 (IN)、英國 (GB)、德國 (DE) 停止 西班牙 (ES)、墨西哥 (MX) BAJA 法國 (FR) 停止 巴西 (BR) parar 使用者取消訂閱後,對話仍會保留在收件匣中,除非檢舉為垃圾訊息,否則不會移至「已封鎖的垃圾訊息」資料夾。
為找出違反政策和業務規則的行為,Google 會在使用者取消訂閱後監控訊息模式。
業務規則
- 身為管理這項對話的 RBM 合作夥伴,您有責任遵守使用者的取消訂閱要求。
- 如果無法在訊息串中取消訂閱,請立即傳送確認訊息,並附上網站或應用程式的直接連結,方便使用者管理訂閱偏好設定。
- 使用者取消訂閱後,您不得再傳送非必要訊息。
- 仍可傳送重要訊息。包括:
- 驗證資訊,例如動態密碼 (OTP)
- 使用者要求並同意接收的特定服務通知
- 確認使用者取消訂閱的要求,並提供相關資訊,方便他們進一步管理通訊偏好設定
範例
如果使用者取消訂閱用途為多用途的航空公司代理程式,您必須停止傳送行銷訊息。不過,如果使用者明確同意接收特定航班的最新動態,您就可以傳送航班最新動態。
取消訂閱原因
使用者取消訂閱服務專員時,可以從下列選項中選取原因:
- 我並未訂閱
- 訊息過多
- 沒興趣了
- 垃圾內容
- 其他
目前我們不會將取消訂閱原因提供給合作夥伴或電信業者。
使用者重新訂閱對話
使用者可以在 Google 訊息中重新訂閱先前取消訂閱的對話。
SUBSCRIBE
事件表示使用者想接收來自代理程式的訊息,包括促銷活動等非必要內容。以下是 JSON 酬載範例:
{ "senderPhoneNumber": "PHONE_NUMBER", "eventType": "SUBSCRIBE", "eventId": "EVENT_ID", "agentId": "AGENT_ID" }
運作方式
- 使用者可以透過對話選單和對話內連結,使用「訂閱」選項重新訂閱已取消訂閱的對話。
選取「訂閱」會同時觸發兩項動作:Google 訊息會將國家/地區專屬的關鍵字 (例如「開始」) 傳送給代理程式,而 RBM 平台會將 SUBSCRIBE 事件傳送至網路鉤子。
具體關鍵字取決於使用者電話號碼的國家/地區代碼 (由兩個字母組成)。下表列出各支援國家/地區的關鍵字。
國家/地區 (國家/地區代碼) 訂閱關鍵字 美國 (US)、印度 (IN)、英國 (GB)、德國 (DE) 開始 西班牙 (ES)、墨西哥 (MX) ALTA 法國 (FR) Démarrer 巴西 (BR) começar
業務規則
- 身為管理這項對話的 RBM 合作夥伴,您有責任遵守使用者的重新訂閱要求。
- 重新訂閱適用於所有類型的訊息,包括宣傳等非必要內容。
- 如果使用者取消訂閱後傳送訊息給商家,系統可能會將此視為重新訂閱要求。
- 如果使用者在訊息管道以外的地方重新訂閱 (例如在您的網站上),RBM 合作夥伴有責任更新使用者的狀態,並據此繼續傳送訊息。
代理程式產生的事件
服務專員會傳送事件來模擬人類互動,並向使用者保證服務專員正在處理他們的訊息。使用者會在對話中收到事件通知。
如需格式和值選項,請參閱 phones.agentEvents
。
服務專員傳送 READ
事件
使用者會看到這項事件,瞭解特定訊息的已讀回執。讓使用者知道 RBM 平台已傳送訊息,且代理程式正在處理。
下列程式碼會針對含有相符 messageId
的訊息傳送 READ
事件。
cURL
curl -X POST "https://REGION-rcsbusinessmessaging.googleapis.com/v1/phones/PHONE_NUMBER/agentEvents?eventId=EVENT_ID&agentId=AGENT_ID" \ -H "Content-Type: application/json" \ -H "User-Agent: curl/rcs-business-messaging" \ -H "`oauth2l header --json PATH_TO_SERVICE_ACCOUNT_KEY rcsbusinessmessaging`" \ -d "{ 'eventType': 'READ', 'messageId': 'MESSAGE_ID' }"
Node.js
// Reference to RBM API helper const rbmApiHelper = require('@google/rcsbusinessmessaging'); // Send the device an event to indicate that messageId has been read rbmApiHelper.sendReadMessage('+12223334444', messageId);
Java
import com.google.rbm.RbmApiHelper; … // Create an instance of the RBM API helper RbmApiHelper rbmApiHelper = new RbmApiHelper(); // Send the device an event to indicate that messageId has been read rbmApiHelper.sendReadMessage(messageId, "+12223334444");
Python
# Reference to RBM Python client helper and messaging object structure from rcs_business_messaging import rbm_service # Send the device an event to indicate that message_id was read rbm_service.send_read_event('+12223334444', message_id)
C#
using RCSBusinessMessaging; … // Create an instance of the RBM API helper RbmApiHelper rbmApiHelper = new RbmApiHelper(credentialsFileLocation, projectId); // Send the device an event to indicate that messageId has been read rbmApiHelper.SendReadMessage(messageId, "+12223334444");
代理程式會傳送 IS_TYPING
事件
使用者會看到輸入指標,得知代理程式正在撰寫訊息。打字指標會在短時間 (約 20 秒) 後失效,或在使用者裝置收到客服專員的新訊息時失效。您的代理程式可以傳送多個 IS_TYPING
事件,重設輸入指標的到期計時器。
下列程式碼會傳送 IS_TYPING
事件。
cURL
curl -X POST "https://REGION-rcsbusinessmessaging.googleapis.com/v1/phones/PHONE_NUMBER/agentEvents?eventId=EVENT_ID&agentId=AGENT_ID" \ -H "Content-Type: application/json" \ -H "User-Agent: curl/rcs-business-messaging" \ -H "`oauth2l header --json PATH_TO_SERVICE_ACCOUNT_KEY rcsbusinessmessaging`" \ -d "{ 'eventType': 'IS_TYPING', }"
Node.js
// Reference to RBM API helper const rbmApiHelper = require('@google/rcsbusinessmessaging'); // Send the device an event to indicate that the agent is typing rbmApiHelper.sendIsTypingMessage('+12223334444', function() { console.log('Typing event sent!'); });
Java
import com.google.rbm.RbmApiHelper; … // Create an instance of the RBM API helper RbmApiHelper rbmApiHelper = new RbmApiHelper(); // Send the device an event to indicate that the agent is typing rbmApiHelper.sendIsTypingMessage("+12223334444");
Python
# Reference to RBM Python client helper and messaging object structure from rcs_business_messaging import rbm_service # Send the device an event to indicate that the agent is typing rbm_service.send_is_typing_event('+12223334444')
C#
using RCSBusinessMessaging; … // Create an instance of the RBM API helper RbmApiHelper rbmApiHelper = new RbmApiHelper(credentialsFileLocation, projectId); // Send the device an event to indicate that the agent is typing rbmApiHelper.SendIsTypingMessage(messageId, "+12223334444");