如何授权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)
- 用Microsoft Graph API时,aud必须是
「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
相关产品推荐
相关产品推荐

