web-dev-qa-db-fra.com

En utilisant PHP & Curl pour vous connecter à mon site Web

J'essaie de me connecter à mon compte utilisateur sur un site que j'utilise pour télécharger des fichiers afin de pouvoir récupérer automatiquement le fichier sans que je doive visiter le site.

C'est la forme:

 <form method='post' action='/news.php'>
 <div>
             Username: <input class='tbox' type='text'     name='username' size='15' value='' maxlength='20' />&nbsp;&nbsp;
             Password: <input class='tbox' type='password' name='userpass' size='15' value='' maxlength='20' />&nbsp;&nbsp;
             <input type='hidden' name='autologin' value='1' />
             <input class='button' type='submit' name='userlogin' value='Login' />
 </div>
 </form>

Voici le PHP que ive a eu jusqu'à présent.

<?php
$username="my_user"; 
$password="my_passs"; 
$url="the_url"; 
$cookie="cookie.txt"; 

$postdata = "username=".$username."&userpass=".$password; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch); 

echo $result;  
curl_close($ch);
?>

Est-ce que je fais quelque chose de mal? Il affiche simplement le site Web pour le moment mais ne me connecte pas. Je n’avais jamais utilisé Curl auparavant.

Merci

18
Exoon

Vous devez envoyer via POST toutes les données envoyées par le formulaire d'origine. Donc, il vous manque autologin=1&userlogin=Login dans votre $postdata.

$postdata = "username=$username&userpass=$password&autologin=1&userlogin=Login";
8
Carlos Campderrós

Vous devez probablement définir les options COOKIESESSION et COOKIEJAR pour conserver la session et effectuer une autre demande:

//initial request with login data

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp');  //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

//another request preserving the session

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}
11
$postdata = "username=".$username."&userpass=".$password"; 

changer à:

$postdata = "username=".$username."&userpass=".$password;

Et aussi avez-vous cela comme ça?

$url="http://www.yourdomain.com/news.php";

Ajoutez également cette curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);.

Et aussi cela peut aider:

$headers  = array();

$headers[] = 'application/xhtml+voice+xml;version=1.2, application/x-xhtml+voice+xml;version=1.2, text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1';
$headers[] = 'Connection: Keep-Alive';
$headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';

curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt ($ch, CURLOPT_HEADER, 1);
3
Legionar

La page peut vérifier si userlogin (le bouton d'envoi) a été défini avant de valider les informations de l'utilisateur.

Cela vaut peut-être la peine d'essayer ce qui suit:

$postdata = "username=".$username."&userpass=".$password . "&userlogin=Login"; 
1
Howatt

Lorsque vous demandez une page sur un site auquel vous vous êtes déjà connecté, vous devez utiliser

curl_setopt ($ch, CURLOPT_COOKIEFILE, $Cookie); 

Vous devez ensuite vérifier le résultat pour déterminer si vous êtes actuellement connecté (chaque site sera différent, mais généralement, si le formulaire de connexion n'est pas disponible ou qu'un bouton de déconnexion est disponible, vous êtes connecté.

Si vous n'êtes pas connecté, vous n'incluez pas CURLOPT_COOKIEFILE, vous insérez la ligne suivante:

curl_setopt ($ch, CURLOPT_COOKIEJAR, $Cookie);

J'ai créé 2 fonctions différentes mais similaires. CurlPage() et CurlLogin(). La seule différence est que CurlPage() a l'option COOKIEFILE, CurlLogin() a l'option COOKIEJAR plus les 2 lignes suivantes:

curl_setopt ($ch, CURLOPT_POSTFIELDS, $PostData);
curl_setopt ($ch, CURLOPT_POST, 1); 

J'appelle alors les fonctions comme ceci:

$Source = CurlPage($Url, $Cookie);
if (!CheckLoggedIn($Source))
{
    CurlLogin($LoginUrl, $Cookie, $PostDataArray);
    $Source = CurlPage($Url, $Cookie);
}

N'oubliez pas que certains sites nécessitent plusieurs pages de connexion. D'abord, vous soumettez un formulaire, vous devez ensuite entrer un code de vérification, ou cliquer sur un bouton, ou quelque chose du genre. Si tel est le cas, votre fonction de connexion devra éventuellement lire à la source des actions supplémentaires avant que vous ne soyez connecté et le cookie dont vous avez besoin est créé et stocké dans cookie.txt

0
lv2fly

Utilisez un navigateur sans tête - une solution réellement évolutive. (Dites-moi si cela fonctionne avec un compte Google :) 

Ce que j'ai fait (utile pour moi aussi :)

  1. Installez composer https://getcomposer.org (s'il n'est pas installé) Assurez-vous qu'il est installé en tapant dans la ligne de commande

         composer -V
    
  2. Créez un dossier, par exemple TryGoutte, quelque part dans le répertoire de votre serveur Web.

  3. Créez un fichier composer.json (juste pour tester le compositeur): 

     {
       "require": {
           "monolog/monolog": "1.0.*"
        }
     } 
    
  4. Tapez "composeur installer". Il faut installer monolog.

  5. Tapez "composer require fabpot/goutte". Il devrait installer tous les paquets pour "Goutte" https://github.com/FriendsOfPHP/Goutte

  6. Créez ensuite un fichier, par exemple try-goutte.php dans TryGoutte.

      <?php
    use Goutte\Client;
    use GuzzleHttp\Client as GuzzleClient;
    
    require 'vendor/autoload.php';
    
    $client = new \Goutte\Client();
    
    // Create and use a guzzle client instance that will time out after 90 seconds
    $guzzleClient = new \GuzzleHttp\Client(array(
    'timeout' => 90,
    // To overcome Curl SSL 60 error 
    // https://github.com/FriendsOfPHP/Goutte/issues/214
    'verify' => false,
    ));
    
    $client->setClient($guzzleClient);
    
    $crawler = $client->request('GET', 'https://github.com/');
    $crawler = $client->click($crawler->selectLink('Sign in')->link());
    $form = $crawler->selectButton('Sign in')->form();
    $crawler = $client->submit($form, array('login' => 'trygoutte', 'password' => 'trygoutte1'));
    
    print_r($crawler->text());
    
    ?>
    

Profitez et codez plus loin!

UPDATE: mis en œuvre ici http://lycenok.com/site-login/programmatic-site-login.php pour vérifier si la solution fonctionne pour vous

0
Eugene Lycenok