前回の記事で、VBAからOffice 365 APIを呼び出す手順についてまとめました。
OAuth 2.0 認証 + RESTという一般的な方式で、言語環境を選ばず手軽に外部からOffice 365の情報を取得することができる、とても便利なAPIです。
しかし、Office 365の各サービスのAPIのほとんどは固有のエンドポイントを持っており、複数のサービスにまたがる処理を実行しようとすると、SharePointに行ってOneDriveに行ってOutlookに行って…というように、非常に手間が掛かります。
そこで登場したのが「Office 365 unified API」です。
unified、つまり統一されたエンドポイントが用意されたことで、複数のサービスにまたがる処理であっても、単一のエンドポイント「https://graph.microsoft.com/」にアクセスすればそれでOK!になったわけです。
これはとても便利!
・・・というわけで、早速“VBAから”使ってみることにしました。
VBAからのOffice 365 unified API呼び出し
※ Office 365とAzure ADの紐付けや設定については、ここでは詳しく説明しませんので、「Office 365 APIをVBAから呼び出す(1)」と「Office 365 APIをVBAから呼び出す(2)」をご参照ください。
- Azure ポータルにサインインし、「Active Directory」から「ネイティブ クライアント アプリケーション」を追加します。
- 「他のアプリケーションに対するアクセス許可」から「Office 365 unified API (preview)」を追加します。
- 今回はメール情報を取得するマクロを書く予定なので「デリゲートされたアクセス許可」から「Read and write access to user mail」を選択します。
- 「保存」ボタンをクリックして変更を保存します。アプリケーションの構成画面に表示されている「クライアント ID」と「リダイレクト URI」は後で必要になるので、どこかに控えておきます。
- 下記コードを標準モジュールに貼り付け、「client_id」と「redirect_uri」をそれぞれ自分が取得・設定したものに置きかえます。
- 上記コードを実行しOffice 365のアカウントでサインインすると、APIの呼び出しが行われ、メール情報がイミディエイト ウィンドウに出力されます。
以上で準備作業は完了です。
次は実際にマクロを書いて実行してみます。
Option Explicit Public Sub SampleOutlookAPI() 'サンプル - Office 365 unified API(Messages)呼び出し '※ ScriptControlを使っているため、32ビット環境のみ対応 '※ リダイレクト URIをlocalhostにしている場合は、ローカルサーバー(XAMPP他)の起動が必要な場合があります。 Dim url_auth As String Dim url_token As String Dim url_api As String Dim q As String Dim code As String Dim js As String Dim access_token As String Dim dat As Variant Dim ary As Variant, ary2 As Variant Dim messages As Object Dim message As Object Dim i As Long Dim value, Subject, BodyPreview 'JSONパース用ダミー Const READYSTATE_COMPLETE = 4 '********************************************************************** 'クライアント ID & リダイレクト URI Const client_id As String = "(取得したクライアント ID)" Const redirect_uri As String = "(設定したリダイレクト URI)" '********************************************************************** 'authorization code取得 code = "" '初期化 url_auth = "https://login.microsoftonline.com/common/oauth2/authorize?response_type=code" & _ "&redirect_uri=" & EncodeURL(redirect_uri) & _ "&client_id=" & client_id & _ "&resource=" & EncodeURL("https://graph.microsoft.com/") With CreateObject("InternetExplorer.Application") .Visible = True .Navigate url_auth While .ReadyState <> READYSTATE_COMPLETE Or _ .Busy = True Or _ (StrComp(Left(.LocationURL, Len(redirect_uri)), redirect_uri) <> 0) DoEvents Wend q = .document.parentWindow.Location.Search q = Mid(q, 2) '"?"削除 ary = Split(q, "&") For i = LBound(ary) To UBound(ary) ary2 = Split(ary(i), "=") If LCase(ary2(0)) = "code" Then code = ary2(1) Exit For End If Next .Quit End With If Len(Trim(code)) < 1 Then Exit Sub 'access token取得 js = "": access_token = "" '初期化 url_token = "https://login.microsoftonline.com/common/oauth2/token" dat = "grant_type=authorization_code" & _ "&code=" & code & _ "&client_id=" & client_id & _ "&redirect_uri=" & EncodeURL(redirect_uri) With CreateObject("MSXML2.XMLHTTP") .Open "POST", url_token, False .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" .send dat Select Case .Status Case 200: js = .responseText End Select End With If Len(Trim(js)) < 1 Then Exit Sub js = "(" & js & ")" With CreateObject("ScriptControl") .Language = "JScript" access_token = .CodeObject.eval(js).access_token End With If Len(Trim(access_token)) < 1 Then Exit Sub 'Office 365 unified API呼び出し js = "" '初期化 url_api = "https://graph.microsoft.com/beta/me/messages" With CreateObject("MSXML2.XMLHTTP") .Open "GET", url_api, False .setRequestHeader "Authorization", "Bearer " & access_token .send Select Case .Status Case 200: js = .responseText End Select End With If Len(Trim(js)) < 1 Then Exit Sub js = "(" & js & ")" With CreateObject("ScriptControl") .Language = "JScript" Set messages = .CodeObject.eval(js).value For Each message In messages Debug.Print message.Subject, message.BodyPreview '件名・本文プレビュー列挙 Next End With End Sub Private Function EncodeURL(ByVal Target As String) As String 'URLエンコード With CreateObject("ScriptControl") .Language = "JScript" EncodeURL = .CodeObject.encodeURIComponent(Target) End With End Function
以上の手順でOffice 365 unified APIをVBAから呼び出すことができたわけですが、実は上記コードは「Office 365 APIをVBAから呼び出す(3)」のコードとほぼ同じものになっています。
違うのはリソースのURI(https://graph.microsoft.com/)とRESTサービスのURI(https://graph.microsoft.com/beta/me/messages)だけで、その他の部分は同じコードです。
要はコードの使い回しですが、見方を変えると、これまでのOffice 365 APIを呼び出すコードがほぼそのまま使えるわけです。
2015/05/22 時点では、まだOffice 365 unified APIはプレビュー版ですが、単一のエンドポイントからOffice 365のリソースにアクセスできる、という仕様が変わることはないだろうと思います。
認証フローがシンプルになって、これまで以上にOffice 365関連サービスが開発がしやすくなりましたね!!
関連記事
- Office 365 APIをVBAから呼び出す(1)
- //www.ka-net.org/blog/?p=5585
- Office 365 APIをVBAから呼び出す(2)
- //www.ka-net.org/blog/?p=5595
- Office 365 APIをVBAから呼び出す(3)
- //www.ka-net.org/blog/?p=5607
- Office 365 unified APIをVBAから呼び出す
- //www.ka-net.org/blog/?p=5620
- Office 365 unified APIをJavaScriptだけで呼び出す
- //www.ka-net.org/blog/?p=5664
この記事へのコメントはありません。