Как вызвать Microsoft Graph API с помощью VBA? - PullRequest
3 голосов
/ 09 января 2020

Вопрос

Можно ли вызвать Microsoft Graph API с использованием кода VBA?

Если да, как обрабатывать авторизацию O365? Я видел множество тем, в которых говорилось о создании приложения в Microsoft Azure для получения токена, но я удивлен, что должен сделать это для простого локального использования.

Что я пытался

После обнаружения Microsoft Graph я попробовал этот API в Graph Explorer https://graph.microsoft.com/v1.0/planner/tasks

Мне удалось создать задачу в планировщике!

Следовательно, по моему мнению, этот API можно было вызвать из кода VBA, выполняемого непосредственно в Outlook.

Я создал этот макрос в Outlook:

Sub TaskPlannerCreation()

    Dim PlannerService As New MSXML2.XMLHTTP60
    Dim sData As Variant

    sData = " { ""  ""planId"": ""K9Zv2QHm1U-GSAhd-PTGZfdFeOn"",""bucketId"": ""b6NVNiEIQkGZeBBzn7kWqJvAGvvs"",""title"": ""Outlook task"" } "

    With PlannerService
        .Open "POST", "https://graph.microsoft.com/v1.0/planner/tasks", False
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Accept", "application/json"
        .setRequestHeader "User-Agent", "xx"
        .Send (sData)

У меня ошибка авторизации с

код ошибки 401

ОБНОВЛЕНИЕ 12-03-2020: Найдено решение для получения URL-адреса для анализа токена Graph Api при вызове Graph Explorer (отлично работает для я):

Function GetToken()

    Dim xml As New MSXML2.XMLHTTP60
    Dim doc As MSHTML.HTMLDocument
    Dim urltoken As String

'copy paste the URL you see when calling Microsoft Graph Explorer and add prompt + domain_hint parameters
    urltoken = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_mode=form_post&nonce=graph_explorer&mkt=fr-FR&client_id={clientid}&response_type=token&scope=openid profile User.ReadWrite User.ReadBasic.All Sites.ReadWrite.All Contacts.ReadWrite People.Read Notes.ReadWrite.All Tasks.ReadWrite Mail.ReadWrite Files.ReadWrite.All Calendars.ReadWrite&prompt=none&domain_hint=organizations"

    xml.Open "GET", urltoken, False

    xml.Send

    If xml.readyState = 4 And xml.Status = 200 Then
        Set doc = New MSHTML.HTMLDocument
        doc.Body.innerHTML = xml.responseText

        GetToken = doc.getElementsByName("access_token")(0).Value

        sSuccess = True
    Else
         MsgBox "Error" & vbNewLine & "Ready state: " & xml.readyState & _
         vbNewLine & "HTTP request status: " & xml.Status
         sSuccess = False
    End If

    Set xml = Nothing

End Function

Так что использование VBA для вызова Graph API возможно:)

...