oAuth 2.0 es un estándar de seguridad que permite acceder sin proporcionar un usuario y contraseña. Para poder autorizarnos en SharePoint y poder posteriormente acceder a las unidades. Previamente nuestro administrador SharePoint deberá registrar una App en Azure con permisos al recurso al que vamos a acceder y proporcionarnos el ID de la App registrada y la clave secreta o secret ID para poder autentificarnos. Con el tenant ID formaremos la URL donde nos autorizaremos:
Usaremos requests para acceder y os para crear la carpeta si no existe y obtener la ruta de descarga. Si ya disponemos de todos los datos, podemos incluirlos en nuestro script de la siguiente forma:
import os
import requests
TENANT_ID = "1234567890"
CLIENT_ID = "1234567890"
CLIENT_SECRET = "MiSecretodeSharePoint"
AUTH_URL = f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token"
data = {
"client_id": CLIENT_ID,
"scope": "https://graph.microsoft.com/.default",
"client_secret": CLIENT_SECRET,
"grant_type": "client_credentials",
}
response = requests.post(AUTH_URL, data=data)
response.raise_for_status()
token = response.json()["access_token"]
...
Si no ha habido ningún error, la variable token contiene el token de acceso que podremos usar posteriormente para lista o descargar archivos dependiendo de los permisos que tengamos.
Para poder hacerlo deberemos primero disponer del ID del drive donde están las carpetas o archivos. Si ya disponemos del drive ID veamos como listar los archivos del drive.
...
token = response.json()["access_token"]
GRAPH_BASE_URL = "https://graph.microsoft.com/v1.0"
DRIVE_ID = "Drive_ID_Mi_Disco"
url = f"{GRAPH_BASE_URL}/drives/{DRIVE_ID}/root/children"
headers = {"Authorization": f"Bearer {token}"}
response = requests.get(url, headers=headers)
response.raise_for_status()
items = response.json()["value"]
for item in items:
tipo = "Carpeta" if "folder" in item else "Archivo"
print(f"- {item['name']} ({tipo}) | ID: {item['id']} | {item['createdDateTime']}")
Para descargar archivos hacemos esto:
...
RUTA_DESCARGA = "./descargas"
url = f"{GRAPH_BASE_URL}/drives/{drive_id}/items/{item_id}/content"
headers = {"Authorization": f"Bearer {token}"}
response = requests.get(url, headers=headers, stream=True)
response.raise_for_status()
os.makedirs(RUTA_DESCARGA, exist_ok=True)
filepath = os.path.join(RUTA_DESCARGA, filename)
with open(filepath, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Archivo descargado: {filepath}")
Espero que os sea de utilidad.
