SharePoint REST APIを使用することで、リストに添付されたファイルの情報を取得することができます。
本記事では、SharePoint REST APIをPythonで呼び出し、リストに添付されたファイルを取得する方法について解説します。
事前準備
SharePoint REST APIを使用するためには、Microsoft Entra IDにてアプリの登録を行う必要があります。
また、Azure Key Vaultにて証明書を発行してアプリに登録する必要があります。
Microsoft Entra ID アプリ登録
Entra ID にアプリを登録していきます。Azure Portalから「Microsoft Entra ID」にアクセスし、「アプリの登録」から「新規登録」をクリックします。

任意のアプリ名を入力して、他の欄はデフォルトのまま「登録」をクリックします。

「APIのアクセス許可」に移動して、「Sites.Read.All」を「アプリケーションの許可」でアクセス許可を追加します。APIはMicrosoft GraphではなくSharePointを選択してください。

「{テナント名}に管理者の同意を与えます」をクリックしてアクセス許可を有効化します。

証明書の作成と登録
AzureにてKey Vaultを作成して、「証明書」から「生成/インポート」をクリックして証明書を作成します。

任意の「証明書の名前、件名」を入力します。「コンテンツの種類」はPEMを選択します。

作成した証明書を、「CER形式でダウンロード」でダウンロードします。

Entra IDに戻り、先ほど作成したアプリの「証明書とシークレット」に移動します。「証明書のアップロード」からダウンロードした証明書をアップロードします。

実行環境
実行環境は以下の通りです。適宜準備してください。
- Python 3.10.12
- azure-keyvault-certificates==4.8.0
- azure-keyvault-secrets==4.7.0
- cryptography==41.0.5
- msal==1.28.1
SharePoint REST APIの使用方法
SharePoint REST APIへリクエストを送信するためには、アクセストークンをヘッダーに含める必要があります。
アクセストークンは、Key Vaultに保存した証明書を使用して取得します。
証明書と秘密鍵の取得
Key Vaultから証明書と秘密鍵を取得します。
from cryptography.hazmat.primitives import serialization from azure.identity import DefaultAzureCredential from azure.keyvault.secrets import SecretClient from azure.keyvault.certificates import CertificateClient cert_name = "作成した証明書の名前" vault_url = "https://<your-key-vault-name>.vault.azure.net/" credential = DefaultAzureCredential() # 証明書を取得 with CertificateClient(vault_url=vault_url, credential=credential) as certificate_client: cert = certificate_client.get_certificate(cert_name) # 秘密鍵を取得 with SecretClient(vault_url=vault_url, credential=credential) as secret_client: secret = secret_client.get_secret(cert_name).value # 秘密鍵をdeserialize private_key = serialization.load_pem_private_key(secret.encode(), password=None) thumbprint = cert.properties.x509_thumbprint.hex().upper()
アクセストークンの取得
先ほど取得した証明書と秘密鍵を使用してMSALクライアントを作成し、アクセストークンを取得します。
import msal client_id = "Entra IDのアプリケーションID" authority = "https://login.microsoftonline.com/<your-tenant-id>" scope = ["https://<your-spo-host-name>.sharepoint.com/.default"] # MSALクライアントを作成 app = msal.ConfidentialClientApplication( client_id=client_id, authority=authority, client_credential={"thumbprint": thumbprint, "private_key": private_key}, azure_region=None ) # アクセストークンの取得 result = app.acquire_token_for_client(scopes=scope) access_token = result["access_token"]
SharePoint REST APIへリクエストを送信
requests.getメソッドを使用してリクエストを送信します。以下は例としてサイト情報を取得する場合のREST URLを記載しています。
import requests # サイトの情報を取得するためのREST URL endpoint = "https://<site_url>/_api/site" response = requests.get(endpoint, headers={"Authorization": f"Bearer {access_token}", "Accept": "application/json"})
リストに添付されたファイルの取得方法
添付ファイルの一覧取得
リストに添付されたファイルの一覧を取得する際のREST URLは以下のようになります。
https://<site_url>/_api/web/lists(guid'<list_id>')/items(<item_id>)/AttachmentFiles
リストIDやアイテムIDの取得方法についてはこちらを参考にしてください。
Pythonで実行する場合は以下のようなコードとなります。
site_url = "https://sample.sharepoint.com/sites/test" list_id = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" item_id = 1 endpoint = f"{site_url}/_api/web/lists(guid'{list_id}')/items({item_id})/AttachmentFiles" response = requests.get(endpoint, headers={"Authorization": f"Bearer {access_token}", "Accept": "application/json"})
取得したJSONのvalue配列の中が添付されたファイルの一覧となります。
{ 'odata.metadata': '', 'value': [ { 'odata.type': 'SP.Attachment', 'odata.id': '', 'odata.editLink': '', 'FileName': '', 'FileNameAsPath': {'DecodedUrl': ''}, 'ServerRelativePath': {'DecodedUrl': ''}, 'ServerRelativeUrl': '' } ] }
添付ファイルのダウンロード
添付ファイル一覧から取得したファイル名を使用してファイルをダウンロードします。ダウンロードする場合はAttachmentFiles('<ファイル名>')/$valueをREST URLに追加します。
import io # 添付ファイルの名前 file_name = "sample.pdf" endpoint = f"{site_url}/_api/web/lists(guid'{list_id}')/items({item_id})/AttachmentFiles('{file_name}')/$value" # リクエストを送信 response = requests.get(endpoint, headers={"Authorization": f"Bearer {access_token}", "Accept": "application/json"}) # ローカルに保存 data = io.BytesIO(response.content) with open(file_name, "wb") as f: f.write(data.getbuffer())
おわりに
本記事では、SharePoint REST APIをPythonで呼び出し、リストに添付されたファイルを取得する方法について解説しました。
SharePoint REST APIを使用するためのアクセストークンを、Key Vaultの証明書で取得する記事があまりなかったので、参考になれば幸いです。