【问题标题】:Using VBA in Excel to retrieve a Json from an API (problem with the API password)在 Excel 中使用 VBA 从 API 中检索 Json(API 密码问题)
【发布时间】:2018-12-06 14:39:24
【问题描述】:

我在使用提供天然气数据的 API(Alsi,这是文档:https://alsi.gie.eu/GIE_API_documentation_v003.pdf)时遇到问题。它允许我将 URL 放入我的 Internet 浏览器中,这样我就可以看到我需要的 Json 格式的数据。但是,如果我想下载那个 Json,我应该使用他们还给我的带有 cURL 命令的“x-key”,例如文档中给出的这个示例:

"https://agsi.gie.eu/api/data/eu?from=2017-06-01&till=2017-06-14" --header "x-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  

由于我们想要自动化某些流程,因此我们的想法是拥有一个启用宏的 Excel 文档。这将很容易检索此信息,因此可以在 Excel 中使用。感谢 StackOverflow 中的其他未解决问题,我有以下 VBA 代码似乎与 API 交互,但是它返回“拒绝访问”,我最好的猜测是,这是因为密码(或“x-key”)是'没有被正确输入。这就是我所拥有的(除了其他模块中的 JsonConverter 和 Base64Encode):

Sub test()

 Dim httpObject As Object
 Set httpObject = CreateObject("MSXML2.XMLHTTP")

 sUrl = "https://alsi.gie.eu/api/data/eu?from=2018-11-15&till=2018-12-04"
 sAuth = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


 sRequest = sUrl
 httpObject.Open "GET", sRequest, True
 httpObject.setRequestHeader "x-key", Base64Encode(sAuth)
 httpObject.send
 sGetResult = httpObject.responseText

 MsgBox sGetResult

 Dim oJSON As Object
 Set oJSON = JsonConverter.ParseJson(sGetResult)

 For Each sItem In oJSON
  dItemDate = oJSON(sItem)("date")
  sItemString = oJSON(sItem)("string")
  vItemValue = oJSON(sItem)("value")

  MsgBox "Item: " & sItem & " Date: " & dItemDate & " String: " & sItemString & " Value: " & vItemValue
 Next

End Sub

我也尝试将 Base64Encode 应用于密码变量 (sAuth) "消息,这就是我认为密码是问题的原因。在这一点上,我真的不知道如何取得任何进展,这是我通过 VBA 在 Excel 中从这个 API 获取数据最接近的方式(我之前在这里和其他网站/论坛中尝试过更多的代码块)和我觉得我很接近了,只是还没有。

非常感谢。

【问题讨论】:

    标签: json excel vba curl web-scraping


    【解决方案1】:

    您不需要对密钥进行编码。不知道为什么没有确保你在.Open 行中通过False 的尝试对你不起作用。

    我注意到响应是字典的集合。这些字典没有您在脚本中指定的键。

    Option Explicit
    Public Sub GetJSON()
        Dim json As Object   
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", "https://agsi.gie.eu/api/data/eu?from=2017-06-01&till=2017-06-14", False
            .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
            .setRequestHeader "x-key", "APIkey"
            .send
            Set json = JsonConverter.ParseJson(.responseText)
        End With
    End Sub
    

    JSON 示例:

    【讨论】:

    • 感谢您的回复,我想我知道您的意思了,这是我犯的愚蠢错误,我会继续寻找,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2019-02-13
    • 2021-09-30
    相关资源
    最近更新 更多