En el lugar de trabajo moderno, la integración de Microsoft SharePoint con aplicaciones Python permite la administración automatizada y el acceso a documentos, carpetas y otros recursos mediante programación. Este tutorial describe la creación y el uso de la clase SharePointClient
para interactuar con SharePoint a través de la API de Microsoft Graph.
El tutorial lo guiará a través del registro de aplicaciones en Azure, la implementación de la clase Python y la configuración de los permisos necesarios. Finalmente, el código fuente completo se compartirá en GitHub.
Antes de comenzar, asegúrese de tener:
Python instalado en su máquina.
Acceso a un sitio de Microsoft SharePoint.
Instalé la biblioteca requests
en Python, disponible a través de pip ( pip install requests
).
Para interactuar con SharePoint a través de Microsoft Graph API, debe registrar su aplicación en Azure Active Directory (Azure AD). Esto proporciona los tenant_id
, client_id
y client_secret
necesarios.
Inicie sesión en Azure Portal: navegue hasta Azure Portal e inicie sesión.
Acceda a Azure Active Directory: seleccione Azure Active Directory en la barra lateral.
Registrar una nueva aplicación: Vaya a "Registros de aplicaciones" y haga clic en "Nuevo registro". Proporcione un nombre, elija los tipos de cuenta y establezca un URI de redireccionamiento si es necesario.
Obtenga ID y secretos: después del registro, anote el ID de cliente y el ID de inquilino proporcionados. Cree un nuevo secreto de cliente en "Certificados y secretos".
Establezca los permisos correctos en Azure AD para permitir que su aplicación lea archivos y sitios.
Permisos de API: en la página de registro de su aplicación, haga clic en "Permisos de API".
Agregar permisos: seleccione "Agregar un permiso", elija "Microsoft Graph" y luego "Permisos de aplicación".
Agregue permisos específicos: busque y agregue Files.Read.All
y Sites.Read.All
para habilitar las capacidades de lectura de archivos y sitios.
Otorgar consentimiento de administrador: para activar los permisos, haga clic en "Otorgar consentimiento de administrador para [su organización]".
Implemente la clase SharePointClient
que incluye autenticación y métodos para interactuar con datos de SharePoint. A continuación se muestra la clase integrada en un script:
importar solicitudesimportar osclass SharePointClient: def __init__(self, inquilino_id, cliente_id, cliente_secreto, recurso_url): self.tenant_id = inquilino_id self.client_id = client_id self.client_secret = client_secret self.resource_url = recurso_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() # Inicializa y almacena el token de acceso al crear una instancia def get_access_token(self): # Cuerpo de la solicitud del token de acceso body = { 'grant_type': 'client_credentials', 'client_id': self.client_id, 'client_secret': self.client_secret, 'alcance': self.resource_url + '.default' } respuesta = request.post(self.base_url, headers=self.headers, data=body) return respuesta.json().get('access_token') # Extraer token de acceso de la respuesta def get_site_id(self, site_url): # Cree una URL para solicitar el ID del sitio full_url = f'https://graph.microsoft.com/v1.0/sites/{site_url}' respuesta = request.get(full_url, headers={'Authorization': f'Bearer {self.access_token}'}) return Response.json().get('id') # Devuelve el ID del sitio def get_drive_id(self, site_id): # Recupera los ID y nombres de las unidades asociado con un sitio drives_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/drives' respuesta = request.get(drives_url, headers={'Autorización': f'Bearer {self.access_token}'}) unidades = respuesta.json().get('valor', []) return [(unidad['id'], unidad['nombre' ]) para unidad en unidades] def get_folder_content(self, site_id, drive_id, carpeta_path='root'): # Obtener el contenido de una carpeta carpeta_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/drives/{drive_id}/root/children' respuesta = request.get(folder_url, headers={'Autorización': f'Portador {self.access_token}'}) items_data = respuesta.json() rootdir = [] si 'valor' en items_data: para elemento en items_data['value']: rootdir.append((elemento['id'], elemento['nombre'])) devuelve rootdir # Función recursiva para explorar carpetas def list_folder_contents(self, site_id, drive_id, carpeta_id, nivel=0): # Obtener el contenido de una carpeta específica folder_contents_url = f'https://graph.microsoft.com/v1.0/sites/ {site_id}/drives/{drive_id}/items/{folder_id}/children'content_headers = {'Autorización': f'Bearer {self.access_token}'} contenidos_response = request.get(folder_contents_url, headers=contents_headers) carpeta_contents = contenidos_response.json() items_list = [] # Lista para almacenar información si 'valor' en carpeta_contents: para elemento en carpeta_contents[ 'valor']: si 'carpeta' en el elemento: # Agregar carpeta a la lista items_list.append({'nombre': item['nombre'], 'tipo': 'Carpeta', 'mimeType': Ninguno}) # Llamada recursiva para subcarpetas items_list.extend(self.list_folder_contents(site_id, drive_id, item['id'], nivel + 1) ) elif 'archivo' en elemento: # Agregar archivo a la lista con su tipo mime items_list.append({'nombre': elemento['nombre'], 'tipo': 'Archivo', 'mimeType': elemento['archivo']['mimeType']}) devuelve lista_artículos def download_file(self, download_url, local_path, file_name): encabezados = {'Autorización': f'Bearer {self.access_token}'} respuesta = request.get(download_url, headers=headers) if respuesta.status_code == 200: ruta_completa = os.path.join(local_path, file_name) con open(full_path, 'wb') como archivo: file.write(response.content) print(f"Archivo descargado: {full_path}") else: print(f"Error al descargar {file_name}: {response.status_code} - {response.reason}") def download_folder_contents(self, site_id, drive_id, carpeta_id, local_folder_path, nivel=0): # Descargar recursivamente todos los contenidos de una carpeta carpeta_contents_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/ unidades/{drive_id}/items/{folder_id}/children'content_headers = {'Autorización': f'Bearer {self.access_token}'} content_response = request.get(folder_contents_url, headers=contents_headers) carpeta_contents =content_response.json() si 'valor' en carpeta_contents: para elemento en carpeta_contents['valor']: si 'carpeta' en el elemento: new_path = os.path.join(local_folder_path, item['name']) si no os.path.exists(new_path): os.makedirs(new_path) self.download_folder_contents(site_id, drive_id, item['id'], new_path, nivel + 1) # Llamada recursiva para subcarpetas elif 'file' en el elemento: file_name = elemento['nombre'] 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) # Ejemplo de uso Tenant_id = 'tu-inquilino-id' client_id = 'tu-cliente-id' client_secret = 'tu-cliente-secreto' site_url = "xxxxx.sharepoint.com:/sites/xxxxxx" # Reemplaza xxxxx con tu sitio URL recurso = 'https://graph.microsoft.com/' cliente = SharePointClient(tenant_id, client_id, client_secret, recurso) site_id = client.get_site_id(site_url) print("Site ID:", site_id) drive_info = client.get_drive_id(site_id) print("Unidades disponibles:", drive_info) # Ejemplo: acceda a la primera unidad y enumere el contenido raíz drive_id = drive_info[0 ][0] contenido_carpeta = client.get_folder_content(id_sitio, id_unidad) print("Contenido raíz:", contenido_carpeta)
La clase SharePointClient
proporciona una forma simplificada de interactuar con recursos de SharePoint a través de Python. Esta solución es ideal para automatizar las tareas de gestión de documentos y mejorar la productividad en toda su organización. Consulte el código fuente completo en GitHub.
Mantenga sus credenciales seguras y cumpla con las mejores prácticas para administrar información confidencial. ¡Disfruta de la automatización con Python y SharePoint!