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ユーザーではなく「会話」を開始していることです。そのため、ボットがどこに行くべきかを認識できるように、セッションデータを自分で設定できる必要があります。
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);
});
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
それは間違いなく可能です。これらをプロアクティブメッセージと呼び、ユーザーとチャネルの両方にプロアクティブにメッセージを送信することができます。
後者については、 https://github.com/OfficeDev/Microsoft-teams-sample-complete-node のサンプル、具体的にはこのファイル ProactiveMsgToChannelDialog.ts を参照してください。
プロアクティブなメッセージをチャネルに送信するには、Microsoft Teams SDKを使用する必要があります(これらのサンプルのように)。
最後になりましたが、マニフェストが必要なチーム内のチャネルの1つにメッセージを送信するには、ボットをチームに追加する必要があります。
これがうまくいくことを願っています。以下のコードは、チャットを開始する前にメッセージをセッションにプロアクティブに送信します。
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);
}
});