如何从 coinmarketcap 获取谷歌表格上加密货币的当前价格?

Posted

技术标签:

【中文标题】如何从 coinmarketcap 获取谷歌表格上加密货币的当前价格?【英文标题】:How to get the current price of a cryptocurrency on google sheets from coinmarketcap? 【发布时间】:2021-04-08 19:07:36 【问题描述】:

在谷歌表格单元格上,我只想使用以下公式获取当前的加密货币价格:

=ValueCrypto(A1)

我为 coinmarketcap 尝试了这个功能:

function ValueCrypto(crypto) 

  var url = "https://api.coinmarketcap.com/v1/ticker/" + crypto + "/?convert=EUR";
  
  var response = UrlFetchApp.fetch(url);
  
  var data = JSON.parse(response.getContentText());
  
  return data[0].price_eur;

该函数给我错误“我们不再在此处提供此端点”

我还尝试更改端点,并将我的 apy 密钥添加到函数中:

function ValueCrypto(crypto) 

  var url = "pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=" + crypto
  var requestOptions = 
  method: 'GET',
  uri: 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest',
  qs: 
    start: 1,
    limit: 5000,
    convert: 'EUR'
  ,
  headers: 
    'X-CMC_PRO_API_KEY': 'myapikey'
  ,
  json: true,
  gzip: true
;

  var response = UrlFetchApp.fetch(url);
  
  var data = JSON.parse(response.getContentText());

  return data[0].price_eur;

现在的错误是: 异常:http://pro-api.coinmarketcap.com 的请求失败,返回代码 401。截断的服务器响应: “状态”: “时间戳”:“2021-01-02T11:31:39.880Z”, “错误代码”:1002, "error_message": "API 密钥丢失。", ...(使用 muteHttpExceptions 选项检查完整响应)

【问题讨论】:

你想使用pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latesthttps://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest哪个?从你的问题我无法理解你的目标。对此我深表歉意。 【参考方案1】:

您的代码似乎没有使用定义 API 密钥的requestOptions。尝试像这样将其传递给UrlFetchApp

var response = UrlFetchApp.fetch(url, requestOptions);

请参阅UriFetchApp 的文档。

【讨论】:

感谢您的回复,现在错误是 Exception: Request failed for pro-api.coinmarketcap.com returned code 400。截断的服务器响应:"status":"timestamp":"2021-01-02T11: 51:40.775Z","error_code":400,"error_message":"\"symbol\" 的值无效:\"UNDEFINED\"","elapsed":0,"credi... (使用 muteHttpExceptions 选项检查完整回复) 您是否将url 中引用的crypto 设置为有效符号?还是应该将符号作为参数添加到qs: 中? uri 应该设置为什么? 我想通过单元格传递密码:=ValueCrypto(A1) 函数 ValueCrypto(crypto) var url = "pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/…" + crypto; var requestOptions = method: 'GET', uri: 'pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/…', qs: start: 1, limit: 5000, convert: 'EUR' , headers: 'X-CMC_PRO_API_KEY': '' , json :真,gzip:真; var response = UrlFetchApp.fetch(url, requestOptions); var 数据 = JSON.parse(response.getContentText());返回数据[0].price_eur; 设置url='https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest'。同时删除startlimit。将symbol: 'BTC' 添加到qs 选项字典。【参考方案2】:

修改点:

当我看到CoinMarketCap API的Quick Start Guide的官方文档时,作为示例curl命令,我发现了以下示例curl命令。

  curl -H "X-CMC_PRO_API_KEY: b54bcf4d-1bca-4e8e-9a24-22ff2c3d462c" -H "Accept: application/json" -d "start=1&limit=5000&convert=USD" -G https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest

此时需要start=1&limit=5000&convert=USD的数据作为查询参数。

当我看到你的脚本时,似乎使用了symbol, start, limit, convert 的值。在这种情况下,请使用symbol=$crypto&start=1&limit=5000&convert=EUR 之类的值。而且,headers: 'X-CMC_PRO_API_KEY': 'myapikey' 可以在paramsfetch(url, params) 中使用。

网址好像是https://###

当以上几点反映到你的脚本中时,它变成如下。

修改脚本:

在您使用它之前,请使用您的 API 密钥设置'X-CMC_PRO_API_KEY': 'myapikey'

function ValueCrypto(crypto) 
  // This is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
  String.prototype.addQuery = function(obj) 
    return this + Object.keys(obj).reduce(function(p, e, i) 
      return p + (i == 0 ? "?" : "&") +
        (Array.isArray(obj[e]) ? obj[e].reduce(function(str, f, j) 
          return str + e + "=" + encodeURIComponent(f) + (j != obj[e].length - 1 ? "&" : "")
        ,"") : e + "=" + encodeURIComponent(obj[e]));
    ,"");
  

  var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest"; // or var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest";
  var query = 
    symbol: crypto,
    start: 1,
    limit: 5000,
    convert: 'EUR'
  ;
  var endpoint = url.addQuery(query); // <--- https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?symbol=###&start=1&limit=5000&convert=EUR

  var response = UrlFetchApp.fetch(endpoint, headers: 'X-CMC_PRO_API_KEY': 'myapikey', 'Accept': 'application/json');
  return response.getContentText();

在这个修改后的脚本中,使用了最新列表。当您想使用最新报价时,请将网址修改为var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest";

注意:

从官方文档来看,我认为data[0].price_eur可能是undefined。因为data[0].price_eur 用于api.coinmarketcap.com/v1/ticker。所以在这个示例脚本中,我返回了response.getContentText()。当您将=ValueCrypto(A1) 放入单元格时,可以看到返回值。从这个值,你能显示出你想要的样本结果值和输出值吗?至此,我想对其进行修改。

当您的 API 密钥无效时,会发生错误。请注意这一点。

参考资料:

Quick Start Guide Listings Latest Quotes Latest UrlFetchApp.fetch(url, params)

【讨论】:

对不起,但仍然错误:异常:请求失败 pro-api.coinmarketcap.com 返回代码 400。截断的服务器响应:"status":"timestamp":"2021-01-03T19:50:46.417Z ","error_code":400,"error_message":"\"symbol\" is not allowed","elapsed":0,"credit_count":0(使用 muteHttpExceptions 选项检查完整响应) @romoleta 感谢您的回复。我带来的不便表示歉意。从你\"symbol\" is not allowed的报错信息中,发现授权错误被移除了。但是,您的 crypto 的符号:crypto 似乎是无效的。在这种情况下,此修改后的脚本可能与此错误无关。不幸的是,从您的回复中,我无法理解crypto 的价值。我为此道歉。那么你能再次确认你给的crypto的值吗?顺便说一句,我仍然无法理解您要使用“最新列表”或“最新报价”。这个怎么样? 我尝试了“最新列表”和“最新报价”,我希望加密是一个变量,所以例如我可以在谷歌表格 A 列上写符号,并在列上获取当前价格B 通过公式 =ValueCrypto(A1) @romoleta 感谢您的回复。关于I would like that crypto is a variable,我修改后的脚本使用crypto作为变量。所以当=ValueCrypto(A1)被放入一个单元格时,“A1”的值被用作crypto的值。但是从您的回复中,我无法理解单元格“A1”的值?我为此道歉。那么,我能问一下单元格“A1”的值吗?因为您当前的错误消息是\"symbol\" is not allowed。而且,你能提供你当前的脚本来复制你的问题吗?通过这个,我想尝试了解它。 A1 是空的,因为我在 appscript 编辑器上单击运行时出现错误,所以 A1 未满,我认为变量 crypto 需要立即一个临时符号作为值【参考方案3】:

这些对我有用

  function fetchAll() 
  const apiKey = 'xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxx'
  fetchCoin( crypto: "SAFEMOON", fiat: "CAD", firstCell: "B9", apiKey )
  fetchCoin( crypto: "SAFEMOON", fiat: "USD", firstCell: "B8", apiKey )



function fetchCoin( crypto, fiat, firstCell, apiKey ) 
      const ascii = firstCell[0].toLowerCase().charCodeAt(0)
  try 
    var options = 
      headers:  'X-CMC_PRO_API_KEY': apiKey 
    
    var url = `https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=$crypto&convert=$fiat`
    var response = UrlFetchApp.fetch(url, options);
    var res = JSON.parse(response);
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii - 1)$firstCell[1]`).setValue(fiat)
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 0)$firstCell[1]`).setValue(res.data[crypto].quote[fiat].price)
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 1)$firstCell[1]`).setValue(res.data[crypto].quote[fiat].percent_change_1h)
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 2)$firstCell[1]`).setValue(res.data[crypto].quote[fiat].percent_change_24h)
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 3)$firstCell[1]`).setValue(res.data[crypto].quote[fiat].percent_change_7d)
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 4)$firstCell[1]`).setValue(res.data[crypto].quote[fiat].percent_change_30d)
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 5)$firstCell[1]`).setValue(Utilities.formatDate(new Date(res.data[crypto].quote[fiat].last_updated), 'America/New_York', 'MMMM dd, yyyy HH:mm:ss Z'))


    Logger.log( url, ascii,res )
   catch (e) 
        SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii - 1)$firstCell[1]`).setValue("")
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 0)$firstCell[1]`).setValue(`Something is broke... $e.message`)
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 1)$firstCell[1]`).setValue("")
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 2)$firstCell[1]`).setValue("")
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 3)$firstCell[1]`).setValue("")
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 4)$firstCell[1]`).setValue("")
    SpreadsheetApp.getActiveSpreadsheet().getRange(`$String.fromCharCode(ascii + 5)$firstCell[1]`).setValue("")
  

【讨论】:

请解释您的代码是做什么的以及它是如何做到的。

以上是关于如何从 coinmarketcap 获取谷歌表格上加密货币的当前价格?的主要内容,如果未能解决你的问题,请参考以下文章

从 Coinmarketcap.com 抓取

如何从谷歌表格中获取评论

如何从谷歌电子表格中获取 json 数据

谷歌脚本从电子表格中获取 json 数据

如何从 Coinmarketcap 解析历史 BTC 数据?

IONIC v3获取CoinMArketCap API数据