如何在Azure Bot Framework消息扩展查询中获取用户邮箱
解决方案
警告说明
你收到的source is not a known attribute of class <class 'botbuilder.schema.teams._models_py3.TeamsChannelData'> and will be ignored属于非致命警告,不会影响功能正常运行:该警告是因为Teams平台推送的活动数据包中包含SDK预定义模型没有收录的source字段,仅做提示作用。如果不想看到该警告,只需调整日志级别,过滤掉botbuilder.schema模块的WARNING级别的日志即可。
代码问题排查
你误以为_show_members方法未被调用,实际是该方法没有设置返回值,所以print(await self._show_members(turn_context))只会打印None,产生方法未触发的错觉。
正确获取用户邮箱的实现
通过TeamsInfo.get_member获取到的成员对象本身就包含email属性,直接读取即可,修正后的代码如下:
class SearchBasedMessagingExtension(TeamsActivityHandler): async def _get_user_email(self, turn_context: TurnContext ): # 根据用户ID拉取成员信息 member = await TeamsInfo.get_member(turn_context, turn_context.activity.from_property.id) return member.email async def on_teams_messaging_extension_query(self, turn_context: TurnContext, query: MessagingExtensionQuery): search_query = str(query.parameters[0].value).strip() if search_query == "": await turn_context.send_activity(MessageFactory.text("You cannot enter a blank string for the search")) return # 获取并打印用户邮箱 user_email = await self._get_user_email(turn_context) print(f"用户邮箱:{user_email}") print(turn_context.activity.from_property.id) # 后续你的搜索业务逻辑
其他可选获取邮箱的方式
如果需要获取更完整的用户属性,可以为机器人配置SSO权限,调用Microsoft Graph接口拉取用户资料,但仅需获取邮箱的场景下,上述TeamsInfo.get_member方案是最简实现,无需额外申请接口权限。
内容的提问来源于stack exchange,提问作者disn
相关产品推荐
相关产品推荐

