Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

OneDriveにMicrosoft Graph APIでアクセスする

  • OAuth2のトークンを取得する際にtenantを指定する*1のだが、これはOneDriveのURLのhttps://XXXXX-my.sharepoint.com/のところに入るテナント名とは別で、commonorganizationsconsumersを指定するとある。commonを指定しているドキュメント*2を参考にしてみたら以下のAADSTS50194エラーが返ってきたのでorganizationsを指定するよう変更した。

    AADSTS50194: Application 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'(ApplicationName) is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'. Use a tenant-specific endpoint or configure the application to be multi-tenant.

  • APIのパスとファイルのパスと操作のパスをコロンで区切る。たとえば自分自身のOneDriveの/path/to/folderというフォルダ以下で、パスに03を含むファイルやフォルダを検索したい場合は https://graph.microsoft.com/v1.0/me/drive/root:/path/to/folder:/search(q='03') となる。このへんの考えかたがAPIドキュメントの概要のページ*3とかに全然書かれていない。
  • APIのドキュメントにGET /me/drive/items/{item-id}など{item-id}というメタ構文が出てくる場合がある*4。アイテムにIDベースでアドレス指定でアクセスできる*5とドキュメントには記載があるが、APIで取得したJSONの中にあるidをこの{item-id}に入れてもアクセスできなかった。結局パスベースでアクセスすることにした。
  • /FolderA/FolderB/Foobar.jpgというファイルを作りたい場合、特に前準備なしで/FolderA/FolderB/Foobar.jpgというパスでアップロードすればよい。前もって/FolderA/FolderBというフォルダを作る必要はない。ファイルのアップロードが成功したら/FolderA/FolderBというフォルダが勝手に作られる。
  • ファイルをアップロードすることなしに複数階層のフォルダを一気に作りたい場合はPATCHメソッドでリクエストを送ればいいみたい*6。ただ、手元で試したところ単発では成功したがスクリプト中で実行しようとすると失敗した(なぜだろう?)。