[RESOLU] Automatiser un formulaire existant

Eléphant du PHP | 103 Messages

18 janv. 2014, 01:24

Bonjour!

J'ai une demande un peu spéciale et pas compliquée, je cherche (et la licence le permet) à automatiser ce formulaire : http://goo.gl/cjwe8E

En gros il s'agit de proposer un formulaire allégé sur mon propre site que je pourrais transmettre à celui ci par methode POST les input existants et de récupérer ensuite les 24 données situées dans les colonnes Em et Hm.

Je rencontre des difficultés pour charger la geolocalisation mais également pour la récupération qui se fait dans une textbox.

Quels sont vos idées/conseils pour attaquer le problème?

Merci!

Eléphant du PHP | 116 Messages

18 janv. 2014, 15:59

Salut,

Si tu procèdes par curl tu dois pouvoir passer la latitude et la longitude directement dans les champs, non ?


Tu fais du genre $resultat = curl(lesite, les params);

Et théoriquement, l'output fourni par le site devrait devenir dans ta variable résultat, que tu n'auras plus qu'à traiter !

Bon courage,
@+,
Computarelier

Eléphant du PHP | 103 Messages

18 janv. 2014, 17:02

Merci!
Bon, désolé, je ne maîtrise pas bien la chose, voici un bout de code qui ne m'affiche rien :
<?php
try {
$form = '
<form enctype="multipart/form-data"  name="formPV" id="formPV" method="POST" action="http://goo.gl/cjwe8E "  target="output">
<input type="text" id="PVlatitude" name="latitude" value="43.558422"><br>
<input type="text" id="PVlongitude" name="longitude" value="4.069032"><br>
Base : <input type="text" id="pv_database" name="pv_database" value="PVGIS-CMSAF"><br>
Modules : <select name="pvtechchoice"><option value="crystSi">Crystalline silicon</option><option value="CIS">CIS</option><option value="CdTe">CdTe</option><option value="Unknown">Unknown/Other</option></select><br>
Puissance : <input type="text" id="peakpower" name="peakpower" value="3">kWp<br>
Perte : <input type="text" id="efficiency" name="efficiency" value="14">%<br> 
Montage : <select name="mountingplace"><option value="free">Free-standing</option><option value="building">Building integrated</option></select><br>
Inclinaison : <input type="text" name="angle"  id="PVangle" value="30">°<br> 
Azimuth : <input type="text" name="aspectangle"  id="PVaspectangle" value="30">°<br>
Sortie : <input  type="radio" name="outputchoicebuttons" value="window" onclick="nontextclicked_PV(this);"	checked ><br>	
Hidden regionname : <input type="text" name="regionname" value="europe"><br>
Hidden language : <input type="text" name="language" value="en_en" id="PVlanguage"><br>
<input type="submit" name="sbutton" id="PVchoicesubmit" value="Calculate" />
</form>
';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $form);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$resultat = curl_exec($curl);
echo "resultat : ";
print_r($resultat);
curl_close($curl);  

} catch (Exception $e) {
echo $e->getMessage();  
echo "<br>";
echo $e->getTraceAsString();      
}  
   
?>
Correction chef?!
Modifié en dernier par josse34 le 18 janv. 2014, 20:07, modifié 1 fois.

Eléphant du PHP | 116 Messages

18 janv. 2014, 18:08

C'est pas aussi simple que ça
        curl_setopt($ch, CURLOPT_POSTFIELDS, array( 
            'key' => 'XXX',
            'date' => date('Y-m-d'),
            'frequence'=>'1'    
        )); 
Cet exemple dit à ma connexion curl $ch que je remplis le formulaire de sa page avec XXX pour l'input key, la date pour la date et 1 pour la fréquence. Donne lui les valeurs directement et pas le formulaire html ! :-)


Va voir : http://www.dewep.net/Blog/Article-9/Utiliser-cURL-PHP :-)
@+,
Computarelier

Eléphant du PHP | 103 Messages

18 janv. 2014, 18:19

J'étais en train de faire cela avant que tu me le dise :
<?php
$postfields = array();
$postfields["action"] = "submit";
$postfields["PVlatitude"] = "43.558422";
$postfields["PVlongitude"] = "4.069032";
$postfields["pv_database"] = "PVGIS-CMSAF";
$postfields["pvtechchoice"] = "crystSi";
$postfields["peakpower"] = "3";
$postfields["efficiency"] = "14";
$postfields["mountingplace"] = "building";
$postfields["PVangle"] = "30";
$postfields["PVaspectangle"] = "30";
$postfields["outputchoicebuttons"] = "window";
$postfields["regionname"] = "europe";
$postfields["language"] = "en_en";

$url = "http://goo.gl/cjwe8E";
$useragent = "Mozilla/5.0";
$referer = $url; 
 
//Initialise une session CURL
$ch = curl_init($url);
//CURL options
curl_setopt($ch, CURLOPT_POST, 1);
//On poste les données du tableau $postfields
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
//On définit un useragent ici Mozilla/5.0
//souvent les bots se font passés pour googlebot ce qui finalement est stupide
//On passe donc un useragent banal
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
//On passe un referrer ici on passe la même page $url
curl_setopt($ch, CURLOPT_REFERER, $referer);
//on récupère le contenu de la page de résultat de la soumission dans une chaine
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// en cas de redirection (facultatif ici)
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//Page de résultats et fermeture de session
$result = curl_exec($ch);
curl_close($ch);
 
//on peut faire un echo du résultat obtenu
echo $result;
?>
Ca n'affiche rien non plus pour le moment, ainsi :
-> Soit il me manque un input ou j'ai une erreur mais je pense qu'il me ferais une erreur dans ce cas comme quand je ne garde que le submit.
-> Soit il y a une sorte de conflit.
-> Soit j'ai un autres blocage car je ne satisfait pas à un javascript quelconque.

Je continue à creuser mais suis ouvert à toute aide charitable!!!
Modifié en dernier par josse34 le 18 janv. 2014, 20:09, modifié 3 fois.

Eléphant du PHP | 116 Messages

18 janv. 2014, 18:22

Il te manque pas au moins outputchoicebuttons ?
@+,
Computarelier

Eléphant du PHP | 103 Messages

18 janv. 2014, 18:24

Non, je l'ai mis en Window : $postfields["outputchoicebuttons"] = "window"; comme d'autres que j'ai fixé à une certaine valeur pour mes tests :
$postfields["action"] = "submit";
$postfields["PVlatitude"] = "43.558422";
$postfields["PVlongitude"] = "4.069032";
$postfields["pv_database"] = "PVGIS-CMSAF";
$postfields["pvtechchoice"] = "crystSi";
$postfields["peakpower"] = "3";
$postfields["efficiency"] = "14";
$postfields["mountingplace"] = "building";
$postfields["PVangle"] = "30";
$postfields["PVaspectangle"] = "30";
$postfields["outputchoicebuttons"] = "window";
$postfields["regionname"] = "europe";
$postfields["language"] = "en_en";

Eléphant du PHP | 116 Messages

18 janv. 2014, 18:26

Tu as essayé avec d'autres options ? Genre csv ?

Un var_dump sur ton résultat te donne quoi ?
@+,
Computarelier

Eléphant du PHP | 103 Messages

18 janv. 2014, 19:06

Alors, déjà comme conseillé sur http://www.seoblackout.com/2008/02/13/s ... ormulaire/ , j'ai téléchargé l’excellent plugin webdeveloper et voila ce que ca me sort correctement remplis :
PVREST.jpg
à savoir ce tableau la en pdf : http://cjoint.com/?3AssS5H046C

On reprends le php avec CURL, et CA FONCTIONNE malgré un souci de fichier, j'obtiens l'erreur Warning: the system could not read the horizon file supplied, using standard horizon, en fait je fais passer $postfields["horizonfile"] = ""; pour un field alors qu'il faudrais lui dire que c'est un fichier et qu'il n'y en a pas! Comment faire? CurlFile?

Reste maintenant à recuperer les données qui m'interresse dans 12 lignes comme celle ci :
<tr> <td> Jan </td><td align="right">6.39</td><td align="right">198</td><td align="right">2.77</td><td align="right">85.9</td></tr>
Il n'existe pas une sorte de Explode pour ne sortir que les chiffres dans cette ligne sachant que Jan sera toujours le même?
Merci!
<?php
$postfields = array();
$postfields["action"] = "submit";
$postfields["MAX_FILE_SIZE"] = "10000";
$postfields["pv_database"] = "PVGIS-CMSAF";
$postfields["pvtechchoice"] = "crystSi";
$postfields["peakpower"] = "3";
$postfields["efficiency"] = "14";
$postfields["mountingplace"] = "building";
$postfields["angle"] = "35";
$postfields["aspectangle"] = "10";
$postfields["horizonfile"] = "";
$postfields["outputchoicebuttons"] = "window";
$postfields["sbutton"] = "Calculate";
$postfields["outputformatchoice"] = "window";
$postfields["optimalchoice"] = "";
$postfields["latitude"] = "43.570274";
$postfields["longitude"] = "4.064435";
$postfields["regionname"] = "europe";
$postfields["language"] = "en_en";   


$url = "http://goo.gl/cjwe8E";
$useragent = "Mozilla/5.0";
$referer = $url; 
 
//Initialise une session CURL
$ch = curl_init($url);
//CURL options
curl_setopt($ch, CURLOPT_POST, 1);
//On poste les données du tableau $postfields
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
//On définit un useragent ici Mozilla/5.0
//souvent les bots se font passés pour googlebot ce qui finalement est stupide
//On passe donc un useragent banal
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
//On passe un referrer ici on passe la même page $url
curl_setopt($ch, CURLOPT_REFERER, $referer);
//on récupère le contenu de la page de résultat de la soumission dans une chaine
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// en cas de redirection (facultatif ici)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//Page de résultats et fermeture de session
$result = curl_exec($ch);
curl_close($ch);
 
//on peut faire un echo du résultat obtenu
echo $result;
//var_dump($result) 
?>
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Eléphant du PHP | 116 Messages

18 janv. 2014, 20:46

C'est super, ça prend bien forme :-)

Maintenant va voir du côté de : http://us3.php.net/manual/fr/class.domdocument.php et http://simplehtmldom.sourceforge.net/

Bon courage
@+,
Computarelier

Eléphant du PHP | 103 Messages

18 janv. 2014, 21:15

Désolé, je n'y parviens pas, cela ne m'affiche rien avec ce genre de choses :
include_once('simple_html_dom.php');
//$html = str_get_html($result);
//$html->find('Jan', 0)->innertext = 'YESSSSSSSSSSSS';
//echo $html; 
echo file_get_html($result)->plaintext; 

Eléphant du PHP | 116 Messages

18 janv. 2014, 22:40

Et que te dit un var_dump ?
@+,
Computarelier

Eléphant du PHP | 103 Messages

18 janv. 2014, 23:37

Bon ben grâce à computarelier , c'est résolu, un grand merci à toi!
Il suffit de remplacer "window" par "csv" et rajouter :
/$lignes = explode("\n",$result);
if(!is_array($lignes)) { die('Ma variable résultat n a pas renvoyé un tableau exploitable'); }
$lignes8 = explode("\t",$lignes[8]);
echo trim($lignes8[2]);  
Merci!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Bye