Implementare funzionalità specifiche del canale

SI APPLICA A: SDK v4

Alcuni canali forniscono funzionalità che non possono essere implementate solo con testo e allegati di messaggi. Per implementare funzionalità specifiche del canale, è possibile passare metadati nativi a un canale nella proprietà channel data dell'oggetto activity. Ad esempio, il bot può usare la proprietà channel data per indicare a Telegram di inviare uno sticker o a Office365 di inviare un messaggio di posta elettronica.

Questo articolo illustra come usare la proprietà channel data di un'attività di tipo messaggio per implementare queste funzionalità specifiche del canale:

Channel Funzionalità
Posta elettronica Inviare e ricevere un messaggio di posta elettronica contenente metadati corpo, oggetto e importanza.
Facebook Inviare notifiche di Facebook in modo nativo.
LINE Inviare un messaggio che implementa tipi di messaggi specifici della riga.
Slack Inviare messaggi Slack con fedeltà completa.
Teams Gestire le @-mention nei messaggi di Microsoft Teams.
Telegram Eseguire azioni specifiche di Telegram, ad esempio la condivisione di un memo vocale o un adesivo.

Nota

Il valore della proprietà channel data di un oggetto activity è un oggetto JSON. Di conseguenza, gli esempi di questo articolo illustrano il formato previsto della proprietà JSON channelData in vari scenari. Per creare un oggetto JSON con .NET usare la classe JObject (.NET).

Creare un messaggio di posta elettronica personalizzato

Per creare un messaggio di posta elettronica personalizzato, impostare la proprietà activity channelData su un oggetto JSON contenente le proprietà seguenti:

Proprietà Descrizione
bccRecipients Stringa di indirizzi di posta elettronica delimitata da punto e virgola (;) da aggiungere al campo Ccn (copia per conoscenza nascosta).
ccRecipients Stringa di indirizzi di posta elettronica delimitata da punto e virgola (;) da aggiungere al campo Cc (copia per conoscenza).
htmlBody Un documento HTML che specifica il corpo del messaggio di posta elettronica. Per informazioni sugli elementi HTML e gli attributi supportati, vedere la documentazione del canale.
importance Il livello di importanza del messaggio di posta elettronica. I valori validi sono high, normal e low. Il valore predefinito è normal.
toRecipients Stringa di indirizzi di posta elettronica delimitata da punto e virgola (;) da aggiungere al campo A.

I messaggi in uscita e in ingresso tra l'utente e il bot possono avere un'attività che contiene un channelData oggetto JSON le cui proprietà vengono specificate nella tabella precedente. Il frammento di codice seguente mostra un esempio della channelData proprietà per un messaggio di posta elettronica personalizzato in ingresso, dal bot all'utente.

{
    "type": "ActivityTypes.Message",
    "locale": "en-Us",
    "channelID": "email",
    "fromName": { "id": "mybot@mydomain.com", "name": "My bot"},
    "recipientName": { "id": "joe@otherdomain.com", "name": "Joe Doe"},
    "conversation": { "id": "123123123123", "topic": "awesome chat" },
    "channelData":
    {
        "htmlBody": "<html><body style = \"font-family: Calibri; font-size: 11pt;\" >This is more than awesome.</body></html>",
        "importance": "high",
        "ccRecipients": "Yasemin@adatum.com;Temel@adventure-works.com",
    }
}

Creare una notifica Facebook

Per creare una notifica Facebook, impostare la proprietà channel data dell'oggetto activity su un oggetto JSON che specifica queste proprietà:

Proprietà Descrizione
notification_type Tipo di notifica, ad esempio REGULAR, SILENT_PUSH o NO_PUSH.
attachment Allegato che specifica un'immagine, un video o un altro tipo di elemento multimediale oppure allegato basato su modelli come una ricevuta.

Nota

Per informazioni dettagliate sul formato e sul contenuto delle proprietà notification_type e attachment, vedere la documentazione dell'API Facebook.

Questo frammento mostra un esempio della proprietà channelData per un allegato Facebook di tipo ricevuta.

"channelData": {
    "notification_type": "NO_PUSH",
    "attachment": {
        "type": "template"
        "payload": {
            "template_type": "receipt",
            //...
        }
    }
}

Creare un messaggio LINE

Per creare un messaggio che implementa tipi di messaggi specifici della linea (ad esempio adesivi, modelli o tipi di azione specifici della linea, ad esempio l'apertura della fotocamera del telefono), impostare la proprietà dei dati del canale dell'oggetto attività su un oggetto JSON che specifica tipi di messaggio LINE e tipi di azione.

Proprietà Descrizione
type Il nome del tipo di messaggio/azione di LINE

Sono supportati questi tipi di messaggio di LINE:

  • Sticker
  • Imagemap
  • Template (pulsante, conferma, sequenza)
  • Flex

Nel campo dell'azione dell'oggetto JSON del tipo di messaggio è possibile specificare queste azioni di LINE:

  • Postback
  • Message
  • URI
  • Datetimerpicker
  • Camera
  • CameraRoll
  • Location

Per informazioni dettagliate su questi metodi di LINE e sui rispettivi parametri, vedere la documentazione dell'API Bot Line.

Questo frammento di codice mostra un esempio di proprietà che specifica un tipo di ButtonTemplate messaggio di canale e tre tipi di channelData azione: "fotocamera", "cameraRoll" e "datetimepicker".

"channelData": {
    "type": "template",
    "altText": "This is a buttons template",
    "template": {
        "type": "buttons",
        "thumbnailImageUrl": "https://example.com/bot/images/image.jpg",
        "imageAspectRatio": "rectangle",
        "imageSize": "cover",
        "imageBackgroundColor": "#FFFFFF",
        "title": "Menu",
        "text": "Please select",
        "defaultAction": {
            "type": "uri",
            "label": "View detail",
            "uri": "http://example.com/page/123"
        },
        "actions": [{
                "type": "cameraRoll",
                "label": "Camera roll"
            },
            {
                "type": "camera",
                "label": "Camera"
            },
            {
                "type": "datetimepicker",
                "label": "Select date",
                "data": "storeId=12345",
                "mode": "datetime",
                "initial": "2017-12-25t00:00",
                "max": "2018-01-24t23:59",
                "min": "2017-12-25t00:00"
            }
        ]
    }
}

Creare un messaggio Slack con la massima fedeltà

Per creare un messaggio Slack con fedeltà completa, impostare la proprietà dei dati del canale dell'oggetto activity su un oggetto JSON che specifica:

Nota

Per supportare i pulsanti nei messaggi Slack, è necessario abilitare Interactive Messages (Messaggi interattivi) al momento della connessione del bot al canale Slack.

Questo frammento mostra un esempio della proprietà channelData per un messaggio Slack personalizzato.

"channelData": {
   "text": "Now back in stock! :tada:",
   "attachments": [
        {
            "title": "The Further Adventures of Slackbot",
            "author_name": "Stanford S. Strickland",
            "author_icon": "https://api.slack.com/img/api/homepage_custom_integrations-2x.png",
            "image_url": "http://i.imgur.com/OJkaVOI.jpg?1"
        },
        {
            "fields": [
                {
                    "title": "Volume",
                    "value": "1",
                    "short": true
                },
                {
                    "title": "Issue",
                    "value": "3",
                    "short": true
                }
            ]
        },
        {
            "title": "Synopsis",
            "text": "After @episod pushed exciting changes to a devious new branch back in Issue 1, Slackbot notifies @don about an unexpected deploy..."
        },
        {
            "fallback": "Would you recommend it to customers?",
            "title": "Would you recommend it to customers?",
            "callback_id": "comic_1234_xyz",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "actions": [
                {
                    "name": "recommend",
                    "text": "Recommend",
                    "type": "button",
                    "value": "recommend"
                },
                {
                    "name": "no",
                    "text": "No",
                    "type": "button",
                    "value": "bad"
                }
            ]
        }
    ]
}

Quando un utente fa clic su un pulsante in un messaggio Slack, il bot riceve un messaggio di risposta in cui la proprietà channel data è popolata con un oggetto JSON payload. L'oggetto payload specifica il contenuto del messaggio originale e identifica il pulsante selezionato e l'utente che ha fatto clic sul pulsante.

Questo frammento mostra un esempio della proprietà channelData nel messaggio che un bot riceve quando un utente fa clic su un pulsante nel messaggio Slack.

"channelData": {
    "payload": {
        "actions": [
            {
                "name": "recommend",
                "value": "yes"
            }
        ],
        //...
        "original_message": "{...}",
        "response_url": "https://hooks.slack.com/actions/..."
    }
}

Il bot può rispondere a questo messaggio in modo normale oppure inviare la risposta direttamente all'endpoint specificato dalla proprietà response_url dell'oggetto payload. Per informazioni su come e quando inviare una risposta a response_url, vedere il documento relativo ai pulsanti Slack.

È possibile creare pulsanti dinamici usando il codice JSON seguente:

{
    "text": "Would you like to play a game ? ",
    "attachments": [
        {
            "text": "Choose a game to play!",
            "fallback": "You are unable to choose a game",
            "callback_id": "wopr_game",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "actions": [
                {
                    "name": "game",
                    "text": "Chess",
                    "type": "button",
                    "value": "chess"
                },
                {
                    "name": "game",
                    "text": "Falken's Maze",
                    "type": "button",
                    "value": "maze"
                },
                {
                    "name": "game",
                    "text": "Thermonuclear War",
                    "style": "danger",
                    "type": "button",
                    "value": "war",
                    "confirm": {
                        "title": "Are you sure?",
                        "text": "Wouldn't you prefer a good game of chess?",
                        "ok_text": "Yes",
                        "dismiss_text": "No"
                    }
                }
            ]
        }
    ]
}

Per creare menu interattivi, usare il codice JSON seguente:

{
    "text": "Would you like to play a game ? ",
    "response_type": "in_channel",
    "attachments": [
        {
            "text": "Choose a game to play",
            "fallback": "If you could read this message, you'd be choosing something fun to do right now.",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "callback_id": "game_selection",
            "actions": [
                {
                    "name": "games_list",
                    "text": "Pick a game...",
                    "type": "select",
                    "options": [
                        {
                            "text": "Hearts",
                            "value": "menu_id_hearts"
                        },
                        {
                            "text": "Bridge",
                            "value": "menu_id_bridge"
                        },
                        {
                            "text": "Checkers",
                            "value": "menu_id_checkers"
                        },
                        {
                            "text": "Chess",
                            "value": "menu_id_chess"
                        },
                        {
                            "text": "Poker",
                            "value": "menu_id_poker"
                        },
                        {
                            "text": "Falken's Maze",
                            "value": "menu_id_maze"
                        },
                        {
                            "text": "Global Thermonuclear War",
                            "value": "menu_id_war"
                        }
                    ]
                }
            ]
        }
    ]
}

Aggiungere un bot a Teams

I bot aggiunti a un team diventano un altro membro del team e possono essere @mentioned durante la conversazione. Infatti, i bot ricevono solo messaggi quando sono @mentioned, quindi altre conversazioni sul canale non vengono inviate al bot. Per altre informazioni, vedere Conversazioni chat di gruppo e di canale con un bot Microsoft Teams.

Poiché i bot in un gruppo o un canale rispondono solo quando vengono menzionati (@botname) in un messaggio, ogni messaggio ricevuto da un bot in un canale di gruppo contiene il proprio nome e è necessario assicurarsi che l'analisi dei messaggi gestisca tale operazione. I bot possono inoltre analizzare altri utenti menzionati e menzionare utenti nei propri messaggi.

Cercare e rimuovere la menzione @bot

Mention[] m = sourceMessage.GetMentions();
var messageText = sourceMessage.Text;

for (int i = 0;i < m.Length;i++)
{
    if (m[i].Mentioned.Id == sourceMessage.Recipient.Id)
    {
        //Bot is in the @mention list.
        //The below example will strip the bot name out of the message, so you can parse it as if it wasn't included. Note that the Text object will contain the full bot name, if applicable.
        if (m[i].Text != null)
            messageText = messageText.Replace(m[i].Text, "");
    }
}
var text = message.text;
if (message.entities) {
    message.entities
        .filter(entity => ((entity.type === "mention") && (entity.mentioned.id.toLowerCase() === botId)))
        .forEach(entity => {
            text = text.replace(entity.text, "");
        });
    text = text.trim();
}

Importante

L'aggiunta di un bot da GUID, per scopi diversi da quelli di test, non è consigliata. Questa operazione limita infatti notevolmente la funzionalità di un bot. Per aggiungere bot in produzione a Teams, è necessario includerli in un'app. Vedere Creare un bot e Testare ed eseguire il debug del bot Microsoft Teams.

Creare un messaggio Telegram

Per creare un messaggio che implementa azioni specifiche di Telegram, come la condivisione di un promemoria vocale o di uno sticker, impostare la proprietà channel data dell'oggetto activity su un oggetto JSON che specifica queste proprietà:

Proprietà Descrizione
method Il metodo di Telegram Bot API da chiamare.
parametri I parametri del metodo specificato.

Sono supportati i metodi di Telegram seguenti:

  • answerInlineQuery
  • editMessageCaption
  • editMessageReplyMarkup
  • editMessageText
  • forwardMessage
  • banChatMember
  • sendAudio
  • sendChatAction
  • sendContact
  • sendDocument
  • sendLocation
  • sendMessage
  • sendPhoto
  • sendSticker
  • sendVenue
  • sendVideo
  • sendVoice
  • unbanChatMember

Per informazioni dettagliate su questi metodi di Telegram e i rispettivi parametri, vedere la documentazione di Telegram Bot API.

Nota

  • Il parametro chat_id è comune a tutti i metodi di Telegram. Se non si specifica chat_id come parametro, il framework fornirà l'ID per l'utente.
  • Anziché passare il contenuto del file inline, specificare il file con un URL e il tipo di elemento multimediale come illustrato nell'esempio di seguito.
  • In ogni messaggio che il bot riceve dal canale Telegram, la proprietà ChannelData includerà il messaggio inviato in precedenza dal bot.

Questo frammento di codice mostra un esempio di channelData proprietà che specifica un singolo metodo Telegram:

"channelData": {
    "method": "sendSticker",
    "parameters": {
        "sticker": {
            "url": "https://domain.com/path/gif",
            "mediaType": "image/gif",
        }
    }
}

Questo frammento di codice mostra un esempio di channelData proprietà che specifica una matrice di metodi Telegram:

"channelData": [
    {
        "method": "sendSticker",
        "parameters": {
            "sticker": {
                "url": "https://domain.com/path/gif",
                "mediaType": "image/gif",
            }
        }
    },
    {
        "method": "sendMessage",
        "parameters": {
            "text": "<b>This message is HTML formatted.</b>",
            "parse_mode": "HTML"
        }
    }
]

Quando viene implementato un metodo Telegram, il bot riceve un messaggio di risposta in cui la proprietà channel data è popolata con un oggetto JSON. Questo oggetto response specifica il contenuto del messaggio originale, incluso un update_id e, al massimo, un parametro facoltativo. Per informazioni sulla ricezione di risposte in ingresso, vedere la sezione sul recupero degli aggiornamenti.

Questo frammento di codice mostra un esempio della channelData proprietà nel messaggio che un bot riceve quando viene creato un polling:

"channelData": {
    "update_id": 43517575,
    "message": {
        "message_id": 618,
        "from": {
            "id": 803613355,
            "is_bot": false,
            "first_name": "Joe",
            "last_name": "Doe",
            "username": "jdoe",
            "language_code": "en"
        },
        "chat": {
            "id": 803613355,
            "first_name": "Joe",
            "last_name": "Doe",
            "username": "jdoe",
            "type": "private"
        },
        "date": 1582577834,
        "poll": {
        "id": "5089525250643722242",
        "question": "How to win?",
        "options": [
            {
                "text": "Be the best",
                "voter_count": 0
            },
            {
                "text": "Help those in need",
                "voter_count": 0
            },
            {
                "text": "All of the above",
                "voter_count": 0
            }
        ],
        "total_voter_count": 0,
        "is_closed": false,
        "is_anonymous": true,
        "type": "regular",
        "allows_multiple_answers": false
        }
    }
}

Risorse aggiuntive