microsoft-teams

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
Drive Microsoft Teams chats via Microsoft Graph with
curl + jq
. The user's OAuth bearer token is in
$MICROSOFT_TEAMS_TOKEN
; every call needs
Authorization: Bearer $MICROSOFT_TEAMS_TOKEN
. Base URL:
https://graph.microsoft.com/v1.0
.
Failures are
{"error":{"code","message"}}
— show
message
verbatim.
401
= re-install.
403
/
Forbidden
on send = the user granted read-only (
Chat.Read
) → re-connect with
Chat.ReadWrite
+
ChatMessage.Send
.
403 "No authorization information present on the request"
on
/me/chats
= the connected account is a personal Microsoft account.
Teams chat is a work/school (organization) feature — Microsoft Graph does not expose
/me/chats
or grant the
Chat.*
scopes for personal MSA accounts (outlook.com/hotmail/etc). Tell the user plainly: "Microsoft Teams chat needs a work or school account; your connected account is a personal Microsoft account. Reconnect Teams and choose a work/school account." Do not retry — it cannot succeed for that account.
bash
G="https://graph.microsoft.com/v1.0"; AUTH="Authorization: Bearer $MICROSOFT_TEAMS_TOKEN"
通过
curl + jq
借助Microsoft Graph驱动Microsoft Teams聊天。用户的 OAuth承载令牌存储在
$MICROSOFT_TEAMS_TOKEN
中;每次调用都需要
Authorization: Bearer $MICROSOFT_TEAMS_TOKEN
。基础URL:
https://graph.microsoft.com/v1.0
失败返回格式为
{"error":{"code","message"}}
——直接显示
message
内容。
401
错误 表示需要重新安装。发送时出现
403
/
Forbidden
错误,说明用户仅授予了只读权限 (
Chat.Read
) → 需要重新连接并申请
Chat.ReadWrite
+
ChatMessage.Send
权限。
调用
/me/chats
时出现
403 "No authorization information present on the request"
错误,说明关联的账户是
个人Microsoft账户**。Teams聊天是工作/学校(组织)功能——Microsoft Graph不会为个人MSA账户(outlook.com/hotmail等)开放
/me/chats
接口或授予
Chat.*
权限范围。直接告知用户:"Microsoft Teams聊天需要使用工作或学校账户;你当前关联的是个人Microsoft账户。请重新连接Teams并选择工作/学校账户。"不要重试——该账户无法成功调用相关接口。
bash
G="https://graph.microsoft.com/v1.0"; AUTH="Authorization: Bearer $MICROSOFT_TEAMS_TOKEN"

My chats (1:1 + group), most recent first; expand members for names

My chats (1:1 + group), most recent first; expand members for names

curl -sS -H "$AUTH" "$G/me/chats?$top=20&$expand=members"
| jq '.value[] | {id, chatType, topic, members: [.members[].displayName]}'
undefined
curl -sS -H "$AUTH" "$G/me/chats?$top=20&$expand=members"
| jq '.value[] | {id, chatType, topic, members: [.members[].displayName]}'
undefined

Read & send chat messages

读取和发送聊天消息

bash
CHAT="CHAT_ID"
bash
CHAT="CHAT_ID"

Recent messages

Recent messages

curl -sS -H "$AUTH" "$G/chats/$CHAT/messages?$top=20"
| jq '.value[] | {from: .from.user.displayName, created: .createdDateTime, text: .body.content}'
curl -sS -H "$AUTH" "$G/chats/$CHAT/messages?$top=20"
| jq '.value[] | {from: .from.user.displayName, created: .createdDateTime, text: .body.content}'

Send a message (confirm content with the user first). contentType html|text.

Send a message (confirm content with the user first). contentType html|text.

curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json"
-d '{"body":{"contentType":"html","content":"Hi from the assistant 👋"}}'
"$G/chats/$CHAT/messages" | jq '{id, created: .createdDateTime}'
undefined
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json"
-d '{"body":{"contentType":"html","content":"Hi from the assistant 👋"}}'
"$G/chats/$CHAT/messages" | jq '{id, created: .createdDateTime}'
undefined

Gotchas

注意事项

  • Chats only. Reading Teams channel messages needs
    ChannelMessage.Read.All
    — a Microsoft "protected API" requiring tenant-admin consent — which this connector deliberately does not request. Don't try
    /teams/{id}/channels/.../messages
    ; it will 403.
  • body.content
    for HTML messages contains markup — strip tags when summarizing.
  • OData
    $top
    /
    $expand
    need the
    $
    escaped in the shell; quote the URL.
  • 仅支持聊天。读取Teams频道消息需要
    ChannelMessage.Read.All
    权限——这是Microsoft的“受保护API”,需要租户管理员同意——本连接器特意未申请该权限。不要尝试调用
    /teams/{id}/channels/.../messages
    接口;会返回403错误。
  • HTML消息的
    body.content
    包含标记——在总结时需要去除标签。
  • 在shell中,OData的
    $top
    /
    $expand
    需要对
    $
    进行转义;请给URL加上引号。