web-dev-qa-db-ja.com

Microsoft Teamsのボットにプログラムでメッセージを送信する

ユーザーがボットとの会話を開始したときに、ユーザーに基本的に特定の質問をするプロアクティブボットを作成しました。ボットはMicrosoft Teams環境にデプロイされます。チャネルのボットに自動メッセージを送信する方法はありますか?特定のチームによって公開されたWebhook URLを利用するか、MS Flowを使用することにより、Powershellを使用してメッセージを送信できることを知っています。しかしボット(例:@mybothandle)をメッセージで説明したいなので、ボットはユーザーに(ボットを手動で言及することによって)会話を開始するように要求するのではなく、自分で質問し始めますしかし方法を見つける言及する。あなたの提案は大歓迎です。

今後のすべての訪問者に対して、Microsoft Graph API(ベータ)は、メッセージを送信し、次のエンドポイントを使用してボット/ユーザーに言及する方法を提供します。

 https://graph.Microsoft.com/beta/teams/{group-id-for-teams}/channels/{channel-id}/messages

方法:POST

ボディ

"body": {
    "contentType": "html",
    "content": "Hello World <at id=\"0\">standupbot</at>"
  },
  "mentions": [
    {
      "id": 0,
      "mentionText": "StandupBot",
      "mentioned": {
        "application": {
                            "id": "[my-bot-id]",
                            "displayName": "StandupBot",
                            "applicationIdentityType": "bot"
                        }
      }
    }
  ]
}

ただし、メッセージを受信して​​もボットが応答しないというバグがあります。 グラフAPIを使用してメッセージを送信すると、ボットが@Mentionに応答しません

基本的には、特定の時点(24時間後など)に直接ユーザーにメッセージを送信する必要があります。私はいくつかの異なるボットでこれを行っているので、それは間違いなく可能です。 Wajeedがあなたの質問へのコメントで送信したリンクは、まさにあなたが必要とするものです。ユーザーがボットとやり取りするとき、会話ID、会話タイプ、サービスURL、およびTo and From情報などの重要な情報を保存する必要があります。たとえば、これをデータベースに保存し、完全に別のアプリケーションでボットと同じように呼び出しを行うことができます。たとえばボットでは、ボットを通常のホスト(Azure Webサイトなど)でホストしていますが、たとえば24時間後にメッセージを送信するAzure関数があります。通常のように、ボットからのメッセージのようにユーザーに表示されます。

また、ボット用のMicrosoftアプリIDとアプリパスワードも必要になります。これは、すでに持っているはずです(そうでない場合は、Azureポータルにあります)。

「送信」アプリケーションでは、Microsoftのインスタンスを作成する必要があります。次のようなBot.Connector.ConnectorClient:

var Connector = new ConnectorClient(serviceUrl, microsoftAppId: credentialProvider.AppId, microsoftAppPassword: credentialProvider.Password);

次のように、呼び出すサービスのURLを「信頼」する必要もあります。

MicrosoftAppCredentials.TrustServiceUrl(serviceURL);

次に、Microsoft.Bot.Schema.Activityのインスタンスを作成し、必要なプロパティを設定して、作成したコネクタ経由で送信します。

 var activity = Activity.CreateMessageActivity();

 activity.From = new ChannelAccount([FromId], [FromName];
 activity.Recipient = new ChannelAccount([ToId], [ToName]);
 activity.Conversation = new ConversationAccount(false, [ConversationType], [ConversationId]);
 activity.Conversation.Id = [ConversationId];

 activity.Text = "whatever you want to send from the bot...";

 Connector.Conversations.SendToConversationAsync((activity as Activity)).Wait();

角かっこ内のすべてのアイテムは、ユーザーがボットと行っている最初の会話から取得したものですが、FromとToが入れ替わっています(ユーザーがボットにメッセージを送信すると、ユーザーはFROMであり、ボットはTO、およびボットが送信しているときに、それらを切り替えます。

それが役に立てば幸い

3
Hilton Giesenow