A Python SDK for RCS MaaP chatbots.
pip install rcs_chatbot
See more examples in the example folder.
import flask
import logging
import rcs_chatbot
chatbot = rcs_chatbot.Chatbot(
"API_URL",
"BOT_ID",
"TOKEN",
None,
logging.DEBUG
)
app = flask.Flask(__name__)
@app.route('/', methods=['POST'])
def event():
try:
chatbot.processEvent(flask.request.get_json())
return "ok", 200
except maap.RequestFailed as ex:
print("Request failed: " + str(ex))
return "ok", 200
@chatbot.registerEventHandler(rcs_chatbot.EventType.MESSAGE)
def messageHandler(event):
userContact = None
chatId = None
if "userContact" in event["messageContact"]:
userContact = event["messageContact"]["userContact"]
if "chatId" in event["messageContact"]:
chatId = event["messageContact"]["chatId"]
contact = rcs_chatbot.MessageContact(userContact, chatId)
suggestions = rcs_chatbot.Suggestions()
suggestions.addReply("reply", "reply")
suggestions.addUrlAction("url", "url", "http://example.com")
chatbot.sendMessage(
contact,
"You wrote: " + event["RCSMessage"]["textMessage"],
suggestions
)
@chatbot.registerEventHandler(rcs_chatbot.EventType.ISTYPING)
def isTypingHandler(event):
print("isTypingHandler")
@chatbot.registerEventHandler(rcs_chatbot.EventType.MESSAGESTATUS)
def messageStatusHandler(event):
print("messageStatusHandler")
@chatbot.registerEventHandler(rcs_chatbot.EventType.FILESTATUS)
def fileStatusHandler(event):
print("fileStatusHandler")
@chatbot.registerEventHandler(rcs_chatbot.EventType.RESPONSE)
def responseHandler(event):
print("responseHandler")
@chatbot.registerEventHandler(rcs_chatbot.EventType.ALIAS)
def aliasHandler(event):
print("aliasHandler")
@chatbot.registerEventHandler(rcs_chatbot.EventType.NEWUSER)
def newUserHandler(event):
print("newUserHandler")
if __name__ == '__main__':
app.run(port=5000, debug=False)
Instead of a simple message, you can also use sendMessage
to send an AudioMessage
, etc. Show below is
how to send a RichcardCarousel
message.
@chatbot.registerEventHandler(maap.EventType.MESSAGE)
def messageHandler(event):
userContact = None
chatId = None
if "userContact" in event["messageContact"]:
userContact = event["messageContact"]["userContact"]
if "chatId" in event["messageContact"]:
chatId = event["messageContact"]["chatId"]
contact = maap.MessageContact(userContact, chatId)
card1 = maap.Richcard()
card1.setTitle("title")
card2 = maap.Richcard()
card2.setTitle("title")
carousel = maap.RichcardCarousel()
carousel.addRichcard(card1)
carousel.addRichcard(card2)
chatbot.sendMessage(
contact,
carousel
)
Sends a message with content
and optional suggestions
to the target recipient
.
recipient
- Object: AMessageContact
object.content
- Object: The message payload. Either a string, anAudioMessage
object, aFileMessage
object, aGeolocationPushMessage
object, aRichcard
object, or aRichcardCarousel
object.suggestions
- (Optional) Object: ASuggestions
object.
Gets the status of a message with messageId
.
messageId
- String: The message identifier.
Updates the status of a message with messageId
to status
.
messageId
- String: The message identifier.status
- String: The requested status. Needs to be eitherrcs_chatbot.MessageStatus.CANCELLED
orrcs_chatbot.MessageStatus.DISPLAYED
.
Gets the capabilities for a subscriber. Either userContact
or chatId
needs to be specified.
userContact
- String: The subscriber's MSISDN.chatId
- String: The user's anonymous token.
Uploads a file of type fileType
to the MaaP content storage until it expires at date until
Either path
or url
needs to be specified.
path
- String: The path to the file.url
- String: The URL to the file.fileType
- String: The file's content type.until
- Date: The date at which time the content should be expired.
Deletes a file with identifier fileId
from the MaaP content storage.
fileId
- String: The file identifier.
Gets info for a file with identifier fileId
from the MaaP content storage.
fileId
- String: The file identifier.
Starts the 'is typing' indicator for the target recipient
.
recipient
- Object: AMessageContact
object.
Stops the 'is typing' indicator for the target recipient
.
recipient
- Object: AMessageContact
object.
The main middleware for your bot's webhook. It parses the message payload, and fire the appropriate event.
An FileMessage
object representes a file and has the following properties:
Property | Type | Mandatory | Description |
---|---|---|---|
fileUrl |
String | Yes | The URL of the file. |
fileName |
String | No | The file name. |
fileMIMEType |
String | No | The MIME type of the file. |
fileSize |
Number | No | The size of the file. |
thumbnailUrl |
String | No | The URL of the thumbnail. |
thumbnailFileName |
String | No | The file name of the thumbnail. |
thumbnailMIMEType |
String | No | The MIME type of the thumbnail. |
thumbnailFileSize |
Number | No | The size of the thumbnail. |
Returns a new FileMessage
instance.
fileUrl
- String: The URL of the file.
Set the fileName
property.
fileName
- String: The file name.
Set the fileMIMEType
property.
fileMIMEType
- String: The MIME type of the file.
Set the fileSize
property.
fileSize
- Number: The size of the file.
Set the thumbnailUrl
property.
thumbnailUrl
- String: The URL of the thumbnail.
et the thumbnailFileName
property.
thumbnailFileName
- String: The file name of the thumbnail.
Set the thumbnailMIMEType
property.
thumbnailMIMEType
- String: The MIME type of the thumbnail.
Set the thumbnailFileSize
property.
thumbnailFileSize
- Number: The size of the thumbnail.
An AudioMessage
object representes an audio file and has the following properties:
Property | Type | Mandatory | Description |
---|---|---|---|
fileUrl |
String | Yes | The URL of the file. |
fileName |
String | No | The file name. |
fileMIMEType |
String | No | The MIME type of the file. |
fileSize |
Number | No | The size of the file. |
playingLength |
Number | No | The playing length of the audio. |
Returns a new AudioMessage
instance.
fileUrl
- String: The URL of the file.
Set the fileName
property.
fileName
- String: The file name.
Set the fileMIMEType
property.
fileMIMEType
- String: The MIME type of the file.
Set the fileSize
property.
fileSize
- Number: The size of the file.
Set the playingLength
property.
playingLength
- Number: The playing length of the audio.
Property | Type | Mandatory | Description |
---|---|---|---|
pos |
String | Yes | This are the coordinates in WGS 84 (latitude, longitude) decimal notation. Example "26.118 1289 - 80.1283921" |
label |
String | No | This can be used to tag the nature of the location. |
timestamp |
String | No | This is the time when the location information was pushed. |
expiry |
String | No | This is an absolute date at which time the recipient is no longer permitted to possess the location information. |
timeOffset |
Number | No | This is the time zone where the location information was pushed, expressed as the number of minutes away from UTC. |
radius |
Number | No | The radius of the circle will be represented in meters. |
Returns a new GeolocationPushMessage
instance. This is a geolocation push to be sent via RCS Geolocation Push.
pos
- String: This are the coordinates in WGS 84 (latitude, longitude) decimal notation.
Set the label
property.
label
- String: This can be used to tag the nature of the location.
Set the timestamp
property.
timestamp
- String: This is the time when the location information was pushed.
Set the expiry
property.
expiry
- String: This is an absolute date at which time the recipient is no longer permitted to possess the location information.
Set the timeOffset
property.
timeOffset
- Number: This is the time zone where the location information was pushed, expressed as the number of minutes away from UTC.
Set the radius
property.
radius
- Number: The radius of the circle will be represented in meters.
Returns a new Richcard
instance.
Returns a new Richcard
instance.
Set the orientation of the card.
cardOrientation
- String: Eitherrcs_chatbot.CardOrientation.HORIZONTAL
orrcs_chatbot.CardOrientation.VERTICAL
.
Set the alignment of the image on the card.
imageAlignment
- String: Eitherrcs_chatbot.ImageAlignment.LEFT
orrcs_chatbot.ImageAlignment.RIGHT
.
setMedia(mediaUrl, mediaContentType, mediaFileSize, height, [thumbnailUrl], [thumbnailContentType], [thumbnailFileSize], [contentDescription])
Set the media (image) to be displayed on the richcard.
mediaUrl
- String: The URL to the image.mediaContentType
- String: The content type of the image.mediaFileSize
- Number: The size of the image.height
- String: Eitherrcs_chatbot.MediaHeight.SHORT
orrcs_chatbot.MediaHeight.MEDIUM
orrcs_chatbot.MediaHeight.TALL
.thumbnailUrl
- (Optional) String: The URL to the thumbnail for the image.thumbnailContentType
- (Optional) String: The content type of the thumbnail.thumbnailFileSize
- (Optional) Number: The size of the thumbnail.contentDescription
- (Optional) String: Textual description of media content.
The thumbnailUrl
property is optional, but if used, thumbnailContentType
and thumbnailFileSize
must be provided as well.
Set the title of the card.
title
- String: The title.
Set the description of the card.
description
- String: The description.
Add suggestions to the card.
suggestions
- Suggestions: The suggestions.
Returns a new RichcardCarousel
instance.
Set the width of the cards in the carousel.
cardWidth
- String: Eitherrcs_chatbot.CardWidth.SMALL
orrcs_chatbot.CardWidth.MEDIUM
.
Add a card to the carousel.
richcard
- Richcard: TheRichcard
object.
Suggested Replies consist of a display text and a set of postback data.
Suggested Actions are grouped into seven different categories supporting a total of twelve different suggested actions:
- urlAction:
- openUrl - Opens a web site or app via deep linking.
- dialerAction:
- dialPhoneNumber - Calls a phone number via the user's dialer app.
- dialEnrichedCall - Start an Enriched Call via the user’s dialer app.
- dialVideoCall - Start a video call via the user’s dialer app.
- mapAction:
- showLocation - Show location(s) on a map for given coordinates or search query.
- requestLocationPush - Request for a one-time geo location push.
- calendarAction:
- createCalendarEvent - Creates a new event on the user's calendar.
- composeAction:
- composeTextMessage - Compose a draft text message.
- composeRecordingMessage - Compose a draft message and start recording audio or video.
- deviceAction:
- requestDeviceSpecifics - Request for a one-time share of device specifics (device model, operating system version, messaging client identifier and version, and remaining battery charge in minutes).
- settingsAction:
- disableAnonymization - Ask the user to disable the anonymization setting.
- enableDisplayedNotifications - Ask the user to enable sending displayed notifications.
Most actions allow fallback URLs in case a user does not have any app of the required type installed. Chatbot platforms can use the fallback URL to suggest an appropriate app to the user.
Returns a new Suggestions
instance.
On-the-wire example:
{
"reply": {
"displayText": "Yes",
"postback": {
"data": "set_by_chatbot_reply_yes"
}
}
}
On-the-wire example:
{
"action": {
"urlAction": {
"openUrl": {
"url": "https://www.google.com"
}
},
"displayText": "Open website or deep link",
"postback": {
"data": "set_by_chatbot_open_url"
}
}
}
On-the-wire example:
{
"action": {
"dialerAction": {
"dialPhoneNumber": {
"phoneNumber": "+1650253000"
}
},
"displayText": "Call a phone number",
"postback": {
"data": "set_by_chatbot_dial_phone_number"
}
}
},
{
"action": {
"dialerAction": {
"dialEnrichedCall": {
"phoneNumber": "+1650253000",
"subject": "The optional subject for the enriched call"
}
},
"displayText": "Start enriched call",
"postback": {
"data": "set_by_chatbot_dial_enriched_call"
}
}
},
{
"action": {
"dialerAction": {
"dialVideoCall": {
"phoneNumber": "+1650253000"
}
},
"displayText": "Start video call",
"postback": {
"data": "set_by_chatbot_dial_video_call"
}
}
}
On-the-wire example:
{
"action": {
"mapAction": {
"requestLocationPush": {}
},
"displayText": "Request a geo location",
"postback": {
"data": "set_by_chatbot_request_location_push"
}
}
}
On-the-wire example:
{
"action": {
"mapAction": {
"showLocation": {
"location": {
"latitude": 37.4220041,
"longitude": -122.0862515,
"label": "Googleplex"
},
"fallbackUrl": "https://www.google.com/maps/@37.4219162,-122.078063,15z"
}
},
"displayText": "Show location on a map",
"postback": {
"data": "set_by_chatbot_show_location"
}
}
},
{
"action": {
"mapAction": {
"showLocation": {
"location": {
"query": "restaurants"
},
"fallbackUrl": "https://www.google.com/maps/search/restaurants"
}
},
"displayText": "Search location(s) on map",
"postback": {
"data": "set_by_chatbot_search_locations"
}
}
}
On-the-wire example:
{
"action": {
"calendarAction": {
"createCalendarEvent": {
"startTime": "2017-03-14T00:00:00Z",
"endTime": "2017-03-14T23:59:59Z",
"title": "Meeting",
"description": "GSG review meeting"
}
},
"displayText": "Schedule Meeting",
"postback": {
"data": "set_by_chatbot_create_calendar_event"
}
}
}
On-the-wire example:
{
"action": {
"composeAction": {
"composeTextMessage": {
"phoneNumber": "+1650253000",
"text": "Draft to go into the send message text field."
}
},
"displayText": "Draft a text message",
"postback": {
"data": "set_by_chatbot_compose_text_message"
}
}
}
On-the-wire example:
{
"action": {
"composeAction": {
"composeRecordingMessage": {
"phoneNumber": "+1650253000",
"type": "VIDEO"
}
},
"displayText": "Record audio or video",
"postback": {
"data": "set_by_chatbot_compose_recording_message"
}
}
}
On-the-wire example:
{
"action": {
"deviceAction": {
"requestDeviceSpecifics": {}
},
"displayText": "Request device specifics",
"postback": {
"data": "set_by_chatbot_request_device_specifics"
}
}
}
On-the-wire example:
{
"action": {
"settingsAction": {
"disableAnonymization": {}
},
"displayText": "Share your phone number",
"postback": {
"data": "set_by_chatbot_disable_anonymization"
}
}
},
{
"action": {
"settingsAction": {
"enableDisplayedNotifications": {}
},
"displayText": "Send read receipts",
"postback": {
"data": "set_by_chatbot_enable_displayed_notifications"
}
}
}
A different event is triggered for each type of event an RCS chatbot can receive. Below are all the possible events with an example of the payload they provide.
Triggered when a 'message' event is sent to the bot.
event
- Object: An object containing the 'message' event payload.
Example usage:
@chatbot.registerEventHandler(rcs_chatbot.EventType.MESSAGE)
def messageHandler(event):
print("messageHandler")
Sample payload:
{
"RCSMessage": {
"msgId": "Xs8CI3tdf",
"textMessage": "hello world",
"timestamp": "2017-09-26T01:33:20.315Z"
},
"messageContact": {
"userContact": "+14251234567"
},
"event": "message"
}
Triggered when an 'isTyping' event is sent to the bot.
event
- Object: An object containing the 'isTyping' event payload.
Example usage:
@chatbot.registerEventHandler(rcs_chatbot.EventType.ISTYPING)
def isTypingHandler(event):
print("isTypingHandler")
Sample payload:
{
"RCSMessage": {
"msgId": "Xs8CI3tdf",
"isTyping": "active",
"timestamp": "2017-09-26T01:33:20.315Z"
},
"messageContact": {
"userContact": "+14251234567"
},
"event": "isTyping"
}
Triggered when a 'messageStatus' event is sent to the bot.
event
- Object: An object containing the 'messageStatus' event payload.
Example usage:
@chatbot.registerEventHandler(rcs_chatbot.EventType.MESSAGESTATUS)
def messageStatusHandler(event):
print("messageStatusHandler")
Sample payload:
{
"RCSMessage": {
"msgId": "MzJmajlmamVzZGZ8bmk5MHNlbmRmZTAz",
"status": "displayed",
"timestamp": "2017-09-26T01:33:20.315Z"
},
"messageContact": {
"userContact": "+14251234567"
},
"event": "messageStatus"
}
Triggered when a 'fileStatus' event is sent to the bot.
event
- Object: An object containing the 'fileStatus' event payload.
Example usage:
@chatbot.registerEventHandler(rcs_chatbot.EventType.FILESTATUS)
def fileStatusHandler(event):
print("fileStatusHandler")
Sample payload:
{
"file": {
"fileId": "MzJmajlmamVzZGZ8bmk5MHNlbmRmZTAz",
"fileUrl": "http://www.example.com/files/f.jpg",
"fileSize": 123456,
"status": "ready",
"validity": "2017-10-03T22:31:00.597Z"
},
"event": "fileStatus"
}
Triggered when a 'response' event is sent to the bot.
event
- Object: An object containing the 'response' event payload.
Example usage:
@chatbot.registerEventHandler(rcs_chatbot.EventType.RESPONSE)
def responseHandler(event):
print("responseHandler")
Sample payload:
{
"RCSMessage": {
"msgId": "MzJmajlmamVzZGZ8bmk5MHNlbmRmZTAz",
"suggestedResponse": {
"response": {
"action": {
"displayText": "Visit Website",
"postback": {
"data": "set_by_chatbot_reply_yes"
}
}
}
},
"timestamp": "2017-09-26T01:33:20.315Z"
},
"messageContact": {
"userContact": "+14251234567"
},
"event": "response"
}
Triggered when a 'alias' event is sent to the bot.
event
- Object: An object containing the 'alias' event payload.
Example usage:
@chatbot.registerEventHandler(rcs_chatbot.EventType.ALIAS)
def aliasHandler(event):
print("aliasHandler")
Sample payload:
{
"RCSMessage": {
"msgId": "MzJmajlmamVzZGZ8bmk5MHNlbmRmZTAz",
"timestamp": "2017-09-26T01:33:20.315Z"
},
"messageContact": {
"userContact": "+14251234567",
"chatId": "93JF93SEIJFE"
},
"event": "alias"
}
Triggered when a 'newUser' event is sent to the bot.
event
- Object: An object containing the 'newUser' event payload.
Example usage:
@chatbot.registerEventHandler(rcs_chatbot.EventType.NEWUSER)
def newUserHandler(event):
print("newUserHandler")
Sample payload:
{
"RCSMessage": {
"msgId": "MzJmajlmamVzZGZ8bmk5MHNlbmRmZTAz",
"suggestedResponse": {
"response": {
"reply": {
"displayText": "Start Chat",
"postback": {
"data": "new_bot_user_initiation"
}
}
}
},
"timestamp": "2017-09-26T01:33:20.315Z"
},
"messageContact": {
"userContact": "+14251234567"
},
"event": "newUser"
}
- Verify constraints before sending
- Look for missing fields like trafficType (there may be more)