-2

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

VBA - Excel 中显示的 API 调用

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

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

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

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

首选方法:通过名为 X-CMC_PRO_API_KEY 的自定义标头

便捷方法:通过名为 CMC_PRO_API_KEY 的查询字符串参数

但我不能从中做出正面或反面。最终,我希望 url 返回(例如)3 种货币,例如 BTC、ADA、DASH 以及 API 密钥(例如目的是“abc-xyz”。

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

4

1 回答 1

1

公共 API

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

下面将向您展示如何实现一个非常简单的类,clsHTTP来保存 XMLHTTPRequest 对象并公开一个GetJSON用于检索 JSON 字符串的方法。

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

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

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


班级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

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

“入门计划”仅允许我指定一种转换选项(因此无法轻松查看如何捆绑货币)。如果您有升级的帐户,而不是循环,则可以在下面的代码中传递以下内容。

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

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

警告:就您的信用而言,这是昂贵的。如果可能,您想尝试捆绑呼叫。入门帐户每天有 200 个积分。

您可以使用 JSONConverter 解析出 JSON,您需要的内容如下:

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

使用具有不同 API 的类:

以下 API 具有我认为您所追求的那种语法:

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

因此,您可以按如下方式使用该类clsHTTP,请注意我已放弃使用 JSONConverter,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

即时窗口中的输出(Ctrl+ G):

在此处输入图像描述

于 2018-09-03T15:52:04.773 回答