На современном рабочем месте интеграция Microsoft SharePoint с приложениями Python обеспечивает автоматическое управление документами, папками и другими ресурсами и доступ к ним программными средствами. В этом руководстве описывается создание и использование класса SharePointClient
для взаимодействия с SharePoint через API Microsoft Graph.
В этом руководстве вы узнаете, как зарегистрировать приложение в Azure, реализовать класс Python и настроить необходимые разрешения. Наконец, полный исходный код будет опубликован на GitHub.
Прежде чем мы начнем, убедитесь, что у вас есть:
Python установлен на вашем компьютере.
Доступ к сайту Microsoft SharePoint.
Установил библиотеку requests
на Python, доступную через pip ( pip install requests
).
Чтобы взаимодействовать с SharePoint через API Microsoft Graph, вам необходимо зарегистрировать свое приложение в Azure Active Directory (Azure AD). Это обеспечивает необходимые tenant_id
, client_id
и client_secret
.
Войдите на портал Azure. Перейдите на портал Azure и войдите в систему.
Доступ к Azure Active Directory: выберите Azure Active Directory на боковой панели.
Зарегистрируйте новое приложение: перейдите в раздел «Регистрация приложений» и нажмите «Новая регистрация». Укажите имя, выберите типы учетных записей и при необходимости установите URI перенаправления.
Получение идентификаторов и секретов. После регистрации обратите внимание на предоставленные идентификатор клиента и идентификатор арендатора. Создайте новый секрет клиента в разделе «Сертификаты и секреты».
Установите правильные разрешения в 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, resources_url): self.tenant_id = tenant_id self.client_id = client_id self.client_secret = client_secret self.resource_url = resources_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 = { «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-адрес для запроса идентификатора сайта 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') # Возвращаем идентификатор сайта def get_drive_id(self, site_id): # Получаем идентификаторы и имена дисков связанный с сайтом,drives_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/drives' response = Requests.get(drives_url, headers={'Authorization': f'Bearer {self.access_token}'}) диски = response.json().get('value', []) return [(drive['id'], диск['name' ]) для дисков на дисках] def get_folder_content(self, site_id, disk_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 = [] если 'value' в items_data: для элемента в items_data['value']: rootdir.append((item['id'], item['name'])) return rootdir # Рекурсивная функция для просмотра папок def list_folder_contents(self, site_id, disk_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'content_headers = {'Авторизация': f'Bearer {self.access_token}'}contents_response = Requests.get(folder_contents_url, headers=contents_headers)folder_contents =contents_response.json() items_list = [] # Список для хранения информации, если 'value' вfolder_contents: для элемента вfolder_contents[ 'value']: if 'folder' в элементе: # Добавить папку в список items_list.append({'name': item['name'], 'type': 'Folder', 'mimeType': None}) # Рекурсивный вызов подпапок items_list.extend(self.list_folder_contents(site_id, disk_id, item['id'], level + 1) ) elif 'file' в item: # Добавить файл в список с его mimeType items_list.append({'name': item['name'], 'type': 'Файл', 'mimeType': item['file']['mimeType']}) return items_list def download_file(self, download_url, local_path, file_name): headers = {'Authorization': 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, disk_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}/дети'content_headers = {'Авторизация': f'Bearer {self.access_token}'}content_response = Requests.get(folder_contents_url, headers=contents_headers)folder_contents =contents_response.json(), если 'значение' вfolder_contents: для элемента вfolder_contents['value']: если 'folder' в элементе: new_path = os.path.join(local_folder_path, item['name']), если нет os.path.exists(new_path): os.madeirs(new_path) self.download_folder_contents(site_id, disk_id, item['id'], new_path, level + 1) # Рекурсивный вызов подпапок elif 'file' в item: file_name = item['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) # Пример использования tenant_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/' client = SharePointClient(tenant_id, client_id, client_secret, resources) site_id = client.get_site_id(site_url) print("Идентификатор сайта:", site_id) Drive_info = client.get_drive_id(site_id) print("Доступные диски:", Drive_info) # Пример: доступ к первому диску и просмотр корневого содержимого Drive_id = Drive_info[ 0][0]folder_content = client.get_folder_content(site_id, disk_id) print("Корневой контент:",folder_content)
Класс SharePointClient
обеспечивает упрощенный способ взаимодействия с ресурсами SharePoint через Python. Это решение идеально подходит для автоматизации задач управления документами, повышая производительность всей вашей организации. Полный исходный код можно найти на GitHub.
Обеспечьте безопасность своих учетных данных и придерживайтесь лучших практик управления конфиденциальной информацией. Наслаждайтесь автоматизацией с помощью Python и SharePoint!