OneDrive上のファイルの変更内容を自動でHPに反映させる【Microsoft Graph API】【Python】

こんにちは、長塚電話工業所の佐藤です。

「会社の公開情報をHP(WordPress)にアップロードしたいけど、定期的な更新作業を毎度管理者に依頼するのは面倒…何とかならないか?」

という社内からのリクエストを受けたので試験的に対応してみました。

同じようなお悩みを持つ方がもし居られましたら、参考にしていただければと思います。

後述しますが、必要な環境や事前情報もそれなりに多いです…。何卒ご了承ください。

実現したいこと

  • OneDrive上のExcelで作成されている弊社製品の接続適合表を、WordPressで作成されているHP上に公開したい
  • 公開する情報は、OneDrive上で管理したい(HP上でメンテナンスをしたくない)

必要な情報・権限

今回のソリューションでは、様々な事前情報が必要になります。

  • Microsoft 365アカウント(管理者)
  • Microsoft Azure上で作成されたAPI情報
    • アプリケーションID
    • テナントID
    • クライアントシークレット
  • WordPressのユーザーIDおよびPW
  • WordPressのアプリケーションパスワード(後述)
  • Pythonの実行環境

それでは、早速準備に取り掛かりましょう。

1.Pythonのセットアップ

こちらを参考に、Pythonのセットアップを行います。

2.API情報の取得

Microsoft Azureへサインインし、左側のタブから「アプリの登録」を選択します。

続いて、「証明書とシークレット」タブにて、「新しいクライアントシークレット」を選択します。

任意の説明を記述し、追加ボタンをクリックします。

正常に追加されたら、「値」という箇所の文字列をメモします。後ほど作成するPythonプログラムで必要になります。

続いて、「APIのアクセス許可」タブにて「アクセス許可の追加」をクリックします。

「Microsoft Graph」→「アプリケーションの許可」から、Files.ReadWrite.Allと、Sites.ReadWrite.Allにチェックを入れます。

3.Pythonスクリプトの作成

ここまで出来たら、肝心のPythonスクリプトを作成します。

内容としては以下の通りです。

  • OAuth2.0のアクセストークンを取得し、トークンURLを構成
  • ヘッダーなどを構成し、指定したExcelをダウンロード
  • データのpandas整形およびレイアウト調整
  • WordPressの指定した投稿へポスト(リポスト)

以下よりダウンロードいただき、拡張子を.pyに変更してご活用下さい。また、importに関するエラーは各自ご解決をお願いします。

https://49.gigafile.nu/1125-d034ef9dc979f662b26da27d90e6e6842

コード内でExcelデータを加工していますが、こちらについては環境や内容に合わせ、各自ご調整いただければと思います。

補足1:ファイルIDの取得

ソースコード内で、指定のファイルをファイルIDとして記述する箇所があります。

このファイルIDはどうやって取得するんだという話なのですが、別途ソースコードを作成しましたので以下をご確認ください。


user_id = “test@test.onmicrosoft.com”
file_list_url = f’https://graph.microsoft.com/v1.0/users/{user_id}/drive/root/children’
file_list_response = requests.get(file_list_url, headers=headers) #headersの値についてはgigaファイル便の内容と同様です。

if file_list_response.status_code == 200:
#各ファイルのIDと名前を表示
for file in file_list_response.json().get(‘value’, []):
print(f”ID: {file[‘id’]}, Name: {file[‘name’]}”)
else:
#エラーの場合、応答を表示
print(f”Error: {file_list_response.status_code}”)
print(file_list_response.text)


特定のユーザーのOneDriveのルートディレクトリにあるファイルのリストを取得するためのスクリプトです。

OneDrive上のフォルダおよびファイルには全てidが付与されています。それが階層構造になっていますので、

まずは、指定したファイルが格納されている場所まで追っていく必要があります。

上記のスクリプトを利用することで、ルートディレクトリのフォルダーidを確認します。


user_id = “test@test.onmicrosoft.com”
parent_folder_id = “ここに親フォルダのidを入力。”
file_list_url = f’https://graph.microsoft.com/v1.0/users/{user_id}/drive/items/{parent_folder_id}/children’
file_list_response = requests.get(file_list_url, headers=headers)

if file_list_response.status_code == 200:
# 各ファイルのIDと名前を表示
for file in file_list_response.json().get(‘value’, []):
print(f”ID: {file[‘id’]}, Name: {file[‘name’]}”)
else:
# エラーの場合、応答を表示
print(f”Error: {file_list_response.status_code}”)
print(file_list_response.text)


parent_folder_idが分かったら、こちらのプログラムで順に掘り下げていきます。

フォルダーAのidをプログラムに入力して実行することで、その配下のフォルダーBおよびファイル群のidが分かります。

更に下の階層のidを調べるには、フォルダーBのidをプログラムに入力して、、、といった具合です。

もっと効率の良い調査方法があると思いますが….私の技術力不足が露呈していますね。悪しからず。

補足2:WordPressのアプリケーションパスワードを発行

ソースコード内に記述する、WPのアプリケーションパスワードについての補足です。こちらはWP側のAPIを利用して投稿を行うロジックを組んでいる以上、どうしても必要になる値なのですが、

ユーザー管理画面から新規追加することができます。

実行結果を確認

全ての情報を用意してプログラムを実行してみます。

するとこのように、OneDrive上で変更・入力した内容がHP上に反映されます。

さいごに

今回のシステム構築はどうしても管理者級のMicrosoftアカウントが必要になるため、敷居が高くなってしまっているのが課題です。

また試験的な対応ということもあり、ソースコード内にキーをベタ打ちする箇所も多数あります。

自社サーバーでの利用に限定する、環境変数(.env)を使う形に書き換えるなど、扱いには十分に注意するようにしてください。

長くなってしまいましたが、ここまでお読みいただきありがとうございました。