Délimiteurs JS

Le problème exposé dans ce sujet a été résolu.

Bonjour !

J’essaie de prendre le contenu d’une balise script sur la page https://www.funcraft.net/fr/joueurs?q=pseudo, jusque là aucun soucis, c’est relativement simple, il suffit de faire :

router.get('/api/funcraft/rush/:username', async (req, res) => {
  let usernameParameter = req.params.username

  let dom = await JSDOM.fromURL(`https://www.funcraft.net/fr/joueurs?q=${usernameParameter}`)
  console.log(dom.window.document.querySelectorAll('script'))
  function getPage(user) {
    return JSDOM.fromURL(`https://www.funcraft.net/fr/joueurs?q=${user}`)
  }

  async function getUser(user) {
    const dom = await getPage(user)

    let funcraftPgames = dom.window.document.body.querySelectorAll('script')[6].textContent
    res.send(funcraftPgames)
  }

  getUser(usernameParameter)

})

Du coup j’obtiens https://hasteb.in/epomohic.swift

Cependant, j’aimerais juste prendre le contenu des variables, pas le nom (donc pgames, pstats et pstatsTotal

Le truc c’est que je ne sais pas comment faire pour délimiter, en gros faire en sorte que ça commence après var pgames = et que ça termine à la fin de cette variable, et ce pour toutes les variables Si je fais pas ça, je ne pourrai pas JSON.parse car il sera invalide.

Je pourrai très bien faire comme ça : https://github.com/Nevgup/funcraft-api/blob/master/api/routes/index.js Mais le problème c’est que c’est au caractère près, et du coup si une valeur est plus grande chez le joueur A que le joueur B, alors le JSON sera pas valide dans les deux cas

J’espère avoir été clair :v

Merci d’avance :)

Tu peux scoper ton code :

pgames = (function() {
  // JSDOM.fromURL(`https://www.funcraft.net/fr/joueurs?q=${user}`)

  return pgames;
})();

A-312

Non car du coup pgames est undefined là C’est pas mon site, c’est celui de https://funcraft.fr

nevgupobo

Je pense que l’idée de @A-312, c’est d’executer le code avec JSDOM.
C’est ce que j’aurais fais je pense. Même si niveau sécurité, c’est pas fou.

@TAlone: Pas super claire ta regex. Ça ne gère pas les variables justement il me semble.

Tu peux également chercher à transformer ce code en JSON valide. var => {, \s = => "\s": et tu rajoutes une accolade fermante à la fin }.

+0 -0

S’il a besoin juste de récupérer les variables statiques, plutôt que d’exécuter du code unsafe, faire tourner une Regex qui va récupérer le contenu est bien plus sûr.

+0 -0

Tu peux scoper ton code :

pgames = (function() {
  // JSDOM.fromURL(`https://www.funcraft.net/fr/joueurs?q=${user}`)

  return pgames;
})();

A-312

Non car du coup pgames est undefined là C’est pas mon site, c’est celui de https://funcraft.fr

nevgupobo

Je pense que l’idée de @A-312, c’est d’executer le code avec JSDOM.
C’est ce que j’aurais fais je pense. Même si niveau sécurité, c’est pas fou.

@TAlone: Pas super claire ta regex. Ça ne gère pas les variables justement il me semble.

Tu peux également chercher à transformer ce code en JSON valide. var => {, \s = => "\s": et tu rajoutes une accolade fermante à la fin }.

ache

J’ai pas trop compris comment vous voulez que je fasse

S’il a besoin juste de récupérer les variables statiques, plutôt que d’exécuter du code unsafe, faire tourner une Regex qui va récupérer le contenu est bien plus sûr.

TAlone J’ai juste besoin de récupérer ces trois variables

J’ai pas trop compris comment vous voulez que je fasse

nevgupobo

Que ne comprends tu pas ?

Si tu utilises JSDOM, c’est pour exécuter le script non ?

JSDOM

+0 -0

Je pensais à si tu peux faire confiance au site/résultat et selon le risque acceptable.

var machin = JSDOM.fromURL(`https://www.funcraft.net/fr/joueurs?q=${user}`);
res.send(`
pgames = (function() {
  ${machin}

  return pgames;
})();
`);

Sinon pour du code unsafe, je ferais :

let str = $('textarea').val();

str = str.replace(/(var |,)([A-z]*)= (\{|\[)/g, '$1"$2": $3')

str = str.replace(/^var /, '')

str = JSON.stringify(JSON.parse(`{${str}}`), null, 2)

$('textarea').val(str)

Exemple ici : https://jsfiddle.net/13nzoL58/

Je pensais à si tu peux faire confiance au site/résultat et selon le risque acceptable.

var machin = JSDOM.fromURL(`https://www.funcraft.net/fr/joueurs?q=${user}`);
res.send(`
pgames = (function() {
  ${machin}

  return pgames;
})();
`);

Sinon pour du code unsafe, je ferais :

let str = $('textarea').val();

str = str.replace(/(var |,)([A-z]*)= (\{|\[)/g, '$1"$2": $3')

str = str.replace(/^var /, '')

str = JSON.stringify(JSON.parse(`{${str}}`), null, 2)

$('textarea').val(str)

Exemple ici : https://jsfiddle.net/13nzoL58/

A-312

Je comprends pas le ${machin} et j’aimerais ne pas devoir utiliser jquery :v

C’est ton retour que tu obtiens avec ta fonction. Je ne peux pas te répondre précisément, je ne sais pas le retour que tu souhaites avoir

et j’aimerais ne pas devoir utiliser jquery :v

Tant mieux, ce qui t’intéresse c’est :

str = str.replace(/(var |,)([A-z]*)= (\{|\[)/g, '$1"$2": $3')

str = str.replace(/^var /, '')

str = JSON.stringify(JSON.parse(`{${str}}`), null, 2)

C’est ton retour que tu obtiens avec ta fonction. Je ne peux pas te répondre précisément, je ne sais pas le retour que tu souhaites avoir

et j’aimerais ne pas devoir utiliser jquery :v

Tant mieux, ce qui t’intéresse c’est :

str = str.replace(/(var |,)([A-z]*)= (\{|\[)/g, '$1"$2": $3')

str = str.replace(/^var /, '')

str = JSON.stringify(JSON.parse(`{${str}}`), null, 2)

A-312
  funcraftPGames = dom.window.document.body.querySelectorAll('script')[6].textContent
  funcraftPGames = funcraftPGames.replace(/(var |,)([A-z]*)= (\{|\[)/g, '$1"$2": $3')
  funcraftPGames = funcraftPGames.replace(/^var /, '')

J’obtiens ça donc c’est plutôt bon mais je comprends pas pourquoi le : (position 8) pose pb :/ https://hasteb.in/opegunut.swift

+0 -0

Tu as oublié : `{${str}}`

En gros au lieu d’avoir : {"a":1} tu as "a":1

A-312

yes en effet, par contre c’est normal que j’arrive pas à me get les objets alors que c’est du JSON valide ?

Edit: Autant pour moi, j’avais fait

    let funcraftAPI;

    funcraftAPI = dom.window.document.body.querySelectorAll('script')[6].textContent
    funcraftAPI = funcraftAPI.replace(/(var |,)([A-z]*)= (\{|\[)/g, '$1"$2": $3')
    funcraftAPI = funcraftAPI.replace(/^var /, '')
    funcraftAPI = JSON.stringify(JSON.parse(`{${funcraftAPI}}`), null, 2)

    res.send(JSON.parse(funcraftAPI.games))

au lieu de :

    let funcraftAPI;

    funcraftAPI = dom.window.document.body.querySelectorAll('script')[6].textContent
    funcraftAPI = funcraftAPI.replace(/(var |,)([A-z]*)= (\{|\[)/g, '$1"$2": $3')
    funcraftAPI = funcraftAPI.replace(/^var /, '')
    funcraftAPI = JSON.stringify(JSON.parse(`{${funcraftAPI}}`), null, 2)

    res.send(JSON.parse(funcraftAPI).pgames)

Merci à vous, problème résolu ! :D

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte