Récupérer des infos via requête HTTP ?

Bonjour,

Je viens solliciter l’aide de plus expérimentés que moi pour accéder à des infos de configuration d’un équipement (en l’occurrence une caméra IP) via l’IPX800 V4.

Le cas concret est sur la configuration NTP de ma caméra. Mais il doit être transposable sur d’autres cas. J’explique.

Une requête HTTP envoyée directement à ma caméra depuis un navigateur me retourne un fichier texte du type :

var ntpenable="1";
var ntpserver="URL ou IP du serveur NTP";
var ntpinterval="1";

N’étant ni au format JSON, ni au format XML, ces données ne sont pas reconnues comme sources de données dans l’IPX.

J’arrive à faire afficher ce texte dans un iframe avec le code suivant dans un widget HTML

Statut NTP caméra Wanscam<br><br>
<div style="background-color: #ffff00; margin-left:10px; margin-right:10px">
    <iframe 
 		src="http://IP_Cam:Port/hi3510/param.cgi?cmd=getntpattr&usr=login&pwd=password"
 		frameborder="0"
 		scrolling="no""
 		width="100%" height="70"
	  	sandbox>
	</iframe>
</div>

La lecture du texte me permet déjà de savoir si la caméra est bien configurée sur le bon serveur NTP (ou si elle l’a perdu à l’occasion d’un reboot ou autre). Mais ce n’est pas des plus esthétique.

J’aimerais bien aller plus loin en pouvant analyser le contenu du texte renvoyé par la requête HTTP et en fonction de l’URL du serveur NTP renvoyée faire afficher un message sur sa conformité à mes attentes ou non.

Il faudrait pour cela que je puisse récupérer le contenu de ce petit fichier texte dans une variable JS pour l’analyser et tester la présence d’une certaine chaîne de caractère.

C’est là où je bute car je ne sais pas comment faire… Mes espoirs se portaient sur la commande XMLHttpRequest, mais elle est visiblement refusée quand elle est exécutée depuis une page de l’IPX (problème d’accès « cross-domain », je comprends le principe de cette sécurité mais ne sais pas la contourner, ni même si c’est possible, tout ce que j’ai lu sur le Net à ce sujet me semble très compliqué à mettre en oeuvre).

Je sollicite donc l’aide de développeurs chevronnés pour m’aider à résoudre cette difficulté.

Dans un 2e temps cela pourrait déclencher une action d’une façon ou d’une autre (en faisant par exemple basculer une entrée virtuelle de l’IPX qui via un scénario enverrait un PUSH vers la caméra pour la remettre sur le bon serveur si elle l’a perdu). C’est ce que je fais actuellement à la main via une entrée virtuelle « bouton » qui est surveillée dans une scène et envoie une requête PUSH vers ma caméra pour la remettre d’équerre si nécessaire.

Merci d’avance à ceux qui pourront m’aider.

Bien à vous

+1

Personne n’a d’idée sur la façon de s’y prendre… ? :disappointed:

Ca m’a l’air d’être du JavaScript. Avez-vous essayé d’ eval() le texte qui vous ai renvoyé par votre caméra ?

Bonjour @ZogStriP,

Mon souci est que justement je n’arrive pas à récupérer le texte qui est renvoyé.

Y a-t-il un moyen via la requête à l’intérieur du iframe ? Parce que je n’arrive pas à faire fonctionner la commande
XMLHTTPRequest

Merci… :slight_smile:

Ouvrez la console de votre navigateur et lancez ce bout de code. Dites moi ce qu’il affiche

$.ajax("http://IP_Cam:Port/hi3510/param.cgi?cmd=getntpattr&usr=login&pwd=password").done(function(data) { console.log(data); });

TypeError: $.ajax is not a function :disappointed:

PS : je suis sous Firefox 48.0.2, la version la plus haute acceptée par mon OS (MacOS 10.7.5)

J’ai aussi essayé avec ce bout de code trouvé sur W3School que j’ai placé dans un widget HTML :

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
    $("button").click(function(){
        $.ajax({url:"http://IP_Cam:port/hi3510/param.cgi?cmd=getntpattr&usr=login&pwd=password", async: false, success: function(result){
            $("div").html(result);
        }});
    });
});
</script>
</head>
<body>
<div><h2>Let AJAX change this text</h2></div>
<button>Change Content</button>
</body>
</html>

Le bouton « Change Content » apparait bien :

Mais quand je clique dessus, le texte ne change pas et j’ai ce message dans la console (toujours le pb de Cross Origin que je ne sais pas contourner…) :

Blocage d’une requête multi-origines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur http://P_Cam:port/hi3510/param.cgi?cmd=getntpattr&usr=login&pwd=password. 
Raison : l’en-tête CORS « Access-Control-Allow-Origin » est manquant.

Merci de votre aide @ZogStriP

Arf, malheureusement, le CORS empêchera votre navigateur de faire la requête AJAX depuis le Dashboard. Pour le contourner, il y a 2 solutions :

  • utiliser un proxy qui fera directement la requête
  • mettre à jour le firmware de votre caméra si ce dernier existe et autorise le CORS

Merci @ZogStriP, c’est bien ce que j’avais cru comprendre…

Une mise à jour de firmware autorisant le CORS, je n’y crois pas du tout vu que c’est un produit en provenance directe de Chine sans support en Europe.

Le proxy est probablement plus faisable vu que j’ai un Raspberry Pi sur mon réseau qui se charge des services VPN et NTP. Je vais creuser de ce côté. Si ça se trouve, les packages nécessaires sont déjà installés…

Vu qu’il ne semble pas y avoir de réglage de proxy dans l’IPX, je suppose qu’il va falloir que je fasse la requête voulue directement au proxy depuis le widget et que ce soit celui-ci qui la transfère à la caméra pour renvoyer la réponse. Je ne sais pas trop comment faire, mais je vais chercher… Tout suggestion en la matière sera bienvenue.

En tout cas, merci de votre aide et de votre avis qui a confirmé ce que j’avais un peu découvert en fouinant sur le Net. :slight_smile:

Ma remarque sur l’absence de réglage de proxy était un peu stupide puisque de toute façon, ce n’est pas l’IPX qui fait les accès directement mais le navigateur depuis lequel on le consulte.

C’est donc dans mon navigateur qu’il faut que je règle le proxy, mais ne voulant qu’il n’y ait que les requêtes vers la caméra en question qui passe à travers lui je ne sais pas trop comment le régler. Car le principe est plutôt de tout faire transiter via le proxy et de gérer des exceptions pour certains hôtes ou domaines. Y a-t-il une syntaxe qui permet à l’inverse d’autoriser tout à passer en dehors du proxy et seulement les requêtes vers une certaines adresse à passer par lui ? Un truc du style exception "* . * - Adresse_IP_de_ma_cam "…

Quelqu’un a déjà fait ça ?

Je ne sais pas si c’est possible, mais ce que j’avais en tête était bien plus simple. Par proxy, j’entendais un petit programme qui lorsqu’il reçoit une requête (ie. depuis votre navigateur), effectue une requête vers votre caméra et transmet la réponse (évitant ainsi le CORS).

Oui c’est le principe d’un vrai proxy, mais je ne sais pas comment faire ça… Et je ne suis pas sûr que de passer par un vrai proxy va permettre de contourner le CORS. Mais je pourrai toujours essayer.

Donc j’ai tenté une autre approche en donnant un id « madiv » à la div qui affiche le texte dans l’espoir de pouvoir le récupérer dans un autre widget HTML (placé en dessous) dans lequel j’ai mis :

var elt = document.getElementById('madiv');
var monTexte = elt.innerText || elt.textContent;
return `Récupération du texte de la div :<br>${monTexte}`;

mais ça ne récupère rien, et je ne sais pas pourquoi… :disappointed_relieved:

Le CORS, c’est votre navigateur qui l’impose pour des raisons de sécurité.
Si votre programme effectue la requête, alors il n’y aura aucun problèmes :wink:

Que contient « madiv » exactement ? Si c’est une iframe, c’est normal que vous ne puissiez par accéder à son contenu :wink:

OK @ZogStriP pour cette précision sur le CORS, j’avais oublié cet aspect.

Et bingo :clap: « madiv » contient une iframe donc normal que ça ne marche pas… J’aurai appris quelque chose :wink:

Il faut donc que j’essaye la solution à base de proxy. J’ai installé Squid sur mon RPi, je ne sais pas si ça va être une piste de solution.