【完全無料】Microsoft Graph APIを個人アカウントで利用する方法

Microsoft Graph APIは企業利用のイメージが強いですが、無料で作成した個人アカウントでも利用できます。

Microsoft Graph により到達可能なユーザー

ユーザーの同意を得た上で、Microsoft Graph を使用することにより、ユーザーのプロファイル、OneDrive や Outlook のメール、予定表、連絡先などの Office サービス、および Windows のデバイスおよびアクティビティにアクセスすることができます。

更にMicrosoft Graph API自体は無料で利用できます。

Microsoft Graph の従量制課金 API とサービスの概要

ほとんどの Microsoft Graph API は標準 API です。 

・・・

定義済みの使用しきい値内の標準 API へのアクセスは、追加コストなしでユーザー ライセンスの一部として利用できます。

Microsoftの機械翻訳はちょっと何言ってるか分かりませんが、要はAPIコール自体は無料(追加費用なし)で、API経由で操作する側のサービスが有料であれば、お金がかかるよということです。すなわちExcel Online、Word Online、One Driveなどの無料で利用できるマイクロソフト製品は無料でMicrosoft Graph APIも利用できるということです。

Microsoft Graph APIは非常に便利なツールで且つ、無料とくれば使わない手はありません。そこで基本的な使い方をサンプルプログラムを通じて学んでいきたいと思います。サンプルプログラムはPythonを使ってExcel Onlineにデータを追記していく簡単なプログラムです。ステップは

  1. アクセストークンの取得
  2. Excel Online上の特定ファイルのファイルサイズを取得
  3. Excel Online上の特定ファイルにファイルサイズを追記

という流れです。無意味なプログラムですが、実行するたびにデータが変わり動作を理解するには十分だと思います。

Excel Online上の特定ファイルのファイルサイズを取得して追記するプログラム

#!/usr/bin/python
# coding: UTF-8

import requests
import json
import os
 
#tokenファイルを読み込み
tokenfile = "./data/token.txt"

#アクセストークンの読み取り
token = open(tokenfile, "r")
access_token = token.read().strip()
token.close
 
headers = {'Authorization': 'Bearer {}'.format(access_token)}

#Excel file sizeを取得

excelurl = "https://graph.microsoft.com/v1.0/me/drive/root:/GraphAPI/filesize.xlsx"

resultexcelfile = requests.get(excelurl, headers=headers)
excelfilejson = resultexcelfile.json()
excelfilesize = (excelfilejson['size'])
excelfilesizekilo = round(excelfilesize / 1024, 2)

#Microsoft Graph APIを使ってExcel Onlineを更新

# POSTするJSONデータをdict型で作成
dict = {
    "values" : [
        [
            f"{excelfilesizekilo}",
            ]
        ]
    }

#URLをセット
url = "https://graph.microsoft.com/v1.0/me/drive/items/9XXXXXXXXXXXXXXXXXXX0/workbook/tables/{DXXXXXX-AAAA-BBBB-CCCC-CDDDDDDDDDDC}/rows"

result = requests.post(url, headers=headers, json=dict)
jsondata = (result.json())

プログラム解説

#tokenファイルを読み込み
tokenfile = "./data/token.txt"

#アクセストークンの読み取り
token = open(tokenfile, "r")
access_token = token.read().strip()
token.close
 
headers = {'Authorization': 'Bearer {}'.format(access_token)}

まずはEntra IDのアクセストークンを取得します。取得方法はこちらの手順で取得したものをファイルに保存し利用します。読み取ったトークンをベアラー認証として使用します。

#Excel file sizeを取得

excelurl = "https://graph.microsoft.com/v1.0/me/drive/root:/GraphAPI/filesize.xlsx"

resultexcelfile = requests.get(excelurl, headers=headers)
excelfilejson = resultexcelfile.json()
excelfilesize = (excelfilejson['size'])
excelfilesizekilo = round(excelfilesize / 1024, 2)

Excel Onine上のファイル情報を取得するMicrosoft Graph APIエンドポイントは以下です。

GET https://graph.microsoft.com/v1.0/me/drive/root:/Path/To/filesize.xlsx

One Driveのルートディレクトリからファイルまでをフルパスで指定すればよいだけですが、

/drive/root:

という特殊な文字列をファイルパスの途中に入れる必要があります。

エクセルファイルのURLが指定できたらrequests.getを使ってファイル情報のJSONデータを取得し、’size’を指定してファイルサイズを取り出します。

最後に1024で割ってキロバイトにしておきます。

#Microsoft Graph APIを使ってExcel Onlineを更新

# POSTするJSONデータをdict型で作成
dict = {
    "values" : [
        [
            f"{excelfilesizekilo}",
            ]
        ]
    }

取得したファイルサイズをMicrosoft Graph APIを使ってExcel Online上のエクセルファイルに追記します。はじめに書き込むデータのdict型を作成します。この時、書き込むエクセルファイルのテーブルのカラムとデータの数が合っていないと書き込みできないので注意が必要です。

#URLをセット
url = "https://graph.microsoft.com/v1.0/me/drive/items/9XXXXXXXXXXXXXXXXXXX0/workbook/tables/{DXXXXXX-AAAA-BBBB-CCCC-CDDDDDDDDDDC}/rows"
 
result = requests.post(url, headers=headers, json=dict)
jsondata = (result.json())

Excel Onlineを更新するMicrosoft Graph APIエンドポイントは以下です。

POST https://graph.microsoft.com/v1.0/me/drive/items/[file id]/workbook/tables/[table id]/rows
Content-Type: application/json

{
    "values" : [
        [
            DATA1,
            DATA2,
        ]
    ]
}

[file id]、[tablel id]は実際のIDを入力します。

file id、table idはこちらの手順を参考にMicrosoft Graph Explorerを使って取得してください。

最後にrequests.postを使ってデータをPOSTすれば書き込み完了です。

以上。