如何获取正确serviceUrl?实现Teams Bot通过REST API发单聊消息
解决方案
方案一:直接使用Microsoft Graph API完成消息发送(推荐)
无需依赖Bot Framework的REST API,直接通过Microsoft Graph即可创建Bot与用户的一对一聊天并发送提醒消息,全程无需处理serviceUrl:
- 创建一对一聊天
调用POST /chats接口,请求体指定聊天类型为oneOnOne,并添加目标用户和你的Bot为成员:
{ "chatType": "oneOnOne", "members": [ { "@odata.type": "#microsoft.graph.aadUserConversationMember", "roles": ["owner"], "user@odata.bind": "https://graph.microsoft.com/v1.0/users('{目标用户ID}')" }, { "@odata.type": "#microsoft.graph.botConversationMember", "roles": ["owner"], "bot@odata.bind": "https://graph.microsoft.com/v1.0/bots('{你的Bot ID}')" } ] }
接口返回的chat对象包含唯一id(聊天ID),后续发送消息会用到。
- 发送提醒消息
调用POST /chats/{聊天ID}/messages接口,构造带专属链接的消息内容:
{ "body": { "contentType": "html", "content": "这是您的专属提醒:<a href='{你的专属链接}'>点击查看详情</a>" }, "from": { "application": { "id": "{你的Bot ID}" } } }
- 所需权限
需为Azure应用申请应用权限(而非委托权限),并由租户管理员同意:
Chat.Create:用于创建一对一聊天ChatMessage.Send:用于发送消息
方案二:自动获取serviceUrl用于Bot Framework API调用
若坚持使用Bot Framework的REST API,可通过以下步骤动态获取有效serviceUrl:
获取租户级serviceUrl
调用GET /bots/{你的Bot ID}/installedApps接口,返回的每个teamsAppInstallation对象中包含的serviceUrl,即为该租户对应的Bot服务端点。获取用户聊天专属serviceUrl(更精准)
先通过Graph创建Bot与目标用户的一对一聊天(同方案一第一步),返回的chat对象中的serviceUrl字段,是该聊天对应的专属服务端点,适配性更强。发送消息的Bot Framework API调用
拿到有效serviceUrl后,调用POST {serviceUrl}/v3/conversations/{聊天ID}/activities发送消息,请求体示例:
{ "type": "message", "text": "这是您的专属提醒:{你的专属链接}", "from": { "id": "{你的Bot ID}" }, "recipient": { "id": "{目标用户ID}" } }
注意事项
- 两种方案均使用应用权限,适配后台定时任务的无交互场景;
- 无需Bot持续在线,所有操作通过API后台完成;
- 动态获取serviceUrl可避免硬编码带来的租户适配问题。
内容的提问来源于stack exchange,提问作者brakeley
相关产品推荐
相关产品推荐

