Javascript enregistrer une frame

Fermé
ponpon - 17 mars 2006 à 08:35
hapyba Messages postés 12 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 12 janvier 2008 - 12 avril 2006 à 17:05
Bonjour, tt le monde

Alors j'ai une question,

je n'arrive pas a faire une recherche dans une frame qui affiche un site (cf : http://www.commentcamarche.net/forum/affich-2128867-javascript-recuperation-valeur-dans-une-page)
au passage merci a kilian pour son aide.
Par contre est ce possible d'enregister cette frame en .htm ou .txt
ou encore soyons fou de créer un cookie pour enregister le contenu de la source ? lol

voila voila question pas trop compliqué mais qu'on arrive pas a réaliser avec killian.
Bonne journée et merci d'avance pour vos aides

23 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
11 avril 2006 à 10:12
Si ça t'interesse je viens de faire le test et ça fonctionne, j'ai bien la page que tu veux.
Il faut analyser le javascript de la page pour en extraire une url et un cookie.
Ensuite rendez vous sur cette url qui dit que le fichier à changé de place et là on te donne une nouvelle url.
Tu vas vers cette url et enfin tu tombes sur la page que tu voulais :-D

Le tout avec la libcurl.
1
hapyba Messages postés 12 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 12 janvier 2008
11 avril 2006 à 13:11
Bravo,

J'avais commencé les tests hier soir et j'en étais arrivé à avoir ce message de changement d'url mais elle ressemblait à celle que je transmettais

Alors Oui Ca M'intéresse !!!!

Voilà ou j'en suis :
$ch = curl_init("http:l'url+2 paramètres");
$fp = fopen("example_homepage.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch,CURLOPT_COOKIE,"2 paramètres");
curl_exec($ch);
curl_close($ch);
fclose($fp);

=> dans example_homepage l'url resultante identique à celle passée dans le curl_init

Merci

Patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
11 avril 2006 à 15:08
Eh bien à partir de là, il n'ya plus qu'à se rendre à l'adresse qui redirige et c'est bon.
Je suppose que le cookie change à ce moment là et que la libcurl le prend bien en compte.

Tu prends le cookie qui est dans le javascript en le mettant directement dans ton script.
Pour le coup j'ai fait un peu plus compliqué.
Je prend la page en partant de rien.
J'extrais url et cookie du javascript, je vais vers l'url, j'extrait l'autre url vers laquelle on me redirige (et libcurl memorise le cookie), puis je vais vers cette url (qui a l'air d'être la même) et c'est bon.

Ta methode est plus simple, surtout si le cookie du javascript ne varie jamais (ça je en sais pas).

Je te donne quand même ce que j'ai fait:
<?
$base_url='http://www.lesite_en_question.fr';
$url=$base_url . 'la suite de l'url';
$curl=curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$source=curl_exec($curl);
/* A présent dans $source tu as la première page: celle avec les scripts */

//Dans le Javascript, tu as l'url où il faut se rendre dans une variable nommée u, on la récupère
$js_url_pattern='/u = "([^;]+?);/';
preg_match($js_url_pattern, $source, $match);

$path=$match[1];
//Dans cette url, il ya la variable s, on la prend aussi (elle a l'air d'être vide, mais ça peut changer)
$js_var_s_pattern='/s="(.*?);/';
preg_match($js_var_s_pattern, $source, $match);

/* On remplace la variable s Javascript par sa valeur (en enlevant la
guillemet de fin) */
$path= str_replace('"+s+"', substr($match[1],0,-1), $path);
/* On remplace le remplace le timestamp UNIX, donné par le 
javascript dans l'url, par un timestamp qu'on va calculer nous même */
$url = str_replace('"+d.getTime()', time(), $base_url . $path);

//On extrait le cookie donné en Javascript
$js_cookie_pattern = '/document.cookie = "([^"]+?)"/';
preg_match($js_cookie_pattern, $source, $match);
$cookie=$match[1];

//Et on va à la page où le javascript nous aurait normalement redirigé
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
$source=curl_exec($curl);

//On est dans la page qui nous redirige, on note l'url et on y va
$js_urlmoved_pattern='/a href="([^"]+?)"/i';
preg_match($js_urlmoved_pattern, $source, $match);
$url=$base_url . $match[1];

//Et voilà notre page!!
curl_setopt($curl, CURLOPT_URL, $url);
$source=curl_exec($curl);

curl_close($curl);

?>
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
11 avril 2006 à 15:10
En passant, il faut enlever le paramètre zz de l'url que tu m'as donnée car c'est le timestamp unix du moment où tu envoies ta page.
Donc il faut le calculer à chaque fois.

Et finalement, au fur et à mesure des pages, l'url est peut être toujours la même, j'ai pas trop vérifié mais bon je m'emmerde peut -être à l'extraire pour rien à chaque fois :-)
0
hapyba Messages postés 12 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 12 janvier 2008 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
11 avril 2006 à 15:41
Alors là !!!! Bravo !!!!

ça c'est du code !!

et qui fonctionne à merveille !!!

Je te recontacte {;°) ...

Patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
11 avril 2006 à 15:54
Cool!!
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
17 mars 2006 à 08:40
Si c'est possible.
Tu peux éventuellement la télécharger en utilisant AJAX.
http://www.commentcamarche.net/ajax/ajax-intro.php3

Mais il va falloir que tu utilises du javascript pas standard pour l'enregitrer dans un fichier....

Je pense qu'il faudrait réfléchir à pourquoi ton url ne passe pas dans la frame.
0
j'envisage tte les options possible je ne laisse pas le pb de l'url de coté.
0
Personne n'a de soluce ou des liens a exploiter ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour ponpon et kilian,

J'ai suivi avec grand intérêt vos différents post pour arriver à récupérer des infos d'une frame contant une page externe car j'ai le même problème et je galère depuis une semaine .

Avez vous trouvé une solution ou une piste ?

Merci de votre réponse

Patrick
0
Auriez vous une petite piste, tout'p'tite ???
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2006 à 07:37
Salut,

Pourrait tu me préciser coment est rangée cette valeur?
Entre quelles balises? Et est ce que cette balise possède un id ou un nom (champs name).
Et ou veux tu récupérer cette valeur? Dans une autrre frame ou dans ta page principale?
0
Kilian, je te remercie vivement pour avoir pris en compte ma question !!!

J'appelle depuis mon site la page d'un site extérieure afin d'en extraire les informations et les présenter sous forme de liste.

Dans la page extérieure il y un tableau par enregistrement de données.

Chaque tableau est ainsi conçu (simplifié) :
<table>
<tr id="xxxxx0"> (0 à n)
<td ...>
<table ...>
<tr>
<td ...>
<a id="yyyyy0"> donnee1</a> donnee2
</td>
<td ..>
</td>
</tr>
</table>
</TD>
</TR>
</TABLE>
<table>
<TR ID="zzzzz0">
<TD..>
donnee 3 <br> donnee4
<br>donnee5
</TD>
<TD ...>
donnee inutile
</TD>
<TD>
</tr>
<table>

idem pour enregistrment suivant (avec xxxxxx1)

J'ai suivi les échanges que tu as eu avec ponpon et j'en suis arrivé au même résultat . c'est à dire impossible d'accéder aux éléments de la page extérieure .

Patrick
0
Bonjour Kilian,

Juste pour info j'avais aussi regardé les echanges que tu avais eu avec ponpon dans le message : https://forums.commentcamarche.net/forum/affich-2128867-javascript-recuperation-valeur-dans-une-page

Et la dernière piste était la mise en place d'un controle activeX

...

Merci
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
8 avril 2006 à 12:57
Oui c'était hasardeux comme réponse, il voulait enregistrer sa page dans un fichier et c'est impossible en javascript standard, donc je lui avait suggéré de regarder du côté de script plus permissifs mais qui ne marchent qu'avec Internet Explorer.

Maintenant, si depuis une frame, tu veux récupérer des valeurs contenues dans des balise qui ont un id dans une autre frame, tu peux.

C'est bien depuis une autre frame que tu veux récupérer ces valeurs? Et non pas dans la page mère?
0
hapyba > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
8 avril 2006 à 17:25
Je souhaite les récupérer quelque soit la méthode.

J'ai essayé ces configurations :

Scéneario 1
-------------
page1.html (frameset et frame)
->déclare 2 frames : frame0 et mainframe
->frame0 = http://www.siteext.com/pagequiminteresse.html
->mainframe=recuperateur.php
=> à l'appel de page1.html la frame 0 contient les données que je souhaite récupérer et recuperateur.php essaye de les récupérer


Scéneario 2
-------------
recuperateur.php
->déclare une iframe (iframe0) qui a comme source : http://www.siteext.com/pagequiminteresse.html
=> recuperateur.php essaye de recuperer les donnees de la page contenu dans son iframe0

Est-ce clair ?
Tout autre scénario est envisageable !!!

Merci

patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
10 avril 2006 à 00:42
Tout ce dont tu as besoin, c'est récupérer des trucs dans la page qui t'interesse sur le site distant, puis traiter ta page principale en fonction, c'est bien ça?
Une fois chargée, ta page principale n'est plus censée bouger?

En ce cas, ça rend les choses encore plus facile.

Si tu me cites l'endroit qui t'interesse sur cette page distante, je peux éventuellement te donner le code pour extraire ce passage.
0
bonsoir kilian,

en effet :
- dans ma page principale (pageprincipale.html) il ya un textearea nommé f_text
- dans la page externe chargée dans une frame ou une iframe il y a plusieurs tableaux identiques repérables par la balise tr nommées tableau0, tableau1...

j'ai fait un exemple : http://www.phc2i.com/CCM/pageprincipale.html

qui affiche et doit récupérer les infos de :
http://www.strategeinformatique.com/CCM/tableau.html

Merci de ton aide

Patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 09:20
Eh bien ça a déjà l'air de marcher dans la page que tu viens de mettre en lien.
0
non non...

Le cadre du bas (URL extérieure) sera caché

Le cadre du haut doit recevoir les données du cadre du bas (dans l'exemple, je les ai ajoutés en tant que value du textearea donc à la main), lors de l'appuis sur le bouton ( par exemple)
et selon une présentation différente

Dans mon exemple, lorsque tu appuies sur le bouton, rien ne se passe, en dehors de l'alerte qui est juste avant l'instruction de copie des données du cadre du bas vers celui du haut et qui ne marche pas,
et normalement le texte : "ici doit s'afficher : " doit disparaître

patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 10:32
Ben tu peux arranger ça sans frame.
J'aime pas les frames mais ça n'a pas d'importance, tu pourras afficher tes résultats comme tu veux, dans une frame ou non.

Donc il te suffit de télécharger la page distante puis d'utiliser uen expression régulière pour en extraire les informations.

Globalement ça donne ça:
$content=file_get_contents('http://www.strategeinformatique.com/CCM/tableau.html');

$vide='[^<]*';
$masque = "/<tr id=\"tableau[0-9]{1}\">$vide<td>(.*?)<\/td>$vide<td>$vide<table>$vide<tr>$vide<td>$vide<\/td>$vide<td>(.*?)<\/td>/";

preg_match_all($masque, $content, $out, PREG_SET_ORDER);

print_r ($out);

Je ne sais pas si tu sais utiliser les expressions régulières, il ya un cours dessus ici dans la section Php.

J'ai utiliser uen variable nommée $vide pour représenter les tabulations, saut de lignes etc... lorsque le contenu entre deux balises ne nous interesse pas.

J'utilise print_r pour représenter le résultat. Tu verras qu'à $out[0][0] tu as le premier résultat qui correspond à l'expression régulière entière.
A $out[0](1] tu as le premier résultat qui t'interesse (champ1_tab0)
A $out[0][2] tu as champ2_tab0

Dans $out[1][0] tu as le deuxième résultat qui correspond à l'expression régulière entière etc...
0
Kilian,

J'ai malheureusement déjà essayé la piste du php avec fopen url et fread ou file_get_contents, mais l'url extérieure en question teste si mon poste accepte les cookies et si mon navigateur accepte les scripts et comme php s'exécute du coté serveur la page que je reçois est une page d'erreur.

En tout cas merci pour l'info coté php , elle m'a appris quelques ruses que je ne connaissais pas.

j'ai aussi essayé un require et un include de la page en question sans résultat

dur dur, autres pistes ?

Patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 11:06
Là ou je suis, file_get_contents fonctionne bien.
Dans le pire des cas, tu peux y aller avec fsockopen() et modifier tes en-têtes.
0
file_get_contents le fait car mon exemple est un jeu d'essai que j'avais orienté poste client et donc j'avais isolé le problème dans ce sens.

Dans la situation réelle il y a bien ses 2 erreurs détectées (cookies, script)

Afin d'avancer de mon côté sur la piste que tu m'as donné, je vais me lancer dans le fsockopen() que je n'ai jamais utilisé, c'est l'occasion...

Si tu as d'autres pistes je suis preneur.

Dans tous les cas je te tiens au courant.

Merci encore

Patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 11:23
Je viens d'essayer plusieurs truc en Javascript avec une frame et:
Error: uncaught exception: Permission denied to get property HTMLDocument.getElementById

Ni plus, ni moins....et sans autre éclaircissement sur l'affaire.

Au fait j'y pense, si le serveur distant se met des protections comme ça peut être que c'est justement car il ne veulent pas de scripts robot sur leur serveur....
0
'permission denied' , et script robot

Pour le premier, j'ai lu, selon les forums que js, ie ou ff mettaient des protections dans ce sens, je n'ai pas approfondi cette piste.

Pour le second, nous avons contacté les responsables du site pour savoir si les données ne pouvaient pas nous être mises à disposition (rss), et ils nous ont répondu que d'autres sites utilisaient les résultats directement dans leurs pages sans problème et ils n'y voient pas d'inconvénients.

Mais où est la ruse ?

Patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 11:50
Tu pourrais me donner l'adresse de la page en question.
Puis si j'ai le temps je regarderai ça ce soir.
0
hapyba > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
10 avril 2006 à 12:27
Pas de problème, mais je préfère te l'envoyer en privé
voici mon adresse mail afin que tu m'envoies la tienne
patrick.hagege@phc2i.com

Pourrais tu me dire dans quel domaine tu travailles

Encore merci

bonne journée

patrick
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
10 avril 2006 à 14:17
Je ne te conseille pas de mettre ton adresse mail dans la discussion si tu ne veux pas recevoir de spam (à cause des robots qui trainent).

Par contre mon email est dans mon profil (suffit de cliquer sur mon nom).

Pourrais tu me dire dans quel domaine tu travailles

En fait je ne travaille pas encore. Je suis en BTS informatique administration réseau.
0
hapyba > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
10 avril 2006 à 16:41
Hé bien bravo pour tes connaissances avancées sur un sujet satellite à ta formation de base.

je t'envoie donc le lien à tester

Merci

Patrick
0
hapyba Messages postés 12 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 12 janvier 2008
10 avril 2006 à 19:21
ça y est je vois ton adresse mail, depuis que je me suis connecté avec mon identifiant |:}
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 19:27
Ahh, donc c'est comme ça que fonctionne le système anti-robot ici...
Je comprends mieux.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 20:14
Je viens de regarder le site. C'esdt un peu compliqué parce que la page passe par des intermediaires.
La première page envoie un cookie et est compressée en gzip.
Les choses sont un peu compliquées.

La seule manière que j'imagine pour avoir cette page, c'est d'utiliser la libcurl:
https://www.php.net/manual/fr/ref.curl.php

C'est une bibliothèque qui permet de communiquer avec le protocole http d'une manière plus soutenue comme la prise en charge des cookies, la decompression gzip (remarque pour ce dernier, peut être que php savait déjà le faire avec file_get_contents).

Alors il faut voir si tu as curl. (Pour tester, fait juste un appel à la fonction curl_init() et tu aura une erreur si tu ne l'a pas).
Et si tu ne l'as pas, ben, si tu es ton propre hebergeur tu peux l'installer, sinon....
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
10 avril 2006 à 20:15
J'ai retesté un peu de javascript avec les frames. Sans succés.
Peut être que c'est possible, faudrait voir avec des gens qui connaissent mieux ce langage.
0