如何通过Python使用共享链接和密码以访客身份上传文件至SharePoint
问题背景
我需要编写Python脚本将文件上传到某组织的SharePoint文件夹,但我不是该SharePoint的管理员,无法在Microsoft Graph中添加应用权限,也不想在脚本里使用邮箱密码登录。目标文件夹有带密码的共享链接,任何人都能通过该链接访问并编辑文件。之前尝试用client_id和client_secret的应用权限认证代码无法通过,想知道如何用共享链接+密码以访客身份完成上传。
之前尝试的代码:
app_principal = { 'client_id': client_id, 'client_secret': secret_id, } context_auth = AuthenticationContext(url=site_url) context_auth.acquire_token_for_app(client_id=app_principal['client_id'], client_secret=app_principal['client_secret']) ctx = ClientContext(site_url, context_auth) web = ctx.web ctx.load(web) ctx.execute_query() print("Web site title: {0}".format(web.properties['Title']))
解决方案
你可以通过office365-rest-python-client库直接利用共享链接和密码完成认证,无需管理员配置应用权限,具体步骤如下:
1. 安装依赖库
pip install office365-rest-python-client
2. 编写上传脚本
核心思路是通过共享链接的密码获取临时访问令牌,再用该令牌创建客户端上下文,最后执行文件上传操作:
from office365.sharepoint.client_context import ClientContext # 配置参数 shared_link_url = "你的带密码的SharePoint文件夹共享链接" shared_link_password = "共享链接的密码" local_file_path = "本地要上传的文件路径" target_folder_subpath = "共享文件夹内的目标子路径(可选,留空则上传到根目录)" # 1. 通过共享链接和密码初始化认证上下文 ctx = ClientContext.with_shared_link(shared_link_url, shared_link_password) # 2. 获取目标文件夹对象 if target_folder_subpath: target_folder = ctx.web.get_folder_by_server_relative_path(target_folder_subpath) else: # 直接使用共享链接指向的根文件夹 target_folder = ctx.web.get_folder_by_server_relative_url(ctx.shared_link.resource_path.segment) # 3. 读取本地文件并上传 with open(local_file_path, 'rb') as file_stream: file_name = local_file_path.split("/")[-1].split("\\")[-1] # 兼容Windows和Linux路径 target_folder.upload_file(file_name, file_stream).execute_query() print("文件上传完成")
关键说明
- 该方式完全依赖共享链接的权限,不需要管理员配置应用、也不需要账号密码登录
- 确保共享链接本身具备编辑权限,仅查看权限的链接无法完成上传操作
- 如果共享链接指向的是单个文件而非文件夹,需要调整代码中目标路径的获取逻辑
内容的提问来源于stack exchange,提问作者Richard R.
相关产品推荐
相关产品推荐

