web-dev-qa-db-ja.com

ボットにMicrosoftTeamsチャネルにメッセージを投稿させるにはどうすればよいですか?

docsクイックスタート で示したものと同じボットがあります。ユーザーの言うことは何でも繰り返します(今のところ)。

現在ローカルで実行されており、ngrokで公開されています。ボットをMicrosoftBotFrameworkに登録しました。

Microsoft BotFrameworkでMicrosoftTeamsチャネルを構成し、ボットをTeamsにサイドロードしました。私のボットはメッセージを受信できますfrom Teamsユーザー。

現在、ボットはユーザーに返されるものをすべて繰り返すだけですが、私がやりたいのはMicrosoft Teamsチャネルに投稿することです。最初にユーザーからのプロンプトが表示されることなく、ユーザーではなくチームチャネルに投稿したい。したがって、たとえば、特定の条件(たとえば、時刻、プルリクエストなどのイベントによってトリガーされる)が与えられると、チャネルにメッセージを投稿します。

プロアクティブなメッセージの送信 に関するドキュメントを読みましたが、チームチャネルにメッセージを送信するには、ボットがユーザーの「アドレス」を知っている必要があることを収集しました。この情報はsession.message.addressオブジェクトに保存され、現在の会話から取得されます。しかし、私の場合、「現在の保全」はありません。ユーザーに返信するだけではなく、積極的にチャンネルに投稿したいからです。

では、チームチャネルに必要な資格情報/アドレス/セッションデータを永続的に設定するにはどうすればよいですか?

私が調べたもの:

  • Webhook。 TeamsチャネルでWebhookを構成しましたが、curlを使用して(Webhook URLを使用して)簡単にメッセージを送信できます。そのため、チームチャネルにURLのみ(認証は不要)の簡単なメッセージを送信できますが、このURLをボットに取得する方法がわかりません。

  • Microsoft Bot Frameworkでユーザーごとに異なるセッションを維持するにはどうすればよいですか? ここでの答えがmyの質問に答えるかどうかはわかりません。私の問題は、ボットがTeamsユーザーではなく「会話」を開始していることです。そのため、ボットがどこに行くべきかを認識できるように、セッションデータを自分で設定できる必要があります。

App.js:

require('dotenv').config();
var restify = require('restify');
var builder = require('botbuilder');

// 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.Microsoft_APP_ID,
    appPassword: process.env.Microsoft_APP_PASSWORD    
});

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

// Receive messages from the user and respond by echoing each message back (prefixed with 'You said:')
var bot = new builder.UniversalBot(connector, function (session) {
    session.send("You said: %s", session.message.text);
});
8
andydavies

C#についても同じことを考えている人のために、これが私のために働いた解決策です:

    var channelData = context.Activity.GetChannelData<TeamsChannelData>();
    var message = Activity.CreateMessageActivity();
    message.Text = "Hello World";

    var conversationParameters = new ConversationParameters
    {
         IsGroup = true,
         ChannelData = new TeamsChannelData
          {
             Channel = new ChannelInfo(channelData.Channel.Id),
         },
         Activity = (Activity) message
    };

    var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
    var response = await 
    connectorClient.Conversations.CreateConversationAsync(conversationParameters);

注:これをボットのコントローラーコードの外部で呼び出す場合は、次に示すように、serviceUrlでTrustServiceUrlを呼び出す必要があります。

    MicrosoftAppCredentials.TrustServiceUrl(serviceUrl, DateTime.MaxValue);
    var connectorClient = new ConnectorClient(new Uri(serviceUrl));

回答のソース: https://github.com/OfficeDev/BotBuilder-MicrosoftTeams/issues/162

5

それは間違いなく可能です。これらをプロアクティブメッセージと呼び、ユーザーとチャネルの両方にプロアクティブにメッセージを送信することができます。

後者については、 https://github.com/OfficeDev/Microsoft-teams-sample-complete-node のサンプル、具体的にはこのファイル ProactiveMsgToChannelDialog.ts を参照してください。

プロアクティブなメッセージをチャネルに送信するには、Microsoft Teams SDKを使用する必要があります(これらのサンプルのように)。

最後になりましたが、マニフェストが必要なチーム内のチャネルの1つにメッセージを送信するには、ボットをチームに追加する必要があります。

2

これがうまくいくことを願っています。以下のコードは、チャットを開始する前にメッセージをセッションにプロアクティブに送信します。

 bot.on('conversationUpdate', function (message) {  
       if (message.membersAdded[0].id === message.address.bot.id) {             
             var reply = new builder.Message()    
                   .address(message.address)               
                   .text("Hello"");        
             bot.send(reply);    
       }
    });