如何使用Python通过API获取内网SharePoint目录的文件列表?
嘿,这个需求我之前帮同事折腾过,用Python调用SharePoint API拉取内网目录的文件列表其实没那么复杂,核心就是搞定认证和API调用这两步,我给你拆解下具体操作:
准备工作
首先得凑齐几个关键信息:
- 你的内网SharePoint站点完整URL(比如
https://your-intranet-sp.com/sites/TeamSite) - 目标目录的相对路径(可以从你现有的目录URL里提取,比如目录URL是
https://your-intranet-sp.com/sites/TeamSite/Shared%20Documents/ProjectFiles,那相对路径就是/Shared Documents/ProjectFiles) - 认证凭据:
- 若是内网SharePoint Online(Microsoft 365部署):需要Azure AD应用的客户端ID、客户端密钥、租户ID
- 若是SharePoint本地服务器(On-Premises,比如2016/2019):你的域账号(格式
DOMAIN\\username)和密码
Graph API是微软统一的云服务API,用它访问SharePoint Online更规范,步骤如下:
- 先安装依赖库:
pip install msal requests
- 代码示例(替换成你的配置信息):
import msal import requests # 替换成你的实际配置 CLIENT_ID = "你的Azure AD应用客户端ID" CLIENT_SECRET = "你的Azure AD应用客户端密钥" TENANT_ID = "你的M365租户ID" SHAREPOINT_SITE_URL = "https://your-intranet-sp.com/sites/TeamSite" FOLDER_PATH = "/Shared Documents/ProjectFiles" # 目标目录的相对路径 # 第一步:获取访问令牌 authority = f"https://login.microsoftonline.com/{TENANT_ID}" # 初始化客户端应用 app = msal.ConfidentialClientApplication( CLIENT_ID, authority=authority, client_credential=CLIENT_SECRET ) # 请求Graph API的权限范围 scopes = ["https://graph.microsoft.com/.default"] # 获取令牌 token_result = app.acquire_token_for_client(scopes=scopes) if "access_token" not in token_result: print(f"令牌获取失败:{token_result.get('error_description')}") exit() access_token = token_result["access_token"] # 第二步:调用Graph API获取文件列表 headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } # 构造Graph API的请求URL:格式为站点标识符 + 目录路径 site_identifier = f"{SHAREPOINT_SITE_URL.split('//')[1]}:/sites/{SHAREPOINT_SITE_URL.split('/sites/')[1]}" api_url = f"https://graph.microsoft.com/v1.0/sites/{site_identifier}/drive/root:{FOLDER_PATH}:children" # 发送请求 response = requests.get(api_url, headers=headers) # 若请求失败直接抛出异常 response.raise_for_status() # 解析返回的文件数据 files = response.json().get("value", []) # 输出文件信息 print(f"【目录 {FOLDER_PATH} 下的文件列表】") for file in files: print(f"- 文件名:{file['name']} | 大小:{file['size']} bytes | 最后修改:{file['lastModifiedDateTime']}")
注意点:
- 你需要在Azure门户里注册一个应用,给它分配
Sites.Read.All的应用权限,并且让管理员授予同意,否则会有权限错误 - 如果目录路径里有特殊字符(比如空格、中文),requests库会自动处理URL编码,不用手动转义
如果你的内网是传统的SharePoint本地服务器,用原生的REST API更合适,一般用NTLM认证:
- 安装依赖库:
pip install requests requests_ntlm
- 代码示例(替换配置):
import requests from requests_ntlm import HttpNtlmAuth # 替换成你的实际配置 SHAREPOINT_SITE_URL = "http://your-intranet-sp/sites/TeamSite" # 目标目录的服务器相对路径(可以从SharePoint目录属性里复制) FOLDER_RELATIVE_URL = "/sites/TeamSite/Shared Documents/ProjectFiles" USERNAME = "DOMAIN\\your-username" # 域账号格式 PASSWORD = "your-password" # 构造REST API请求URL api_url = f"{SHAREPOINT_SITE_URL}/_api/web/GetFolderByServerRelativeUrl('{FOLDER_RELATIVE_URL}')/Files" # 设置请求头,指定返回JSON格式 headers = { "Accept": "application/json;odata=verbose" } # 发送请求,使用NTLM认证 response = requests.get( api_url, auth=HttpNtlmAuth(USERNAME, PASSWORD), headers=headers ) response.raise_for_status() # 解析返回的文件数据 files = response.json().get("d", {}).get("results", []) # 输出文件信息 print(f"【目录 {FOLDER_RELATIVE_URL} 下的文件列表】") for file in files: print(f"- 文件名:{file['Name']} | 文件路径:{file['ServerRelativeUrl']} | 大小:{file['Length']} bytes | 最后修改:{file['TimeLastModified']}")
注意点:
- 确认
FOLDER_RELATIVE_URL是正确的服务器相对路径,你可以在SharePoint里打开目录的“属性”查看 - 确保你的域账号有该目录的读取权限,否则会返回403错误
通用小技巧
- 如果不确定API的返回结构,可以先用Postman等工具测试请求,确认返回的数据格式后再写Python代码
- 遇到权限错误时,先检查账号/应用的权限配置,或者直接用浏览器打开目录URL,确认自己能正常访问
内容的提问来源于stack exchange,提问作者balakishore nadella




