hulp met exec()

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Pabz
  • Registratie: Juni 2008
  • Laatst online: 10-09 00:23
Beste allemaal,

Ik hoop dat dit het juiste topic is.

Ik probeer met behulp van wat code om prijzen uit dexscreener.com te krijgen. Nu heb ik op reddit wat gevonden maar dat werkt soms wel en soms niet.

Nu heb ik in de API documentatie van dexscreener gevonden dat je de token informatie kan benaderen via hun api webadres gecombineerd met een contract. Dat ziet er dan als volgt uit:

https://api.dexscreener.i...31056cc905987b77b1044d259

De tekst die je dan krijgt is volgens mij in JSON en ik wil de priceUsd data hebben.

De originele code zag er zo uit (credits aan https://www.reddit.com/user/RemcoE33/:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
* Returns DexScreener USD Price
*
* @param {array} urls - Insert the DexScreener url or range.
* @param {boolean} baseTokenSymbol - true or false to return the base token symbol
* @param {array} values - {"priceUsd", "volumeUsd", "blockTimestamp", "type"}
* @param {boolean} headers - true or false
* @return {array} Price.
* @customfunction
*/
function DEX(urls, baseTokenSymbol = false, values = [], headers) {
  if (!Array.isArray(urls)) {
    urls = [urls]
  };

  if (!Array.isArray(values)) {
    values = [values]
  };

  values = values.flat();

  const alterdUrls = urls.flat().filter(url => url != "").map(url => {
    const hash = /\.com\/(.*?)$/g.exec(url)[1];
    const dataUrl = `https://io4.dexscreener.io/u/trading-history/recent/${hash}`;
    return dataUrl;
  })

  const responses = UrlFetchApp.fetchAll(alterdUrls);
  const output = [];
  const keys = [];

  responses.forEach((res, i) => {
    const data = JSON.parse(res.getContentText());
    const tradingHistory = data.tradingHistory[0];
    const tempOutput = [];

    if (baseTokenSymbol) {
      if (i == 0) {
        keys.push("tokenSymbol")
      }
      tempOutput.push(data.baseTokenSymbol);
    };

    if (values.length == 0) {
      if (i == 0) {
        keys.push(...Object.keys(tradingHistory))
      }
      Object.values(tradingHistory).forEach(value => {
        if (Number.isNaN(Number(value))) {
          tempOutput.push(value)
        } else {
          tempOutput.push(Number(value))
        }
      })
          } else {
      Object.keys(tradingHistory).forEach(key => {
        if (values.includes(key)) {
          if (i == 1) {
            keys.push(key)
          }
          if (Number.isNaN(Number(tradingHistory[key]))) {
            tempOutput.push(tradingHistory[key])
          } else {
            tempOutput.push(Number(tradingHistory[key]))
          }
        }
      });
    }

    output.push(tempOutput);

  })


  if (headers) {
    output.unshift(keys);
    return output;
  }
  return output;
}


Echter die had de volgende URL formaat nodig: https://dexscreener.com/b...31056cc905987b77b1044d259

Ik heb het volgende geprobeerd aan te passen:

code:
1
2
3
4
const alterdUrls = urls.flat().filter(url => url != "").map(url => {
    const hash = /\.com\/(.*?)$/g.exec(url)[1];
    const dataUrl = `https://api.dexscreener.io/latest/dex/tokens/${hash}`;
    return dataUrl;


alleen dat werkt niet, ik denk omdat de const hash nu niet klopt met de exec(). Wat moet ik precies aanpassen zodat de
code:
1
const hash
het contractnummer filtert uit https://dexscreener.com/b...31056cc905987b77b1044d259?

Of mis ik nog meer en kan ik met de rest van de code ook niet de "priceUsd" uit dat API webadres filteren?

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hogarts
  • Registratie: Maart 2022
  • Laatst online: 23-04-2022
Wat krijg je voor foutmeldingen terug?

Want als je hash foutief zou zijn dan zou je nooit respons krijgen, maar je zegt zo af en toe wel respons te krijgen. Oftewel ik verwacht eerder dart de server je iets probeert te zeggen.

Acties:
  • 0 Henk 'm!

  • Pabz
  • Registratie: Juni 2008
  • Laatst online: 10-09 00:23
Hogarts schreef op vrijdag 15 april 2022 @ 00:00:
Wat krijg je voor foutmeldingen terug?

Want als je hash foutief zou zijn dan zou je nooit respons krijgen, maar je zegt zo af en toe wel respons te krijgen. Oftewel ik verwacht eerder dart de server je iets probeert te zeggen.
Als ik de oude code gebruik krijg ik het volgende terug:
Exception: Request failed for https://io4.dexscreener.io returned code 500. Truncated server response: Internal Server Error (use muteHttpExceptions option to examine full response) (line 28).

Voor de ene coin doet ie dat wel en voor de andere coin leest hij het gewoon wel uit.

Daarom was ik in de API documentatie gaan neuzen. Daar kwam ik tegen dat je via https://api.dexscreener.io/latest/dex/tokens/:tokenAddress ook token gegevens kunt uitlezen. Het lukt me nu dus alleen niet om het met die link aan de praat te krijgen. Waarschijnlijk omdat ik in de huidige exec() iets verkeerd doe.

Wat ik dus eigenlijk graag wil is:

code:
1
2
3
4
const alterdUrls = urls.flat().filter(url => url != "").map(url => {
    const hash = DIT IS HET CONTRACT adres
    const dataUrl = `https://api.dexscreener.io/latest/dex/tokens/${hash}`;
    return dataUrl;


Alle contract adressen heb ik in een kolom staan, dus hoe kan ik de cont hash laten verwijzen naar de waarde in een cell op dezelfde rij? Dat zou het ook oplossen.