2025年10月23日木曜日

Microsoft Graph API を Python で使ってみる

Microsoft Graph API を Python で使ってみる

概要

Microsoft365 の API である Microsoft Graph API を Python から利用してみました

環境

  • macOS 15.7.1
  • Python 3.12.11

アプリの作成

  • https://portal.azure.com にログイン
  • 左メニューから「Microsoft Entra ID」を選択
  • 「アプリの登録」->「新規登録」をクリック
    • 名前 -> 何でも OK
    • サポートされているアカウントの種類 -> この組織ディレクトリのみに含まれるアカウント (既定のディレクトリ のみ - シングル テナント)
    • リダイレクト URI -> とりあえず空でOK
  • テナントID、クライアントID をコピーしておく

シークレットの登録

  • 「証明書とシークレット」->「新しいクライアント シークレット」から発行
  • 「値」をコピーしておく

API アクセスの許可

  • アプリ登録ページ左メニューから「API のアクセス許可」を選択
  • 「+ アクセス許可の追加」->「Microsoft Graph」->「アプリケーションの許可」を選択
    • Sites.ReadWrite.All
    • Files.ReadWrite.All
  • アクセス許可の追加」->「管理者の同意を与える」をクリック(管理者権限が必要)

ライブラリインストール

  • pipenv install msal requests

アクセストークンを取得するサンプルコード

とりあえず作成したアプリがアクセスできる認証情報だけ取得してみます

  • vim ./app.py
import pprint

from msal import ConfidentialClientApplication

TENANT_ID = "xxx"
CLIENT_ID = "xxx"
CLIENT_SECRET = "xxx"

app = ConfidentialClientApplication(
    CLIENT_ID,
    authority=f"https://login.microsoftonline.com/{TENANT_ID}",
    client_credential=CLIENT_SECRET,
)

result = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])

pprint.pprint(result)
  • pipenv run python ./app.py

以下のようにトークンが取得できれば OK です

{'access_token': 'xxx',
 'expires_in': 3599,
 'ext_expires_in': 3599,
 'token_source': 'identity_provider',
 'token_type': 'Bearer'}

sharepoint のサイト一覧を取得する

  • vim ./app.py
import requests
from msal import ConfidentialClientApplication

TENANT_ID = "xxx"
CLIENT_ID = "xxx"
CLIENT_SECRET = "xxx"

app = ConfidentialClientApplication(
    CLIENT_ID,
    authority=f"https://login.microsoftonline.com/{TENANT_ID}",
    client_credential=CLIENT_SECRET,
)
token = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
if token is None:
    raise Exception("トークンの取得に失敗しました。")
headers = {"Authorization": f"Bearer {token['access_token']}"}

# サイト一覧を検索(すべて表示)
url = "https://graph.microsoft.com/v1.0/sites?search=*"
response = requests.get(url, headers=headers)
print(response.json())
sites = response.json()

for s in sites.get("value", []):
    print(f"名前: {s['name']}")
    print(f"URL:  {s['webUrl']}")
    print(f"ID:   {s['id']}")
    print("---")

sharepoint は当然ですがライセンスがないと使えないので「Tenant does not have a SPO license.」のエラーになります

最後に

Python から MicrosoftGraphAPIをコールしてみました
無料アカウントでもここまではいけます
次回は実際に Microsoft365 上にあるリソースにアクセスしてみます

参考サイト

0 件のコメント:

コメントを投稿