#api #google-apps-script #coinmarketcap
#API #google-apps-script #coinmarketcap
Вопрос:
Скрипт, который я использую уже несколько месяцев, внезапно перестал работать, потому что я получаю a 403
при попытке получить доступ к Coinmarketcap API из Google Apps Script. В моем API-ключе нет ничего плохого, потому что я попробовал тот же запрос в скрипте Python со своего локального компьютера, и это работает.
Это мой скрипт Google Apps:
function coin_price() {
const myGoogleSheetName =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tokens')
// Call CoinMarketCap and let them know who you are.
const coinMarketCapAPICall = {
method: 'GET',
uri: 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest',
qs: {
start: '1',
limit: '5000',
convert: 'USD',
},
headers: { 'X-CMC_PRO_API_KEY': '##########' },
json: true,
gzip: true,
muteHttpExceptions: true
}
// Put the coin symbols that you want to follow here.
const myCoinSymbols = ['BTC', 'ETH']
// Let's itereate
for (let i = 0; i < myCoinSymbols.length; i ) {
const coinSymbol = myCoinSymbols[i]
console.log(coinSymbol)
const coinMarketCapUrl = `https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=${coinSymbol}`
const result = UrlFetchApp.fetch(coinMarketCapUrl, coinMarketCapAPICall)
const txt = result.getContentText()
console.warn(txt)
const d = JSON.parse(txt)
const row = i 2
// Puts a column of at symbols into the sheet at A2.
myGoogleSheetName.getRange(row, 1).setValue(coinSymbol)
// Puts a column of current market price's in dollars into the sheet at B3.
myGoogleSheetName
.getRange(row, 2)
.setValue(d.data[coinSymbol].quote.USD.price)
}
}
Это ошибка, которую я получаю:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
Request blocked.
We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
<BR clear="all">
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: ##########
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
Блокирует ли Coinmarketcap IP-адреса Google?
Комментарии:
1. К сожалению, в UrlFetchApp скрипта Google Apps отсутствуют свойства
uri
,qs
,json
иgzip
. Так связано ли это с вашей текущей проблемой? Ссылка Я беспокоюсь об этом.2. Этот точный код раньше работал, но я попробую без этих свойств.
3. Скрипт снова работает. Таким образом, это должно быть временная блокировка API Coinmarketcap. Все еще не совсем уверен, почему это произошло, поэтому я оставлю вопрос открытым.
Ответ №1:
Это обычная проблема с UrlFetchApp, потому что все запросы поступают из одного и того же пула IP-адресов.
Иногда вы можете обойти это, используя экспоненциальный откат и биномиальную теорию вероятностей (например, попробуйте несколько раз, пока это не сработает)
Мне удалось заставить это работать с Binance API таким образом (полное репозиторий github здесь), но идея как таковая:
function exponentialBackoff(url, params) {
for (let count = 0; count < 50; count ) { // choose your amount
try {
Utilities.sleep((count * count) (Math.random() * 1000))
const response = UrlFetchApp.fetch(`${endpoint}${query}`, params)
}
catch(e) {
console.info(e)
continue
}
if (response.getResponseCode() === 200) {
return response
}
}
}