乐于分享
好东西不私藏

OpenClaw 接入Microsoft 365 完整指南

OpenClaw 接入Microsoft 365 完整指南

适用版本:OpenClaw + Microsoft365 中国版(世纪互联)/WW

在企业自动化场景中,打通Microsoft 365(邮件、SharePointTeams、日历)是常见需求。本文详细介绍如何通过OpenClaw 接入世纪互联Microsoft 365,实现邮件读取、SharePoint文件管理、Teams 消息监控等能力。

📌 核心能力

📧读取和管理 Outlook 邮件

📁访问 SharePoint 文件和站点

💬 监控 Teams 频道消息

📅 读取日历安排

👤 获取用户目录信息

一、工作原理

1.1 认证机制

OpenClaw 通过Microsoft Graph API 访问Microsoft 365 服务,采用ROPCResource 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 有效期仅小时,需要自动刷新。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 权限,突破用户账号限制

✅ 注意中国版与全球版的端点差异

✅ 重视安全配置,保护凭证和权限