Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/02/2019, à 14:29

BenjiBoy

[RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Hello,

un API qui nous est fourni créé une page web accessible en local ou à distance avec plusieurs dizaines de valeurs de consommation électrique, qui sont mise à jour dynamiquement avec un javascript.

J'aimerais une manière toute bête de récupérer quelques valeurs sur l'ensemble, via une ligne de commande / un script bash, mais je n'en trouve pas.

N'hésitez pas à poser des questions si vous avez une idée je n'y connais strictement rien au javascript.

a+

Dernière modification par BenjiBoy (Le 24/04/2019, à 14:00)

Hors ligne

#2 Le 18/02/2019, à 15:56

Nuliel

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Bonjour,

Si ça peut t'aider, je pense que ce que tu cherches c'est "Web scraping" (ex: pour python il y a beautiful soup).
Après c'est pas la peine de sortir l'artillerie lourde si le HTML est très simple. Dans ces cas extraire avec grep/sed/cut... peut être possible.

Tu peux donner le code HTML qu'on voit la tête de la page? (ou même un lien)

Dernière modification par Nuliel (Le 18/02/2019, à 15:58)

Hors ligne

#3 Le 18/02/2019, à 16:10

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

oui, en effet, web scrapping ou en franglais il y avait scraper (c'est dans le dico d'ailleurs, surprenant) je suis tombé sur ces termes.

Je n'utilise que très superficiellement python (je copie colle, en fait), c'est pour ça que j'espérais du bash.

Je ne vais pas pouvoir copier la page entière, juste quelques parties, j'ai peur que ça complique la tâche mais je n'ai pas le choix, comme je suis une quiche en java je ne sais pas ce qui pourrait porter préjudice au fabricant.

c'est une page xhtml:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Carte Gestion Energie - Valeurs</title>
 <style type="text/css">
[...]
  </style>

  <!-- WebForms Resources -->
  <script src='jquery.js'></script>
<link rel='stylesheet' href='WebForms.Core.default.css' />
<script src='WebForms.RtuAPI.js'></script>
<script src='WebForms.Core.js'></script>
<script src="cge_valeurs.xhtml.js"></script>
<link rel="stylesheet" href="cge_valeurs.xhtml.css"></link>
[...]
</head>
<body>
[...]
</body>
</html>

C'est le script "cge_valeurs.xhtml.js" qui m'intéresse.

dedans :

var PageData = {
 OSVersion: [1, 42, 455],
 HttpSession: false,

Tags: [
  { id: 868, name: "ANA34", comment: "Mode courant", type: "Word", unit: "", precision: "", },
  { id: 792, name: "VChargeBat", comment: "Tension de charge batterie à 25°C", description: "Tension de charge Batteries", type: "Word", unit: "mV", precision: "0", },
  { id: 799, name: "CourantMaxiPV", comment: "Courant maxi en entrée pour photovoltaique (mA)", description: "", type: "Word", unit: "mA", precision: "0", },
  { id: 801, name: "CourantFinAbs", comment: "Courant de fin d'absorption (mA)", description: "", type: "Word", unit: "mA", precision: "0", },

[...]

Puis toute une série de variables.

Ce sont ces variables que je voudrais récupérer, enfin leurs valeurs. Toute les X minutes.

Hors ligne

#4 Le 18/02/2019, à 16:19

erresse

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Bonjour,
Peut-être une copie d'écran de la page du navigateur qui affiche les résultats, si ce n'est pas confidentiel, puis un vidage complet du code html de cette page seraient plus parlants et techniquement plus compréhensibles pour les aidants.
Selon la complexité du code de la page, Naziel pourra sûrement te confirmer s'il est envisageable ou pas de traiter ta demande par script bash.


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#5 Le 18/02/2019, à 16:57

Nuliel

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Ah, je pensais que c'était un travail d'école.

Ok, donc en gros on a une page dont les valeurs sont modifiées par un script js qui prend ses valeurs d'un autre endroit.
Vu que tu préférerais du bash, on va tenter d'utiliser les id et les noms associés aux valeurs (et donc avec du bash, mais en python ça se fait très bien aussi en très peu de lignes)

L'idée du programme bash pourrait être:
- récupérer toutes les X secondes la page avec la commande curl/wget (attention à laisser un temps de latence suffisant pour le pas passer pour un bot ou spammer le serveur)
- récupérer la ligne qui nous intéresse avec

grep ANA34

sur le html précédemment récupéré
- puis avec la commande cut et le séparateur > puis le séparateur <, récupérer ce qui se trouve entre les deux balises.
- refiltrer avec cut s'il y a besoin

Peux tu donner

res=`curl LienVersLaPage`
echo $res | grep ANA34
echo $res | grep VChargeBat

(j'en prends deux pour voir si c'est toujours la même structure)

Dernière modification par Nuliel (Le 18/02/2019, à 16:59)

Hors ligne

#6 Le 19/02/2019, à 08:28

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Salut à tout les deux,

merci bien pour votre intérêt à la question !

Le problème du curl suivi d'un grep, c'est que j'ai l'impression que curl récupère le texte brut mais sans les retours chariot ou indentation, du coup un grep peut donner un résultat de >100 lignes lorsque apparaît dedans l'occurrence recherchée. C'est d'ailleurs le cas sur tes demandes :

res=`curl - user:mdp http://url:port/page.xhtml

(j'ai rajouté le -u)

echo $res | grep ANA34

ne donne rien

echo $res | grep VChargeBat

donne

<script src='jquery.js'></script> <link rel='stylesheet' href='WebForms.Core.default.css' /> <script src='WebForms.RtuAPI.js'></script> <script src='WebForms.Core.js'></script> <script src="cge_valeurs.xhtml.js"></script> <link rel="stylesheet" href="cge_valeurs.xhtml.css"></link> <script src='WebForms.Iframe.js'></script> <script src='WebForms.DynamicLabel.js'></script> <script src='WebForms.Link.js'></script> <script src='WebForms.Label.js'></script> <script src='WebFo <div id="Rectangle_0" data-type="Rectangle" 
[...]
Test Batteries</button><div id="DynamicLabel_42" data-type="DynamicLabel" data-visibility="0" data-write="2" data-ask="no" data-question="Are you sure you want to modify the value ?" data-rect="320;440;100;20" data-tooltip="Tension de floating" data-tag="VChargeBat_S"

[...]

Dernière modification par BenjiBoy (Le 19/02/2019, à 08:28)

Hors ligne

#7 Le 19/02/2019, à 15:57

Nuliel

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

echo a mangé les retours à la ligne, j'ai oublié -e à passer à echo.

Sinon je vois pas les valeurs à récupérer là dedans, pourrais tu donner un morceau de ligne du code HTML contenant une valeur à récupérer (avec les premières balises html contenant la valeur à récupérer)?

Hors ligne

#8 Le 19/02/2019, à 16:47

Watael

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

non, tu as oublié de mettre des guillemets.

"il faut toujours mettre les variables des guillemets, à moins de savoir pourquoi."


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#9 Le 21/02/2019, à 08:48

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Hello,

je dois partir pour le taf jusqu'au 4 mars, j'aurais un accès très limité au web, mais j'essaierai de maintenir à jour le topic.

Donc parmi ce que récupère curl, c'est ce genre de ligne qui m'intéresse.

Je sais pas si vous pouvez avoir une idée avec ça, ce doit être assez difficile j'imagine ... Mais comme je l'ai dit je ne sais pas trop ce que je peux mettre :

<div id="DynamicLabel_38" data-type="DynamicLabel" data-visibility="0" data-write="10" data-ask="no" data-question="Are you sure you want to modify the value ?" data-rect="122;250;80;20" data-tooltip="" data-tag="ANA8" data-tagtype="analog" data-format="%f(value/10,%V) %U" data-colors="Black;White;no" data-fontex="Arial;12;" data-border="1;Black" data-textpos="40;13;middle" data-rot="0;40;10" data-clipsize="78;18" data-boxtype="keypad" data-boxtitle="Input" data-boxlabel="Value :">??</div>

Hors ligne

#10 Le 21/02/2019, à 10:31

Nuliel

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Si le valeur à récupérer est ??, j'imagine qu'on peut chercher les lignes qui contiennent data-tag="ANA8" et récupérer la valeur ??.

Tu peux essayer

res=`curl LienVersLaPage`
echo -e "$res" | grep ANA8

afin de voir si ça ressort seulement la ligne que tu cites en #9, puis si ça te retourne cette fameuse ligne, tu peux passer

echo -e "$res" | grep ANA8 | cut -d'>' -f2 | cut -d'<' -f1

qui devrait te retourner la valeur.

@Watael: J'ai pas compris cette histoire de guillemets, c'est ok comme cela?

Dernière modification par Nuliel (Le 21/02/2019, à 10:33)

Hors ligne

#11 Le 21/02/2019, à 15:49

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Et non hélas le curl prend tout sans distinction ... J'ai toute la page sur je fais un grep sur un "ANA".

Mais je ne pense pas que quand bien même le curl ne prendrai que la ligne j'aurais la valeur.
Dans les fait la page web (sur un navigateur) s'affiche avec de ?? puis après quelques secondes de chargement, probablement le temps que le script récolte toute les données, la page affiche les valeurs. Du coup le curl semble ne récupérer que la page lorsqu'elle affiche les ?? sans laisser le temps aux scripts de les remplacer par les bonnes valeurs.

Enfin je crois !

Hors ligne

#12 Le 22/02/2019, à 10:39

Nuliel

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Là, je ne saurais pas t'aider du coup. Autant sur une page avec ces données fixe, mais là sad

Hors ligne

#13 Le 22/02/2019, à 11:03

Watael

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

$ var="bla
bla"
$ echo $var
bla bla
$ echo "$var"
bla
bla

Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#14 Le 24/02/2019, à 13:15

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Salut,

ok a priori le bahs n'est pas l'outil le plus approprié, as-tu alors une idée en python ?
Un bout de code opérationnel que je pourrais bidouiller par la suite ?

Merci pour ton aide,
a+

Hors ligne

#15 Le 24/02/2019, à 16:37

MicP

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Bonjour

michel@debg53sw:~$ ligneRetournee='<div id="DynamicLabel_38" data-type="DynamicLabel" data-visibility="0" data-write="10" data-ask="no" data-question="Are you sure you want to modify the value ?" data-rect="122;250;80;20" data-tooltip="" data-tag="ANA8" data-tagtype="analog" data-format="%f(value/10,%V) %U" data-colors="Black;White;no" data-fontex="Arial;12;" data-border="1;Black" data-textpos="40;13;middle" data-rot="0;40;10" data-clipsize="78;18" data-boxtype="keypad" data-boxtitle="Input" data-boxlabel="Value :">??</div>'

michel@debg53sw:~$ varCible="ANA8"
michel@debg53sw:~$ maRegex='.* data-tag="'$varCible'" .* data-boxlabel="Value :">(.*)</div>'
michel@debg53sw:~$ [[ $ligneRetournee =~ $maRegex ]] && echo "Valeur $varCible : ${BASH_REMATCH[1]}"
Valeur ANA8 : ??

Mais on peut aussi modifier la valeur assignée à maRegex
de façon à ce que le test ne retourne rien
tant qu'il n'y aura pas une valeur numérique dans le champ.

Dernière modification par MicP (Le 24/02/2019, à 16:40)

Hors ligne

#16 Le 24/02/2019, à 17:49

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Bonjour MicP,

... J'ai pas tout compris, j'ai essayé d'appliquer tes lignes au code HTML mais la 4eme commande me retourne l'ensemble de "ligneRetournee".
Est-ce que j'ai raté quelque chose ?

a+

Hors ligne

#17 Le 24/02/2019, à 21:24

MicP

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Bonsoir

J'ai créé la variable ligneRetournee pour servir d'exemple d'entrée
en fonction de l'exemple de ligne cité dans ton message #9

J'ai testé avec succès ces lignes de commandes
sous debian 9 (stretch) et sous Ubuntu 18.04.2 (bionic)

=======
Mais je ne sais pas du tout quel est le "code HTML" que tu as utilisé,
comment tu l'as récupéré, ni comment tu en as assigné successivement chaque ligne
à la variable ligneRetournee

Je n'ai donc aucune idée de ce que pourrait contenir "l'ensemble de "ligneRetournee""
ni de la valeur que tu as assigné à la variable ligneRetournee

Dernière modification par MicP (Le 24/02/2019, à 21:32)

Hors ligne

#18 Le 07/03/2019, à 15:15

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Hello,

suis de retour en France, j'ai une meilleurs connexion, du coup je suis preneur d'une solution python si elle est relativement simple. Vu que le bash n'est pas l'idéal.
Si un codeur passe par là ...

a+

Hors ligne

#19 Le 11/03/2019, à 10:18

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Je up, toujours à la recherche d'un moyen de récupérer les valeurs d'une page web en javascript, en python comme le bash ne semble pas être en mesure de le faire.

Hors ligne

#20 Le 12/03/2019, à 16:07

soshy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Salut,

on dirait bien que tu as a faire a ce nouveau type de site web où tout est fait en javascript ou presque. Dans un premier temps, tu peux inspecter la page dans ton navigateur (puis rafraichir la page), et dans l'onglet réseau et filtrer uniquement les requetes "XHR". Dans les réponse à ces requêtes, qui sont souvent au format JSON, tu devrais trouver la valeur qui t'intéresse.

Si tu arrives jusque là, tu dois pouvoir faire un curl sur la même URL que celle de la requete XHR, éventuellement en y ajoutant les paramètres nécéssaires et obtenir la réponse au format JSON contenant l'information que tu cherches.

Dernière modification par soshy (Le 12/03/2019, à 16:10)

Hors ligne

#21 Le 14/03/2019, à 09:48

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Hello,

ben j'ai essayé ton truc, l'inspecteur est plutôt bien fait sur chrome.
J'ai choppé le XHR dans network, repéré un peu ce qui m'intéressait mais je ne vois pas comment entre ça dans un URL. j'ai dans la colonne de gauche des "Name" que je peux taper à la suite de l'URL de base mais ça renvoi "{"error":"Invalid application key","code":"BadAppKey"}"

Toujours dans l'inspecteur je vois un nom de script en js, et je vois dans "response" des valeurs numériques qui pourraient bien être celles que je recherche (sauf qu'apparemment il y a un facteur de conversion, mais je le trouverai plus tard).

Compliqué tout ça !

Hors ligne

#22 Le 14/03/2019, à 09:53

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Je crois que la commande à proprement parler qui interroge l'appareil pour lire les valeurs c'est "[{command: "GetTags", tags: [707]}"  et 707 étant le tag peut-être qui détermine s'il récupère le "ANA24" ou autres.

Comment faire une requête web en tapant l'adresse "http://url.machin.fr:port/la_requete_en_java", c'est possible ? Intégrer une requête java dans un URL.
C'est peut-être n'importe quoi hein, je suis noob en java.

a+

Hors ligne

#23 Le 14/03/2019, à 13:51

soshy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Pas besoin de "requête java". En fait, javascript (les instructions faites par ton navigateur) effectue des requêtes que tu peux reproduire manuellement.

Donc dans la colonne name, si tu penses avoir trouvé la requête qui retourne l'information recherchée, tu peux tenter de la reproduire...

Exemple :
Si lorsque tu selectionnes l'onglet "Headers" pour la requête qui t'intéresses, tu devrais trouver :
Request URL: http://www.monsiteweb.com/destrucs/?par … m3=blabla0

Tu peux donc commencer par faire

curl  'http://www.monsiteweb.com/destrucs/?param1=3&param2=AzT&parm3=blabla0'

et voir si tu obtiens une réponse.

Si une erreur t'es retourné parce qu'il te manque des droits ou autre, tu peux aller voir (toujours dans "Headers"), la catégorie "Request Headers". Tu devrais voir des trucs du genre :
Cookie: bLIQaESwmlvA0IKBAACW
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Mobile Safari/537.36

C'est ce qu'on appelle les header http de la requête. Tu peux les ajouter un par un manuellement à ton curl pour voir quels headers sont nécéssaires afin que le service ne te réponde plus une erreur.
Pour rajouter les 2 headers que j'ai donné dans curl, il faudrait faire :

curl -H 'User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Mobile Safari/537.36' -H 'Cookie: bLIQaESwmlvA0IKBAACW' 'http://www.monsiteweb.com/destrucs/?param1=3&param2=AzT&parm3=blabla0'

A priori, si tu fais un curl sur la bonne URL avec tous les headers comme dans le debugger de chrome ça devrait fonctionner.

Hors ligne

#24 Le 14/03/2019, à 14:20

Watael

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

java et javascript sont deux langages distincts.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#25 Le 15/03/2019, à 14:53

BenjiBoy

Re : [RESOLU] Récupération valeur variable JS avec bash [+ mise en forme]

Hello,

vous allez rire !
J'ai fais un scan de port du périphérique, j'ai trouvé un port XXX21, le 21 me faisant penser à du FTP j'ai essayé de m'y connecté, avec succès, dedans il y a tout plein de fichier *.csv contenant toutes les valeurs archivées, exactement ce que je veux.
Du coup je peux récupérer, relativement facilement ces valeurs et même faire un programme de mise en forme avec gnuplot ....

Bon par contre je n'ai pas solutionné l'acquisition des valeurs par le bien du javascript, donc le problème n'est pas vraiment résolu.
Si j'ai un peu de temps - chose rare - j'essaierai quand même ta solution soshy, pour ma culture informatique personnelle ...

Donc voilà, affaire conclue.

Bien le merci à vous tous, et une bonne journée.

Hors ligne