OneNote API集成踩坑记录
背景 在Snip2Note项目中,我们需要将处理后的笔记内容同步到OneNote,以便在多设备间访问。这需要通过Microsoft Graph API进行OAuth认证,并调用OneNote API创建笔记页面。本文记录了在集成过程中遇到的一些问题及解决方案。 环境准备 1. Azure应用注册 首先需要在Azure门户中注册应用程序,获取必要的凭证: 应用名称:Snip2note_1 支持的账户类型:个人Microsoft账户 重定向URI:http://localhost:8088 所需API权限:Notes.ReadWrite.All 2. 环境变量配置 创建.env.onenote文件,包含以下配置: ONENOTE_CLIENT_ID= ONENOTE_CLIENT_SECRET= ONENOTE_TENANT_ID= # 代理设置 HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890 问题1:客户端ID错误 现象 运行测试脚本时,出现以下错误: AADSTS700016: Application with identifier '9c5b91f7-53bf-4359-9f85-5cfdff6b2e5a # 填入 Application (client) ID' was not found in the directory 'Default Directory'. 原因分析 错误信息中的客户端ID与Azure门户中注册的不一致,且包含了注释文本。经排查发现,项目根目录存在一个默认的.env文件,其中包含了示例ID: ONENOTE_CLIENT_ID=9c5b91f7-53bf-4359-9f85-5cfdff6b2e5a # 填入 Application (client) ID Python的dotenv库会先加载根目录的.env文件,然后才加载.env.onenote文件,导致正确的ID被覆盖。 解决方案 两种解决方法: 修改代码加载环境变量的方式: # 加载环境变量 - 只加载指定的.env.onenote文件,忽略默认.env文件 dotenv_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), '.env.onenote') load_dotenv(dotenv_path=dotenv_path, override=True) 更新默认的.env文件:将正确的配置从.env.onenote复制到.env文件中。 问题2:认证端点错误 现象 修复客户端ID后,出现新的错误: AADSTS90023: Application %s(Snip2note_1) is configured for use by Microsoft Account users only. Please use the %2fconsumer endpoint to serve this request. 原因分析 我们的应用被配置为仅支持Microsoft个人账户(Personal Microsoft account users),但代码中使用了组织账户的认证端点。 ...