No local de trabalho moderno, a integração do Microsoft SharePoint com aplicativos Python permite o gerenciamento automatizado e o acesso a documentos, pastas e outros recursos de forma programática. Este tutorial descreve a criação e o uso da classe SharePointClient
para interagir com o SharePoint por meio da API do Microsoft Graph.
O tutorial irá guiá-lo através do registro de aplicativos no Azure, implementando a classe Python e definindo as permissões necessárias. Por fim, o código-fonte completo será compartilhado no GitHub.
Antes de começarmos, certifique-se de ter:
Python instalado em sua máquina.
Acesso a um site do Microsoft SharePoint.
Instalada a biblioteca requests
em Python, disponível via pip ( pip install requests
).
Para interagir com o SharePoint por meio da API do Microsoft Graph, você precisa registrar seu aplicativo no Azure Active Directory (Azure AD). Isso fornece os tenant_id
, client_id
e client_secret
necessários.
Entre no Portal do Azure: Navegue até o Portal do Azure e faça login.
Acesse o Azure Active Directory: selecione Azure Active Directory na barra lateral.
Cadastrar um novo aplicativo: Vá em “Registros de aplicativos” e clique em “Novo cadastro”. Forneça um nome, escolha os tipos de conta e defina um URI de redirecionamento, se necessário.
Obtenha IDs e segredos: após o registro, anote o ID do cliente e o ID do locatário fornecidos. Crie um novo segredo do cliente em "Certificados e segredos".
Defina as permissões corretas no Azure AD para permitir que seu aplicativo leia arquivos e sites.
Permissões de API: Na página de registro do seu aplicativo, clique em “Permissões de API”.
Adicionar permissões: Selecione "Adicionar uma permissão", escolha "Microsoft Graph" e depois "Permissões do aplicativo".
Adicione permissões específicas: Encontre e adicione Files.Read.All
e Sites.Read.All
para ativar recursos de leitura de arquivos e sites.
Conceder consentimento de administrador: para ativar as permissões, clique em "Conceder consentimento de administrador para [sua organização]".
Implemente a classe SharePointClient
que inclui autenticação e métodos para interagir com dados do SharePoint. Abaixo está a classe integrada em um script:
importar solicitaçõesimportar 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 = resource_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 e armazena o token de acesso na instanciação def get_access_token(self): # Corpo para a solicitação do token de acesso body = { 'grant_type': 'client_credentials', 'client_id': self.client_id, 'client_secret': self.client_secret, 'escopo': self.resource_url + '.default' } resposta = requests.post(self.base_url, headers=self.headers, data=body) return response.json().get('access_token') # Extraia o token de acesso da resposta def get_site_id(self, site_url): # Crie URL para solicitar o ID do site full_url = f'https://graph.microsoft.com/v1.0/sites/{site_url}' response = requests.get(full_url, headers={'Autorização': f'Bearer {self.access_token}'}) return response.json().get('id') # Retorna o ID do site def get_drive_id(self, site_id): # Recupera IDs e nomes de unidades associado a um site drives_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/drives' response = requests.get(drives_url, headers={'Autorização': f'Bearer {self.access_token}'}) drives = response.json().get('value', []) return [(drive['id'] , drive['name']) for drive in drives] def get_folder_content(self, site_id, drive_id, folder_path='root'): # Obtenha o conteúdo de uma pasta folder_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/drives/{drive_id}/root/children'response = requests.get(folder_url, headers={'Autorização': f'Bearer {self.access_token}'}) items_data = response.json() rootdir = [] if 'value' em items_data: para item em items_data['value']: rootdir.append((item['id'], item['nome'])) retorna rootdir # Função recursiva para navegar pelas pastas def list_folder_contents(self, site_id, drive_id, folder_id, level=0): # Obtenha o conteúdo de uma pasta específica folder_contents_url = f'https://graph.microsoft.com/v1.0/sites/ {site_id}/drives/{drive_id}/items/{folder_id}/children' content_headers = {'Autorização': f'Bearer {self.access_token}'} content_response = requests.get(folder_contents_url, headers=contents_headers) folder_contents = content_response.json() items_list = [] # Lista para armazenar informações se 'valor' em folder_contents: para item em folder_contents[ 'value']: if 'folder' no item: # Adicionar pasta à lista items_list.append({'name': item['name'], 'type': 'Folder', 'mimeType': None}) # Chamada recursiva para subpastas items_list.extend(self.list_folder_contents(site_id, drive_id, item['id'], level + 1) ) elif 'file' in item: # Adiciona arquivo à lista com seu mimeType items_list.append({'name': item['name'], 'type': 'File', 'mimeType': item['file']['mimeType']}) retorna lista_itens def download_file(self, download_url, local_path, file_name): headers = {'Autorização': f'Bearer {self.access_token}'} resposta = requests.get(download_url, headers=headers) if response.status_code == 200: full_path = os.path.join(local_path, file_name) com open(full_path, 'wb') como arquivo: file.write(response.content) print(f"Arquivo baixado: {full_path}") else: print(f"Falha ao baixar {file_name}: {response.status_code} - {response.reason}") def download_folder_contents(self, site_id, drive_id, folder_id, local_folder_path, level=0): # Baixe recursivamente todo o conteúdo de uma pasta folder_contents_url = f'https://graph.microsoft.com/v1.0/sites/{site_id}/ drives/{drive_id}/items/{folder_id}/children' content_headers = {'Autorização': f'Bearer {self.access_token}'} content_response = requests.get(folder_contents_url, headers=contents_headers) folder_contents = content_response.json() if 'value' em folder_contents: para item em folder_contents['value']: if 'folder' no item: new_path = os.path.join(local_folder_path, item['name']) se não os.path.exists(new_path): os.makedirs(new_path) self.download_folder_contents(site_id, drive_id, item['id'], new_path, level + 1) # Chamada recursiva para subpastas elif 'file' no item: file_name = item['nome'] arquivo_download_url = f"{recurso}/v1.0/sites/{site_id}/drives/{drive_id}/items/{item['id']}/content" self.download_file(file_download_url, local_folder_path, file_name) # Exemplo de uso tenant_id = 'your-tenant-id' client_id = 'your-client-id' client_secret = 'your-client-secret' site_url = "xxxxx.sharepoint.com:/sites/xxxxxx" # Substitua xxxxx pelo seu site Recurso de URL = '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 disponíveis:", drive_info) # Exemplo: Acesse a primeira unidade e liste o conteúdo raiz drive_id = drive_info[0 ][0] pasta_content = client.get_folder_content(site_id, drive_id) print("Conteúdo raiz:", folder_content)
A classe SharePointClient
fornece uma maneira simplificada de interagir com recursos do SharePoint por meio do Python. Esta solução é ideal para automatizar tarefas de gestão documental, aumentando a produtividade em toda a sua organização. Confira o código-fonte completo no GitHub.
Mantenha suas credenciais seguras e siga as práticas recomendadas para gerenciar informações confidenciais. Aproveite a automação com Python e SharePoint!