Lors d'une première demande, un identifiant de session est créé. Le même identifiant de session est appliqué à la deuxième demande.
Dans ma troisième demande, un nouvel identifiant de session est créé pour une connexion réussie, mais lorsque j'imprime l'identifiant de session pour la troisième demande, la réponse donne un identifiant de session différent . Pourquoi cela arrive-t-il? Et je veux envoyer l'identifiant de session que j'ai obtenu dans la 3ème réponse à la 4ème?
Comment y parvenir?
Voici mon code:
<?php $fp = fopen("cookies.txt", "w"); fclose($fp); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_HEADER => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin', CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_COOKIESESSION => TRUE, CURLOPT_COOKIEFILE => "cookies.txt", CURLOPT_COOKIEJAR => "cookies.txt", CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_AUTOREFERER => TRUE, )); $result = curl_exec($curl); if (!curl_exec($curl)) { die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl)); } echo "<h2>Response 1</h2>"; print_r($result); $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); print_r($cookies); // ####################################################################################### $fields = array( 'userName' => 'dadmin', 'logonButton' => 'Logon', 'actionStep' => 2, ); $fields_string = http_build_query($fields); curl_setopt_array($curl, array( CURLOPT_HEADER => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin', CURLOPT_POST => TRUE, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_POSTFIELDS => $fields_string, CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_COOKIESESSION => TRUE, CURLOPT_AUTOREFERER => TRUE, )); $resp = curl_exec($curl); if (!curl_exec($curl)) { die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl)); } echo "<h2>Response 2</h2>"; print_r($resp); $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); print_r($cookies); // ################################################################################################ $fields = array( 'userName' => urlencode('dadmin') , 'pa55word' => urlencode('dadmin01') , 'logonButton' => urlencode('Logon') , 'actionStep' => urlencode(3) , ); $fields_string = http_build_query($fields); curl_setopt_array($curl, array( CURLOPT_HEADER => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin', CURLOPT_POST => TRUE, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_POSTFIELDS => $fields_string, CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_COOKIESESSION => TRUE, CURLOPT_AUTOREFERER => TRUE, )); $response = curl_exec($curl); if (!curl_exec($curl)) { die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl)); } echo "<h2>Response 3</h2>"; print_r($response); echo "<br/>"; $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); print_r($cookies); // ###########Login Completed################## curl_setopt_array($curl, array( CURLOPT_COOKIESESSION => TRUE, CURLOPT_HEADER => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_URL => 'https://192.168.2.35/cgi-bin/msg/mango/admin/controller/SubscriberMgmt', CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_AUTOREFERER => TRUE, )); $result = curl_exec($curl); if (!curl_exec($curl)) { die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl)); } echo "<h2>Response 4</h2>"; print_r($result); echo "<br/>"; $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); print_r($cookies); exit; ?>
3 Réponses :
Vous devez spécifier le fichier cookie dans chaque requête, pas seulement dans la ou les deux premières:
$cookieFile = '/tmp/cookies.txt'; if (! is_readable($cookieFile) || ! is_writable($cookieFile)) { throw new \Exception( 'Cookiefile ' . $cookieFile . ' is not writable or readable.' ); }
Assurez-vous également que le fichier est réellement accessible en écriture:
CURLOPT_COOKIEFILE => "/tmp/cookies.txt", CURLOPT_COOKIEJAR => "/tmp/cookies.txt",
C'est très bien. En fait, dans la 3ème requête, j'obtiens de nouvelles sessions pour une connexion réussie donc cela génère de nouvelles sessions. J'ai besoin de porter cette session pour la 4ème demande. pas d'anciennes sessions. J'explique clairement dans l'image. Vérifiez s'il vous plaît
@Siddharthaesunuri vous devez spécifier le fichier cookie dans chaque requête! Si vous souhaitez réinitialiser les cookies, vous tronquerez le fichier mais vous devez toujours indiquer à curl où stocker les cookies.
D'accord, Dan selon votre suggestion. J'ai écrit cette ligne file_put_contents ("cookies.txt", ""); avant la troisième demande. Mais quand même, j'obtiens la même chose.
Il convient de noter que les options CURLOPT_COOKIEFILE
/ CURLOPT_COOKIEJAR
doivent être définies avec la valeur de chemin absolute . "cookie.txt"
est un chemin relatif .
J'ai défini le chemin Absolute , mais la même chose ne fonctionne pas @hindmost
@Siddharthaesunuri Mettez à jour le code de votre message avec celui que vous avez essayé actuellement.
J'ai remplacé "cookies.txt" par "\ cookies.txt" partout @hindmost
@Siddharthaesunuri Voir mon commentaire sous la question. BTW "\ cookies.txt"
n'est pas non plus un chemin absolu .
Si ce n'est pas correct. Alors, comment fonctionnent les sessions pour ma 2ème et 3ème demande? @le plus en arrière
CURLOPT_COOKIESESSION => TRUE,
il n'enregistre qu'un seul cookie, pas de le réécrire $ fcookies = __DIR __. "/ cookies.txt";
nom du fichier init CURLOPT_COOKIEFILE => $ fcookies, CURLOPT_COOKIEJAR => $ fcookies,
Analyse de l'étape 3
wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step1.txt --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin cat cookie.txt wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step2.txt --post-data "userName=dadmin&logonButton=Logon&actionStep=2" --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin cat cookie.txt wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step3.txt --post-data "userName=dadmin&pa55word=dadmin01&logonButton=Logon&actionStep=3" --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin cat cookie.txt wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step4.txt --post-data "motdContinue=Continue&actionStep=motdContinue" --no-check-certificate https://192.168.2.35/cgi-bin/common/loginMotd/w_motd cat cookie.txt wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step5.txt --no-check-certificate https://192.168.2.35/cgi-bin/msg/mango/admin/controller/SubscriberMgmt cat cookie.txt
Wget way
echo "<h2>Response 3</h2>"; print_r($response); $new_sid = explode("sessionId=",$response); $new_sid = explode(";",$new_sid[1]); $new_sid = $new_sid[0]; file_put_contents($fcookies,"192.168.2.35 FALSE / TRUE 0 sessionId ".$new_sid); echo "<br/>"; $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); print_r($cookies); $curl = curl_init();
J'ai essayé ce que vous avez suggéré, mais le même résultat que j'obtiens @FAEWZX
analyse simple de $ response
à l'étape 3 et relancez curl. Ajouter à la sortie de texte de publication - 3 étapes.
Je ne t'ai pas compris @FAEWZX
Selon votre suggestion, j'ai modifié le code, mais j'obtiens le même résultat. Voici mon dernier code selon votre suggestion pastebin.com/YLw6eX1N @FAEWZX
À l'étape 3, cliquez sur le bouton "Continuer", veuillez l'afficher en HTML. Quel est le même résultat?
Oui, il donne une nouvelle sessionId
continuons cette discussion dans le chat .
supprimer tout CURLOPT_COOKIESESSION => TRUE, il n'enregistre qu'un seul cookie, ne le réécrit pas
- CURLOPT_COOKIESESSION ne sauvegarde rien, il supprime tous les cookies. (mais vous avez raison, il devrait se débarrasser de l'option)
il devrait en fait être $ fcookies = __DIR __. DIRECTORY_SEPARATOR. "cookies.txt";
- le code actuel n'est valide que pour les systèmes linux / bsd / macos, il n'est pas valide pour les systèmes Windows. mais avec DIRECTORY_SEPARATOR, c'est valable pour tous les systèmes
parce que vous dites à plusieurs reprises à curl de supprimer tous les cookies de session existants,
voici la documentation php sur CURLOPT_COOKIESESSION
:
TRUE pour marquer cela comme une nouvelle "session" de cookie. Cela forcera libcurl à ignorer tous les cookies qu'elle est sur le point de charger qui sont des "cookies de session" de la session précédente. Par défaut, libcurl stocke et charge toujours tous les cookies, qu'ils soient des cookies de session ou non. Les cookies de session sont des cookies sans date d'expiration et ils sont censés être vivants et existants pour cette "session" uniquement.
btw vous faites cela mal:
function http_build_query(array $data):string{ $ret=''; foreach($data as $key=>$val){ $ret.=urlencode($key)."=".urlencode($data)."&"; } $ret=substr($ret,0,-1); return $ret; }
ici le nom d'utilisateur / mot de passe / etc sera codé en double url. le code doit lire:
$fields = http_build_query(array( 'userName' => 'dadmin', 'pa55word' => 'dadmin01', 'logonButton' => 'Logon', 'actionStep' => 3, ));
parce que http_build_query DOES url-encoding, http_build_query est pratiquement implémenté comme ceci:
$fields = array( 'userName' => urlencode('dadmin') , 'pa55word' => urlencode('dadmin01') , 'logonButton' => urlencode('Logon') , 'actionStep' => urlencode(3) , ); $fields_string = http_build_query($fields);
@Siddharthaesunuri, le site Web renomme probablement le cookie pour vous. activez CURLOPT_VERBOSE et enregistrez la sortie stderr pour le découvrir.
Veuillez mettre à jour votre message avec le dernier code que vous avez utilisé.
Ici pastebin.com/YLw6eX1N @hindmost