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

时间:2018-09-03 15:01:26

标签: excel vba api web-scraping cryptocurrency

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

VBA - API call displayed in Excel

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

对于这些类型的调用,网站需要一个API密钥(我拥有),但是我不知道如何设置url的格式。 该网站提供了以下信息:

使用您的API密钥 您可以使用任何可以发出HTTP请求来定向到Professional 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以使其仅返回特定数据一无所知。

1 个答案:

答案 0 :(得分:1)

公共API

您可能会发现从public API开始更容易;那有很好的简单语法。 您将需要使用JSONConverter来解析JSON响应。下载并添加到项目中后,您需要进入VBE>工具>引用,并添加对Microsoft脚本运行时的引用。

然后,以下内容向您展示如何实现一个非常简单的类clsHTTP来容纳XMLHTTPRequest对象并公开用于检索JSON字符串的方法GetJSON

然后,我给出一些示例,以解析指定的加密货币和USD的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

Pro-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 ):

enter image description here