SharePoint リストに添付されたファイルをPythonで取得する方法

SharePoint REST APIを使用することで、リストに添付されたファイルの情報を取得することができます。

本記事では、SharePoint REST APIをPythonで呼び出し、リストに添付されたファイルを取得する方法について解説します。

事前準備

SharePoint REST APIを使用するためには、Microsoft Entra IDにてアプリの登録を行う必要があります。

また、Azure Key Vaultにて証明書を発行してアプリに登録する必要があります。

Microsoft Entra ID アプリ登録

  1. Entra ID にアプリを登録していきます。Azure Portalから「Microsoft Entra ID」にアクセスし、「アプリの登録」から「新規登録」をクリックします。

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

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

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

証明書の作成と登録

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

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

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

  4. 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の取得方法についてはこちらを参考にしてください。

blog.jbs.co.jp

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の証明書で取得する記事があまりなかったので、参考になれば幸いです。

執筆担当者プロフィール
髙野 雄哉

髙野 雄哉(日本ビジネスシステムズ株式会社)

Data&AI事業本部に所属。Azure OpenAIをメインに扱っています。主にAI関連の情報を発信していきたいと思っています。

担当記事一覧