You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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)和密码
方法一:使用Microsoft Graph API(适合SharePoint Online/内网M365)

Graph API是微软统一的云服务API,用它访问SharePoint Online更规范,步骤如下:

  1. 先安装依赖库:
pip install msal requests
  1. 代码示例(替换成你的配置信息):
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(适合SharePoint本地服务器/On-Prem)

如果你的内网是传统的SharePoint本地服务器,用原生的REST API更合适,一般用NTLM认证:

  1. 安装依赖库:
pip install requests requests_ntlm
  1. 代码示例(替换配置):
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

火山引擎 最新活动