在现代工作场所中,将 Microsoft SharePoint 与 Python 应用程序集成可以实现自动管理以及以编程方式访问文档、文件夹和其他资源。本教程概述了SharePointClient
类的创建和使用,以通过 Microsoft Graph API 与 SharePoint 进行交互。
本教程将指导您完成在 Azure 中注册应用程序、实现 Python 类以及设置必要的权限。最后,完整的源代码将在GitHub上共享。
在我们开始之前,请确保您拥有:
Python 安装在您的计算机上。
访问 Microsoft SharePoint 网站。
在 Python 中安装了requests
库,可通过 pip ( pip install requests
) 获得。
要通过 Microsoft Graph API 与 SharePoint 交互,您需要在 Azure Active Directory (Azure AD) 中注册您的应用程序。这提供了必要的tenant_id
、 client_id
和client_secret
。
登录 Azure 门户:导航到 Azure 门户并登录。
访问 Azure Active Directory:从侧边栏中选择 Azure Active Directory。
注册新应用程序:转到“应用程序注册”并单击“新注册”。提供名称,选择帐户类型,并根据需要设置重定向 URI。
获取 ID 和机密:注册后,记下提供的客户端 ID 和租户 ID。在“证书和机密”下创建新的客户端机密。
在 Azure AD 中设置正确的权限以允许应用程序读取文件和站点。
API 权限:在应用程序的注册页面上,单击“API 权限”。
添加权限:选择“添加权限”,选择“Microsoft Graph”,然后选择“应用程序权限”。
添加特定权限:查找并添加Files.Read.All
和Sites.Read.All
以启用文件和站点读取功能。
授予管理员同意:要激活权限,请单击“授予 [您的组织] 管理员同意”。
实现SharePointClient
类,其中包括身份验证和与 SharePoint 数据交互的方法。下面是集成到脚本中的类:
导入请求导入osclass SharePointClient:def __init__(self,tenant_id,client_id,client_secret,resource_url):self.tenant_id =tenant_id self.client_id = client_id self.client_secret = client_secret self.resource_url =资源_url self.base_url = f“https://login .microsoftonline.com/{tenant_id}/oauth2/v2.0/token" self.headers = {'Content-Type': 'application/x-www-form-urlencoded'} self.access_token = self.get_access_token() # 在实例化时初始化并存储访问令牌 def get_access_token(self): # Body for访问令牌请求正文 = { 'grant_type': 'client_credentials', 'client_id': self.client_id, 'client_secret': self.client_secret,'范围':self.resource_url + '.default' } response = requests.post(self.base_url, headers=self.headers, data=body) return response.json().get('access_token') # 从响应中提取访问令牌 def get_site_id(self, site_url): #构建 URL 以请求站点 ID full_url = f'https://graph.microsoft.com/v1.0/sites/{site_url}' response = requests.get(full_url, headers={'Authorization': f'Bearer {self.access_token}'}) return response.json().get('id') # 返回站点 ID def get_drive_id(self, site_id): # 检索驱动器 ID 和名称与网站关联drives_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/drives'response = requests.get(drives_url, headers={'授权': f'Bearer {self.access_token}'}) drivers = response.json().get('value', []) return [(drive['id'],drive['name' ]) fordrive in drivers] def get_folder_content(self, site_id,drive_id,folder_path='root'): # 获取文件夹的内容folder_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/drives/{drive_id}/root/children' 响应 = requests.get(folder_url, headers={'授权': f'Bearer {self.access_token}'}) items_data = response.json() rootdir = [] if 'value' in items_data: for item in items_data['value']: rootdir.append((item['id'], item['name'])) 返回 rootdir # 递归函数浏览文件夹 def list_folder_contents(self, site_id,drive_id,folder_id, level=0): # 获取特定文件夹的内容folder_contents_url = f'https://graph.microsoft.com/v1.0/sites/ {site_id}/drives/{drive_id}/items/{folder_id}/children'contents_headers = {'授权':f'承载者{self.access_token}'}contents_response = requests.get(folder_contents_url, headers=contents_headers)folder_contents =contents_response.json() items_list = [] # 存储信息的列表 if 'value' infolder_contents: for item infolder_contents['value' ]: if 'folder' in item: # 添加文件夹到列表 items_list.append({'name': item['name'], 'type': 'Folder', 'mimeType': None}) # 递归调用子文件夹 items_list.extend(self.list_folder_contents(site_id,drive_id, item['id'], level + 1) ) elif 'file' in item: # 将文件添加到其 mimeType 列表 items_list.append({'name': item['name'], 'type': 'File', 'mimeType': item['file']['mimeType']}) 返回 items_list def download_file(self, download_url, local_path, file_name): headers = {'授权': f'Bearer {self.access_token}'} response = requests.get(download_url, headers=headers) if response.status_code == 200: full_path = os.path.join(local_path, file_name) 与 open(full_path, 'wb') 作为文件: file.write(response.content) print(f"下载的文件:{full_path}") else: print(f"下载{file_name}失败:{response.status_code} - {response.reason}") def download_folder_contents(self, site_id,drive_id,folder_id,local_folder_path, level=0): # 递归下载文件夹中的所有内容folder_contents_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/驱动器/{drive_id}/items/{folder_id}/children'contents_headers = {'授权':f'承载者{self.access_token}'}contents_response = requests.get(folder_contents_url, headers=contents_headers)folder_contents =contents_response.json()如果folder_contents中的“值”:对于folder_contents中的项目[“value”]:如果项目中的“文件夹”: new_path = os.path.join(local_folder_path, item['name']) 如果没有os.path.exists(new_path): os.makedirs(new_path) self.download_folder_contents(site_id,drive_id,item['id'],new_path,level + 1) # 递归调用子文件夹 elif 'file' in item: file_name =项目['名称'] file_download_url = f"{resource}/v1.0/sites/{site_id}/drives/{drive_id}/items/{item['id']}/content" self.download_file(file_download_url, local_folder_path, file_name) # 使用示例 tent_id = 'your-tenant-id' client_id = 'your-client-id' client_secret = 'your-client-secret' site_url = "xxxxx.sharepoint.com:/sites/xxxxxx" # 将 xxxxx 替换为您的站点URL 资源 = 'https://graph.microsoft.com/' 客户端 = SharePointClient(tenant_id、client_id、client_secret、资源) site_id = client.get_site_id(site_url) print("Site ID:", site_id)drive_info = client.get_drive_id(site_id) print("Drives available:",drive_info) # 示例:访问第一个驱动器并列出根目录drive_id =drive_info[0 ][0]folder_content = client.get_folder_content(site_id,drive_id) print("根目录内容:",folder_content)
SharePointClient
类提供了一种通过 Python 与 SharePoint 资源交互的简化方法。该解决方案非常适合自动化文档管理任务,提高整个组织的生产力。在 GitHub 上查看完整的源代码。
确保您的凭据安全并遵守管理敏感信息的最佳实践。享受使用 Python 和 SharePoint 实现自动化的乐趣!