You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何授权Python脚本无交互上传文件至SharePoint Online?

解决Python客户端凭据流上传SharePoint Online的权限问题

一、先修正Azure AD应用配置(核心前提)

你遇到的大部分问题都源于应用权限配置错误,按以下步骤检查:

  • 仅使用Azure AD应用注册,放弃SharePoint管理界面的旧应用注册方式,微软已不推荐后者。
  • 在Azure AD应用的「API权限」中,添加应用权限(而非委派权限):选择Microsoft Graph的Sites.FullControl.All,或SharePoint的Sites.FullControl。
  • 必须点击「授予管理员同意」,确保权限生效(租户管理员操作)。

二、针对性解决错误

「Unsupported app only token」错误

这个错误的本质是权限类型不对或API端点不匹配:

  • 确认你添加的是应用权限,而非委派权限(委派权限需要用户交互,不符合无脚本需求)。
  • 调用API时,token的受众(aud)要和端点对应:
    • 用Microsoft Graph API时,aud必须是https://graph.microsoft.com,端点格式如https://graph.microsoft.com/v1.0/sites/{site-id}/drive/items/{folder-id}:/{filename}:/content
    • 用SharePoint REST API时,aud必须是https://{tenant}.sharepoint.com,端点格式如https://{tenant}.sharepoint.com/sites/{site-name}/_api/web/GetFolderByServerRelativeUrl('{folder-path}')/Files/add(url='{filename}', overwrite=true)

「ID3035: The request was not valid or is malformed」错误

直接弃用SharePoint管理界面的应用注册,改用Azure AD应用注册即可彻底避免这个问题,这是微软官方推荐的现代认证方式。

三、Office365-Rest-Python-Client的正确无交互上传实现

你之前用这个库出现401,大概率是配置参数或权限问题,以下是可直接运行的代码:

先安装依赖:

pip install office365-rest-python-client

上传代码:

from office365.sharepoint.client_context import ClientContext
from office365.runtime.auth.client_credential import ClientCredential

# 替换成你的实际参数
TENANT_NAME = "你的租户名称"
SITE_URL = f"https://{TENANT_NAME}.sharepoint.com/sites/你的站点名称"
CLIENT_ID = "Azure AD应用的客户端ID"
CLIENT_SECRET = "Azure AD应用的客户端密钥"
# 站点内文件夹的服务器相对路径,可从浏览器地址栏提取
FOLDER_RELATIVE_PATH = "/sites/你的站点名称/Shared Documents/目标文件夹"
LOCAL_FILE_PATH = "本地文件的绝对路径,比如C:/files/test.csv"
UPLOADED_FILE_NAME = "上传后的文件名.csv"

# 初始化认证上下文
ctx = ClientContext(SITE_URL).with_credentials(ClientCredential(CLIENT_ID, CLIENT_SECRET))

# 获取目标文件夹对象
target_folder = ctx.web.get_folder_by_server_relative_url(FOLDER_RELATIVE_PATH)

# 读取本地文件并上传
with open(LOCAL_FILE_PATH, "rb") as file_stream:
    upload_file = target_folder.upload_file(UPLOADED_FILE_NAME, file_stream)
    ctx.execute_query()  # 执行上传请求

print(f"文件 {UPLOADED_FILE_NAME} 上传成功")

注意:

  • FOLDER_RELATIVE_PATH必须是服务器相对路径,比如你的文件夹地址是https://xxx.sharepoint.com/sites/TestSite/Shared Documents/DailyUploads,那么相对路径就是/sites/TestSite/Shared Documents/DailyUploads。
  • 确认Azure AD应用已获得对应站点的应用权限,且已授予管理员同意。

四、关于自签名证书的说明

自签名证书是比client secret更安全的认证方式,但并非必须。如果要使用,只需在Azure AD应用注册中上传证书,然后将代码中的ClientCredential替换为ClientCertificateCredential即可。对于无交互脚本场景,妥善保管client secret已经足够满足需求。

内容的提问来源于stack exchange,提问作者Joseph Rhodes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:07:44