Вопрос
Можно ли вызвать 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 возможно:)