OpenClaw 接入Microsoft 365 完整指南
适用版本:OpenClaw + Microsoft365 中国版(世纪互联)/WW版
在企业自动化场景中,打通Microsoft 365(邮件、SharePoint、Teams、日历)是常见需求。本文详细介绍如何通过OpenClaw 接入世纪互联Microsoft 365,实现邮件读取、SharePoint文件管理、Teams 消息监控等能力。
📌 核心能力
📧读取和管理 Outlook 邮件
📁访问 SharePoint 文件和站点
💬 监控 Teams 频道消息
📅 读取日历安排
👤 获取用户目录信息
一、工作原理
1.1 认证机制
OpenClaw 通过Microsoft Graph API 访问Microsoft 365 服务,采用ROPC(Resource Owner Password Credentials)流程进行认证:
|
用户凭证 + Client ID + Client Secret ↓ Azure AD OAuth2 Token ↓ Microsoft Graph API 调用 |
🏷️ 关键端点对比(中国版)
|
组件 |
全球版 |
中国版(世纪互联) |
|
登录地址 |
login.microsoftonline.com |
login.chinacloudapi.cn |
|
Graph 端点 |
graph.microsoft.com |
microsoftgraph.chinacloudapi.cn |
|
Token 路径 |
/common/oauth2/v2.0/token |
/organizations/oauth2/v2.0/token |
1.2 权限体系
Microsoft Graph 采用两层权限模型:
|
委托权限 (Delegated)← 用户登录,权限受用户账号限制 应用权限 (Application)← 无用户参与,权限由 App Role 决定 |
OpenClaw 使用「应用权限」,实现「无人值守」自动化。
二、配置步骤
第一步:注册 Azure 应用
2.1.1 登录 Azure 门户
打开https://portal.azure.cn ,使用管理员账号登录。(WW版使用https://login.microsoftonline.com)
2.1.2 新建应用注册
1. 左侧导航选择Microsoft Entra ID
2. 点击「应用注册」→「新建注册」
填写信息:名称(任意,如ClawAssistant)、账户类型(仅此组织目录)、重定向URI(留空)

2.1.3 记录客户端 ID
注册完成后,在应用概览页复制「应用程序(客户端) ID」,后续配置需要用到。
第二步:创建客户端密码
1. 在应用左侧菜单选择「管理」→「证书和密码」
2. 点击「新建客户端密码」,填写说明(如“ClawApp”),选择过期时间
点击「添加」后,立即复制显示的「密码值」

第三步:配置 API 权限
2.3.1 添加应用权限
1. 在应用左侧菜单选择「API 权限」
2. 点击「添加权限」→「Microsoft Graph」
3. 选择「Application permissions」(不是委托权限!)
4. 添加权限

2.3.2 授予管理员同意
点击「授予管理员同意for 21Vianet」,需要全局管理员权限。
第四步:声明App Role(高级)
如果遇到 403 Missing role 错误,需要在应用Manifest 中声明 App Role:
1. 进入Azure AD → 应用注册 → 找到你的应用
2. 点击「Manifest」
3. 找到appRoles,在数组内添加以下JSON:
|
{ “allowedMemberTypes”: [“Application”], “displayName”: “OpenClaw Teams Channel Admin”, “id”: “00000000-0000-0000-0000-000000000001”, “isEnabled”: true, “origin”: “Application”, “value”: “ChannelMessage.Read.All”, “description”: “Allows the app to read Teams channel messages.” } |
第五步:配置Token 自动刷新
Client Credentials Token 有效期仅1 小时,需要自动刷新。OpenClaw通过以下流程处理:
|
读取加密凭证 (.graph_cred.bin) ↓ 解密获取 Client ID + Secret ↓ 请求新 Token ↓ 保存到 .graph_token.json ↓ API 调用时自动附加 Token |
🔐 凭证文件存储位置
|
文件 |
说明 |
安全性 |
|
.graph_cred.bin |
AES-256 加密凭证 |
仅当前用户可解密 |
|
.graph_key.bin |
密钥文件 |
Windows ACL 保护 |
|
.graph_token.json |
访问令牌 |
临时文件 |
第六步:验证连接
使用以下命令验证配置是否成功:
|
# 检查 Teams 消息 curl -X GET “https://microsoftgraph.chinacloudapi.cn/v1.0/teams/{teamId}/channels/{channelId}/messages” \ -H “Authorization: Bearer {access_token}” # 检查邮件 curl -X GET “https://microsoftgraph.chinacloudapi.cn/v1.0/me/mailFolders/inbox/messages?$top=10” \ -H “Authorization: Bearer {access_token}” |
返回 200 OK 表示连接正常。
三、核心 API 调用示例
3.1 获取访问令牌
|
const https = require(‘https’); const querystring = require(‘querystring’); function getToken() { const data = querystring.stringify({ client_id: ‘你的客户端ID’, client_secret: ‘你的客户端密码‘, scope: ‘https://microsoftgraph.chinacloudapi.cn/.default’, username: ‘admin@xxx.partner.onmschina.cn’, password: ‘你的密码‘, grant_type: ‘password’ }); const options = { hostname: ‘login.chinacloudapi.cn’, port: 443, path: ‘/organizations/oauth2/v2.0/token’, method: ‘POST’, headers: { ‘Content-Type’: ‘application/x-www-form-urlencoded’, ‘Content-Length’: Buffer.byteLength(data) } }; return new Promise((resolve, reject) => { const req = https.request(options, (res) => { let body = ”; res.on(‘data’, c => body += c); res.on(‘end’, () => { const d = JSON.parse(body); if (d.access_token) resolve(d); else reject(new Error(d.error_description)); }); }); req.on(‘error’, reject); req.write(data); req.end(); }); } |
3.2 读取邮件
|
async function getInboxEmails() { const token = JSON.parse(fs.readFileSync(‘.graph_token.json’)).access_token; const options = { hostname: ‘microsoftgraph.chinacloudapi.cn’, port: 443, path: ‘/v1.0/me/mailFolders/inbox/messages?$top=10&$orderby=receivedDateTime desc’, method: ‘GET’, headers: { ‘Authorization’: ‘Bearer ‘ + token } }; // 发送请求并处理响应… } |
3.3 访问SharePoint
|
// 列出所有子站点 async function listSites() { const sites = await graphGet(‘/sites/exocheck.sharepoint.cn/sites’); sites.value.forEach(s => console.log(s.name, s.webUrl)); } // 读取站点文件列表 async function listFiles() { const files = await graphGet( ‘/sites/exocheck.sharepoint.cn:/sites/monitor/drive/root/children’ ); files.value.forEach(f => console.log(f.name, f.lastModifiedDateTime)); } |
四、常见错误排查
|
错误码 |
含义 |
解决方法 |
|
AADSTS65001 |
未授权 Consent |
在 API 权限页面点击「授予管理员同意」 |
|
AADSTS50034 |
用户不存在 |
检查 username 是否正确 |
|
AADSTS7000218 |
缺少 client_secret |
请求中未包含客户端密码参数 |
|
AADSTS7000215 |
客户端密码错误 |
确认复制的是「值」列,不是 Secret ID |
|
AADSTS90002 |
Tenant not found |
确认使用中国版登录地址 |
|
AADSTS9001023 |
grant_type 不支持 |
中国版必须用 /organizations,不能用 /common |
|
403 Missing role |
App Role 未分配 |
在 Manifest 添加 appRole |
五、应用场景
📧 场景一:邮件自动汇总
每天定时抓取收件箱未读邮件,按发件人、主题分类,推送到企业微信或钉钉群。
📁 场景二:SharePoint 文件监控
监控指定 SharePoint 站点的文件上传和变更,第一时间通知相关人员。
💬 场景三:Teams 频道舆情监控
对企业 Teams 频道消息进行实时监控,关键词告警,防止信息泄露。
📅 场景四:会议日程同步
读取日历信息,自动将会议安排同步到第三方协作平台。
👤 场景五:用户目录管理
批量查询员工信息,实现 HR 系统的自动化对接。
六、注意事项
🔐 安全建议
凭证保护:客户端密码仅创建一次,之后无法查看,务必妥善保存
最小权限:只申请业务必需的权限,避免过度授权
定期轮换:定期更新客户端密码,减少泄露风险
环境变量:不要硬编码凭证,使用环境变量或加密文件存储
七、总结
通过 OpenClaw 接入 Microsoft 365,可以轻松实现企业办公自动化的诸多场景。核心要点:
✅ 使用 Microsoft Graph API 统一访问Microsoft 365 服务
✅ 采用 ROPC 认证流程,适合无人值守自动化
✅ 配置 Application 权限,突破用户账号限制
✅ 注意中国版与全球版的端点差异
✅ 重视安全配置,保护凭证和权限
夜雨聆风