如何主动向团队频道发送消息

Posted

技术标签:

【中文标题】如何主动向团队频道发送消息【英文标题】:How to proactively send a message to a teams channel 【发布时间】:2021-04-18 09:52:59 【问题描述】:

我似乎不知道如何使用 Python 机器人(机器人框架)主动向 MS 团队频道发送消息。

    用户安装了我的第三方 MS 团队机器人,并将其添加到他们的团队频道之一。 我的 Bot 需要从不相关的后端系统发送临时消息作为事件的一部分。

botframework 不允许你随意发送消息通道,它需要一个对话参考。您可以通过多种方式获取对话参考,例如某人向机器人发送消息,或获取频道列表并从中构造conversationId

阅读文档

The documentation 会让你相信实际上可以随意发送消息,使用以下步骤:

    获取用户 ID 或团队/频道 ID(如果需要)。 创建对话或对话线程(如果需要)。 获取对话 ID。 发送消息。

对于第 1 步,如果没有任何事件表明我的机器人已添加到频道,我如何/何时获取频道 ID?

对于第 2 步,如果我不知道有哪些团队频道,如何创建对话?

结论

有人知道如何使用 Python 应用程序/机器人向 MS Teams 频道发送消息吗? 它不应该需要用户交互。应用/机器人被添加到 Teams 频道,它应该立即在该频道内发布消息

【问题讨论】:

【参考方案1】:

我正在为 GitHub 上的 pnp Teams 示例存储库制作一个示例,我希望在接下来的几天内提交该示例。我还没有开始编写文档,但是代码功能齐全,具有 C# 和 Node.js 版本的后端,它发送一个非常简单的主动消息示例(显示您需要的最基本的东西) - 希望它可以使用,即使它不在 Python 中 - 请参阅 https://github.com/HiltonGiesenow/teams-dev-samples/tree/add-proactive-messaging-sample/samples/bot-proactive-messaging/src

【讨论】:

感谢您抽出宝贵时间回信。从 NodeJS 代码来看,它实际上并没有发送主动消息。它们基于一个事件,在本例中是一个通过TeamsActivityHandler.onMembersAdded 添加到频道的新成员。 sendProactiveInfoAsync 函数需要conversationReference,因此这意味着某种先前的事件。我的要求是机器人加入 Teams 频道并且能够向频道发送消息,而不管任何人加入频道,或之前任何人向机器人发送消息。我开始认为这是不可能的。 听起来你可能对主动消息和欢迎消息有点混淆......看看docs.microsoft.com/en-us/azure/bot-service/…和docs.microsoft.com/en-us/microsoftteams/platform/bots/how-to/… sendProactiveInfoAsync 不会发送“主动”消息,但您稍后需要某些字段才能这样做。所以它正在发送一条 WELCOME 消息,但该消息包含稍后发送主动消息所需的字段。这就是我将函数命名为 sendProactive**Info**Async 的原因 希望这有助于澄清? 我觉得我跟得很好?从提供的代码中,当(新)用户加入频道时会发出欢迎消息活动。仅从这个事件中,您就可以收集必要的组件以最终发送主动消息。但是,我的要求是将新安装的机器人添加到 Teams 频道 - 我们不会从该事件中获得任何活动。在没有新成员加入频道的情况下,sendProactiveInfoAsync 永远不会被调用,因此您将无法发送主动消息。请澄清这种情况:)【参考方案2】:

原来问题是我的on_teams_members_added() 没有被调用,因为我一直在 Teams 中删除应用程序而不是卸载。

确保:

    点击团队名称旁边的 ... 溢出菜单 选择管理团队 选择“应用”标签 点击垃圾桶图标从该团队中删除该应用 然后尝试再次安装应用程序

使用此代码,您可以在 Bot 进入频道时发送频道消息:

async def on_teams_members_added(  # pylint: disable=unused-argument
    self,
    teams_members_added: [TeamsChannelAccount],
    team_info: TeamInfo,
    turn_context: TurnContext,
):
    for member in teams_members_added:
        if member.id == turn_context.activity.recipient.id and team_info is not None:
            # bot entered a Teams channel
            await turn_context.send_activity("Hello channel! I have just been added.")

您的处理程序需要继承自 TeamsActivityHandler

【讨论】:

您是否通过这种方式获得频道中所有成员的列表?如何从该用户 ID 创建对话? @JoaquínL.Robles 要获得对话成员,您可以致电roster = await turn_context.adapter.get_conversation_memberts(turn_context),这将返回List[ChannelAccount] 感谢@sf033,但这不会返回整个团队成员列表(请参阅***.com/q/68638360/264028) @JoaquínL.Robles 我的代码是如何工作的:1)on_teams_members_added 事件 2)activity.conversation.conversation_type == "channel": 3)member_added.id != turn_context.activity.recipient.id(所以机器人已经进入频道)4)我打电话给get_conversation_members() 5 ) 获取ChannelAccount 的列表,将它们添加到数据库中(如果它们还不存在)。 6) 对于每个(新)用户,我都会打电话给connector_client.conversations.create_conversation(params),这样我就会得到一个对话参考,我可以用它来主动向用户发送消息。我将此引用保存在数据库中。 @JoaquínL.Robles 注意事项;虽然我确实完成了这一切,但我最终放弃了创建 Microsoft Teams 应用程序,因为使用他们的 SDK 是一种非常痛苦的体验——他们的整个“轮回”概念很糟糕,文档也很糟糕。它就像所有其他 Microsoft 产品一样;如果可以的话最好避免使用一些 FOSS 替代品。

以上是关于如何主动向团队频道发送消息的主要内容,如果未能解决你的问题,请参考以下文章

如何向特定提及的频道发送消息?

如何在 discord.js 中同时向不同频道发送消息?

根据参数向特定频道发送消息

如何使用 discord.js 向频道发送消息,但只有某些用户可以看到?

如何使用JS和Chrome控制台向频道发送Discord消息?

如何让机器人在不使用命令的情况下向特定频道中的特定公会发送消息