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):
我想从类似于以下示例的网站 (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):