如何主动向团队频道发送消息
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 向频道发送消息,但只有某些用户可以看到?