Proactive messaging bot in Teams without mentioning the bot beforehand

后端 未结 2 1979
旧时难觅i
旧时难觅i 2020-11-30 15:34

I\'m using the Microsoft bot-framework to create a bot and integrate it into teams. Part of the bot\'s requirements include proactively messaging users once per day. From wh

相关标签:
2条回答
  • 2020-11-30 16:12

    EDIT: The Graph API you've referenced is only necessary if you wish to proactively message a user who is not in a channel/groupChat where the bot is installed. If you need to proactively message only people who are in context where the bot is installed already, the answer from mdrichardson is the easiest possible method.

    We've identified a couple of issues with the Graph API beta endpoint you referenced that should be fixed in the near term. In the meantime workarounds are as follows:

    Calling:

    POST https://graph.microsoft.com/beta/me/teamwork/installedApps/
      {"teamsapp@odata.bind":"https://graph.microsoft.com/beta/appcatalogs/teamsapps/APP-GUID"} 
    
    • Will install an app in the personal scope of a user.
    • Known issue: Currently, if the app contains a bot, then installation will not lead to creation of thread between the bot and the user. However to ensure that any missing chat threads, get created, call:

      GET https://graph.microsoft.com/beta/me/chats?$filter=installedApps/any(x:x/teamsApp/id eq 'APP-GUID')

    Calling:

    GET https://graph.microsoft.com/beta/me/chats?$filter=installedApps/any(x:x/teamsApp/id eq 'APP-GUID')
    
    • Gets the chat between a user and an app containing a bot.
    • Known issue: Calling this API will lead to sending a conversation update event to the bot even though there were no updates to the conversation. Your bot will essentially get two install events and you'll need to make sure you don't send the welcome message twice.

    We'll also be adding more detailed documentation for the proactive messaging flow using these Graph APIs

    0 讨论(0)
  • 2020-11-30 16:19

    The easiest way is to:

    1. Install the bot for the team
    2. Query the Team Roster -- The link in Step 3 has an alternative way to do this towards the bottom
    3. Create a conversation with the user and send a proactive message

    There's a lot of code in those links and it's better to just visit them than to copy/paste it here.

    The end of Step 3 also mentions trustServiceUrl, which you may find handy if you run into permissions/auth issues when trying to send a proactive message.


    Edit for Node:

    Install Necessary Packages

    npm i -S npm install botbuilder-teams@4.0.0-beta1 botframework-connector
    

    Note: The @<version> is important!

    Prepare the Adapter

    In index.js

    const teams = require('botbuilder-teams');
    
    adapter.use(new teams.TeamsMiddleware());
    

    Get the Roster

    // Get Team Roster
    const credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
    const connector = new ConnectorClient(credentials, { baseUri: context.activity.serviceUrl });
    const roster = await connector.conversations.getConversationMembers(context.activity.conversation.id);
    

    Send the Proactive Message

    const { TeamsContext } = require('botbuilder-teams');
    
    // Send Proactive Message
    const teamsCtx = TeamsContext.from(context);
    const parameters = {
        members: [
            roster[0] // Replace with appropriate user
        ],
        channelData: {
            tenant: {
                id: teamsCtx.tenant.id
            }
        }
    };
    const conversationResource = await connector.conversations.createConversation(parameters);
    const message = MessageFactory.text('This is a proactive message');
    await connector.conversations.sendToConversation(conversationResource.id, message);
    

    Trust the ServiceUrl, as Necessary

    Read about it. You'd want this before the message is sent.

    MicrosoftAppCredentials.trustServiceUrl(context.activity.serviceUrl);
    
    0 讨论(0)
提交回复
热议问题