Excel VBA API 调用仅返回特定数据

Excel VBA API call returning specific data only

我想从类似于以下示例的网站 (CoinMarketCap.com) return 数据到 Excel:

...除非我需要将 returned 数据的数量限制为仅特定货币(而不是整个 Ticker)。

该网站需要 API 键(我有)才能进行这些类型的调用,但我不明白如何格式化 url。 该网站提供了以下信息:

使用您的 API 密钥 您可以使用任何可以发出 HTTP 请求以面向 Professional API 的服务器端编程语言。所有请求都应针对域 https://pro-api.coinmarketcap.com.

您可以通过以下两种方式之一在 REST API 调用中提供 API 键:

首选方法:通过名为 X-CMC_PRO_API_KEY

的自定义 header

便捷方法:通过名为CMC_PRO_API_KEY

的查询字符串参数

但我无法从中得出正面或反面。 最终我想要 url return (例如)3 种货币,例如 BTC、ADA、DASH 以及 API 密钥(例如 "abc-xyz".

一旦我有了 url 的结构,我就可以从那里开始工作(在 VBA 中),但是我完全不知道如何格式化 url这样它将 return 只有特定的数据。

Public API

您可能会发现从 public API 开始更容易;那有很好的简单语法。 您将需要使用 JSONConverter 来解析 JSON 响应。下载并添加到您的项目后,您需要转至 VBE > 工具 > 参考并添加对 Microsoft Scripting Runtime 的参考。

接下来将向您展示如何实现一个非常简单的框架 class、clsHTTP,以保存 XMLHTTPRequest 对象并公开一个方法 GetJSON 以检索 JSON 字符串。

然后我给出一些解析 JSON 指定加密货币和美元响应的示例。

这是非常基础的,你会想要开发它,但我知道其中一些 API 的文档可能很难理解。

注意:这是客户端。我认为您所引用的文档可能适用于基于服务器端的 Web 应用程序开发。


Class clsHTTP

Option Explicit
Private http As Object
Private Sub Class_Initialize()
    Set http = CreateObject("MSXML2.XMLHTTP")
End Sub

Public Function GetJSON(ByVal URL As String) As String
    With http
        .Open "GET", URL, False
        .send
        GetJSON = StrConv(.responseBody, vbUnicode)
        'Debug.Print GetJSON
    End With
End Function

标准模块:

Option Explicit
'Public API:  https://coinmarketcap.com/api/
Public Sub GetTickerInfo()
    Const BASE_URL As String = "https://api.coinmarketcap.com/v2/ticker/1/?convert="
    Dim tickers(), i As Long, http As clsHTTP, jsonString As String, json As Object

    tickers = Array("BTC", "ADA", "DASH")
    Set http = New clsHTTP

    For i = LBound(tickers) To UBound(tickers)
        jsonString = http.GetJSON(BASE_URL & tickers(i))
        Set json = JsonConverter.ParseJson(jsonString)("data")("quotes")
        Debug.Print tickers(i) & " : " & json(tickers(i))("price")
        Debug.Print "USD" & " : " & json("USD")("price")
        Set json = Nothing
    Next
End Sub

亲API

①在字符串中指定多重转换:

"starter plan" 只允许我指定一个转换选项(因此无法轻松查看如何捆绑货币)。如果您有升级后的帐户,而不是循环,您可以在我下面的代码中传递以下内容。

jsonString = http.GetJSON("https://pro-api.coinmarketcap.com/v1/global-metrics/quotes/latest?convert=BTC,ADA,DASH")

② 获取所有最新的并解析出需要的符号:

警告:就您的信用而言,这很昂贵。如果可能,您想尝试捆绑通话。初始帐户每天有 200 个积分。

可以解析出JSON,使用JSON转换器,需要的内容如下:

Class clsHTPP:

Option Explicit
Private http As Object
Private Sub Class_Initialize()
    Set http = CreateObject("MSXML2.XMLHTTP")
End Sub

Public Function GetJSON(ByVal URL As String) As String
    With http
        .Open "GET", URL, False
        .setRequestHeader "X-CMC_PRO_API_KEY", "yourAPIkey"
        .setRequestHeader "Accept-Encoding", "gzip"
        .send
        GetJSON = StrConv(.responseBody, vbUnicode)
        'Debug.Print GetJSON
    End With
End Function

标准模块 1:

Option Explicit
Public Sub GetTickerInfo()
    Dim http As clsHTTP, jsonString As String, json As Object, crypto As Object

    Set http = New clsHTTP
    jsonString = http.GetJSON("https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?start=1&limit=5000&convert=USD")
    Set json = JsonConverter.ParseJson(jsonString)("data") 'collection

    For Each crypto In json  'dictionaries within collection
        On Error Resume Next
        Select Case crypto("symbol")
         Case "BTC", "ADA", "DASH"
           EmptyDictionary crypto
        End Select
        On Error GoTo 0
    Next
End Sub
Public Sub EmptyDictionary(ByVal dict As Object)
    Dim key As Variant
    For Each key In dict.keys
        Debug.Print key & " : " & dict(key)
    Next
    Debug.Print vbNewLine
End Sub

将 class 与不同的 API 结合使用:

以下 API 具有我认为您想要的语法类型:

https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=ADA,USD,DASH,BTC

因此您可以使用 class clsHTTP 如下,注意我已经放弃使用 JSON 转换器,使用 Split 来获取您想要的信息反而。如果您愿意,您仍然可以轻松地使用 JSONConverter。

Option Explicit
Private http As Object

Private Sub Class_Initialize()
    Set http = CreateObject("MSXML2.XMLHTTP")
End Sub

Public Function GetJSON(ByVal URL As String) As String
    With http
        .Open "GET", URL, False
        .send
        GetJSON = StrConv(.responseBody, vbUnicode)
    End With
End Function

而标准模块如下:

Option Explicit
Public Sub GetTickerInfo()
    Const BASE_URL As String = "https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms="
    Dim tickers(), http As clsHTTP, jsonString As String, i As Long
    tickers = Array("BTC", "ADA", "DASH", "USD")
    Set http = New clsHTTP
    jsonString = http.GetJSON(BASE_URL & Join$(tickers, ","))

    For i = LBound(tickers) To UBound(tickers)
       Debug.Print tickers(i) & ":" & Replace$(Split(Split(jsonString, Chr$(34) & tickers(i) & Chr$(34) & ":")(1), ",")(0), "}", vbNullString)
    Next
End Sub

立即输出window (Ctrl+G):