在現代工作場所中,將 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_secretself.resource_Uurl.resource_L. //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 = { 'grant_type': 'client_credentials', 'client_id': self.client_id, 'client_secret': self. client_secret, 'scope ': 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 與名稱 drivers_url = f'https:// graph.microsoft.com/v1.0/sites/{site_id}/drives' 回應= requests.get(drives_url, headers={'授權': f'Bearer {self.access_token}'}) 磁碟機= response.json( ).get('value', []) return [(drive['id'],drive['name']) fordrives] 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' response = requests.get(folder_url, headers= {'Authorization' : 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 ['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). 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==. = os.path.join(local_path, file_name) with open(full_path, 'wb') as file: 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_w,headers=contents_headers)folder_contents =contents_w,headers )如果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 new_path, level + 1) # 遞迴子資料夾['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("網站ID:", site_id)drive_info =id)drive = 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 實現自動化的樂趣!