bot

Skypeボットを使ってSkypeチャットのConversation IDを取得する手順

はじめに

Skype上の全てのチャットには固有のIDが付与されており、これをConversation ID(カンバセーションID、Conversationは「会話」という意味です。)と呼びます。Conversation IDは、Skype上の1対1、グループ含む全てのチャットに付与されます。そしてこのConversation IDを使って、例えばSkypeボットにメッセージを投稿させたり、ユーザからのメッセージを受信したりするチャットを指定することができます。ここではこのConversation IDの取得手順をメモします。

できるようになること

Skype上のチャットのConversation IDを取得できます。1対1チャット、グループチャットどちらでも取得できます。

前提と環境と必要となるもの

以下を前提としています。

  • Microsoftアカウントは取得済とする。Microsoft Azureを使用するため。
  • Microsoft Azure上で、エコーボットの作成を完了していることを前提とします。エコーボットの作成は、Microsoft Azure上でBasicという名前のボットテンプレートを使うとコードを書くことなく簡単に作成できます。詳しい手順はこちらMicrosoft Bot FrameworkでSkypeのエコーボットを作成する手順にまとめていますのでまだ作成していない場合はご覧ください。

エコーボットの応答内容をConversation IDにする

Microsoft Azure上でエコーボットのコードを1行だけ変更し、ユーザのメッセージ投稿に対してそのチャットのConversation IDを応答してくれるボットに変更します。
なお、今回はわずかな変更となるので、ここではMicrosoft Azure上のオンラインエディタを使ってコードの編集を行います。MIcorosft Azure上で作成したボットのダッシュボードに移動し、その中に「ビルド」をクリックします。すると、以下のように右下に「オンラインコードエディターを開く」とあるので、これをクリックします。

「オンラインコードエディターを開く」をクリックすると、以下のようにコードが表示されます。この中で、以下のように「app.js」をクリックし、開きます。

app.jsの中身は、以下のようなコードになっています。(2018年10月時点)

app.js/*-----------------------------------------------------------------------------
A simple echo bot for the Microsoft Bot Framework. 
-----------------------------------------------------------------------------*/

var restify = require('restify');
var builder = require('botbuilder');
var botbuilder_azure = require("botbuilder-azure");

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});
  
// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword,
    openIdMetadata: process.env.BotOpenIdMetadata
});

// Listen for messages from users 
server.post('/api/messages', connector.listen());

/*----------------------------------------------------------------------------------------
* Bot Storage: This is a great spot to register the private state storage for your bot. 
* We provide adapters for Azure Table, CosmosDb, SQL Azure, or you can implement your own!
* For samples and documentation, see: https://github.com/Microsoft/BotBuilder-Azure
* ---------------------------------------------------------------------------------------- */

var tableName = 'botdata';
var azureTableClient = new botbuilder_azure.AzureTableClient(tableName, process.env['AzureWebJobsStorage']);
var tableStorage = new botbuilder_azure.AzureBotStorage({ gzipData: false }, azureTableClient);

// Create your bot with a function to receive messages from the user
var bot = new builder.UniversalBot(connector);
bot.set('storage', tableStorage);

var request = require('request');

bot.dialog('/', function (session) {   
    session.send('You said ' + session.message.text);
});

app.jsの中で今回変更するのは、最後のsession.send('You said ' + session.message.text);です。ここのsession.sendの引数がユーザが投稿したメッセージへの応答内容になります。そしてデフォルトでは'You said ' + session.message.textを引数とすることでYou said ユーザの投稿メッセージと返しています。この部分を以下のように変更します。

(・・・上省略・・・)
bot.dialog('/', function (session) {   
  //  session.send('You said ' + session.message.text);
       session.send('Your conversation id is : ' + session.message.address.conversation.id);
});

見てわかるとおり、session.message.textsession.message.address.conversation.idに置き換えています。session.messageはユーザからの投稿メッセージに関する全ての情報を含んでおり、その中からConversation IDを取得するためにsession.message.address.conversation.idで取り出しています。これはJSON形式で送られてきます。この中身については後述しています。

あとは、実際に自身のSkypeアプリから、このボットが追加されているグループチャット、もしくは1対1チャットでボットに対してメッセージを投稿すると、Conversation IDが返ってきます。なお、グループチャットではボット宛にメッセージを送信しないと反応しないため注意が必要です。つまり、グループチャット上でメッセージとして「@ボット名 適当な投稿メッセージ」を投稿してください。
以下はグループチャットのConversatino IDですが、以下のようなものが返ってきます。

Conversation ID19:34068j05y3p2u7235l5n7jkhbkbk4b5h@thread.skype

ユーザからの投稿メッセージの中身

ユーザがSkype上でボットに対してメッセージを投稿すると、ボットは以下のようなJSONデータを受け取ります。上記のコードでは、session.messageが以下のJSONデータそのものでした。よって、下記を見てわかるとおり、session.message.textとすればユーザのメッセージ内容(以下では”Hello Bot”)、そしてsession.message.address.conversation.idとすればConversation IDを取得できることがわかると思います。なお、以下はグループチャットの場合のユーザの投稿メッセージになるため、Conversationの項目の中にisGroupがあり、これがtrueになっています。

{
    "text": "Hello Bot", // ユーザの投稿メッセージ
    "type": "message",
    "timestamp": "2018-09-16T11:32:33.981Z",
    "entities": [{
        "mentioned": {
            "id": "246l549870345j708j0gjsdphjetoly5"
        },
        "text": "myBot",
        "type": "mention"
    }, {
        "locale": "ja-JP",
        "country": "JP",
        "platform": "Windows",
        "type": "clientInfo"
    }],
    "sourceEvent": {
        "text": "myBot test2"
    },
    "attachments": [],
    "address": {
        "id": "13803852457987",
        "channelId": "skype",
        "user": {
            "id": "3543-79u23j9-v236mjub0p39u56njb093527ub"
        },
        "conversation": {
            "isGroup": true,
            "id": "19:34068j05y3p2u7235l5n7jkhbkbk4b5h@thread.skype" // Conversation ID
        },
        "bot": {
            "id": "2834068hn6hg893o2y6hfj8y295346105",
            "name": "myBot"
        },
        "serviceUrl": "https://smba.trafficmanager.net/apis/"
    },
    "source": "skype",
    "agent": "botbuilder",
    "user": {
        "id": "3543-79u23j9-v236mjub0p39u56njb093527ub"
    }
}
}

まとめ

Conversation IDが取得できたら後は実際にSkypeボットに任意のチャットに対してメッセージを投稿させたり、ユーザからのメッセージを受信して応答させたりすることができます。

SPONSORED LINK

コメントを残す

メールアドレスが公開されることはありません。