【问题标题】:How to call Microsoft Graph API using VBA?如何使用 VBA 调用 Microsoft Graph API?
【发布时间】:2020-04-26 20:14:10
【问题描述】:

问题

是否可以使用 VBA 代码调用 Microsoft Graph API?

如果是,如何处理O365授权?我看到很多话题都说要在 Microsoft Azure 中创建一个应用程序来获取令牌,但我很惊讶我必须这样做才能在本地使用。

我尝试了什么

在发现 Microsoft Graph 之后,我在 Graph Explorer 中尝试了这个 API https://graph.microsoft.com/v1.0/planner/tasks

我能够在 Planner 中创建任务!

因此,在我看来,可以从直接在 Outlook 中执行的 VBA 代码调用此 API。

我在 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

2020 年 3 月 12 日更新: 调用 Graph Explorer 时发现获取 Graph Api 令牌分析 URL 的解决方案(对我来说非常有效):

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 是可能的:)

【问题讨论】:

标签: vba api outlook authorization microsoft-graph-api


【解决方案1】:

所以您显示的代码只是部分正确。这是我发现实际有效的方法。 (这与您提供的内容有关,因为我实际上发现了一个 Json 解析器比 innerHTML 方法更好地处理数据,我还必须使用不同版本的 MSXML,因为您引用的那个对我不起作用。)

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/{tenent id}/oauth2/v2.0/token"

    xml.Open "POST", urltoken, False

    xml.Send("client_id={clientid}&scope=https://graph.microsoft.com/.default&grant_type=client_credentials&client_secret=(cleint secret}")

    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

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2019-02-27
    • 2022-01-19
    相关资源
    最近更新 更多