从SharePoint获取Excel文件的Python问题

0 投票
1 回答
41 浏览
提问于 2025-04-14 17:52

我在用下面的Python代码从SharePoint获取文件时遇到了错误。错误信息是:在从XML响应中获取令牌时发生错误:AADSTS53003:访问被条件访问策略阻止。访问策略不允许发放令牌。有人能帮我解决这个问题吗?这是我的代码:

import os
import shutil
from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext
sharepoint_url = "Sharepoint_site_url"
site_url = "site url"
username = "My_username"
password = "Password"
# File path components
library_name = "Shared Documents"
folder_name = "ABCD"
# Construct the full file path
file_path = f"https://xyz.sharepoint.com/sites/site_name/{library_name}/{folder_name}/"
# Encode the file path
encoded_file_path = file_path.replace(" ", "%20")  # Replace spaces with %20
print(encoded_file_path)
# Authenticate with SharePoint
ctx_auth = AuthenticationContext(sharepoint_url)
if ctx_auth.acquire_token_for_user(username, password):
    # Connect to SharePoint site
    ctx = ClientContext(site_url, ctx_auth)
    web = ctx.web
    ctx.load(web)
 
    # Get all files in the SharePoint folder
    files = ctx.web.get_folder_by_server_relative_path(file_path).files
    ctx.load(files)
    ctx.execute_query()
    # Create a folder on the C drive
    c_drive_folder1 = "C:/ENTERP/Raw"
    c_drive_folder2 = "C:/ENTERPR/Processed"
    os.makedirs(c_drive_folder1, exist_ok=True)
    os.makedirs(c_drive_folder2, exist_ok=True)
    # Download and save each file to the C drive folder
for file in files:
        print(1)
        file_name = file.properties["Name"]
        file_url = f"{site_url}/{library_name}/{folder_name}/{file_name}"
        file_content = ctx.web.get_file_by_server_relative_path(file_url).read().execute_query()
        # Save the file to the C drive folder
        file_path_on_c_drive = os.path.join(c_drive_folder1, file_name)
        with open(file_path_on_c_drive, "wb") as local_file:
            local_file.write(file_content)
        print(f"Downloaded and saved: {file_name} to {file_path_on_c_drive}")
        print("Download process completed.")
else:
        print("Failed to authenticate with SharePoint.")

如果有其他解决方案的建议,我也非常感谢。

1 个回答

0

AAD(Azure Active Directory)不再支持用用户名和密码来获取令牌,因为现在更推荐使用基于应用的认证。你需要在Azure里创建一个“仅应用”的应用注册,并且要给它访问SPO API的权限(也就是SharePoint > Sites.Selected)。然后,这个应用还需要在网站上有“读取”权限(参考链接)。接下来,你需要按照这个链接的方法进行认证。

另外,如果你对自己的环境有完全的控制权,你也可以给应用注册访问所有网站的权限(SharePoint > Sites.FullControl.All)。

撰写回答