我想通过类似于以下示例的网站(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以使其仅返回特定数据一无所知。
答案 0 :(得分:1)
您可能会发现从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
①在字符串中指定多次转换:
“入门计划”仅允许我指定一个转换选项(因此无法轻松查看如何捆绑货币)。如果您拥有升级的帐户,则可以通过以下代码传递以下信息,而不是循环发送。
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具有我认为您要使用的语法:
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 ):