Использование PHP & Curl для входа на мою веб-страницу

Я пытаюсь войти в свой аккаунт пользователя на сайте, который я использую для загрузки файлов, поэтому я могу автоматически захватить файл без необходимости посещения сайта.

Это форма:

 <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>

Вот PHP-версия, полученная до сих пор.

<?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);
?>

Я делаю что-то неправильно? Он просто отображает веб-сайт в настоящий момент, но не регистрирует меня. Я никогда не использовал Curl раньше.

Спасибо

Ответы

Ответ 1

Вам следует отправить через POST все данные, которые отправляет форма оргинала. Таким образом, вам не хватает autologin=1&userlogin=Login в $postdata.

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

Ответ 2

Вероятно, вам необходимо установить опции COOKIESESSION и COOKIEJAR для сохранения сеанса и выполнить другой запрос:

//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);
}

Ответ 3

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

измените на:

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

А также у вас есть это вот так?

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

Также добавьте этот curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);.

А также это может помочь:

$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);

Ответ 4

Страница может проверить, была ли установлена ​​функция userlogin (кнопка отправки), прежде чем она проверяет информацию пользователя.

Возможно, стоит попробовать следующее:

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

Ответ 5

Когда вы запрашиваете страницу на сайте, с которым вы ранее вошли в систему, вам нужно использовать

curl_setopt ($ch, CURLOPT_COOKIEFILE, $Cookie); 

Затем вы должны проверить вывод, чтобы определить, если вы в настоящее время вошли в систему (каждый сайт будет отличаться, но обычно, если форма для входа недоступна или доступна кнопка выхода из системы, вы вошли в систему.

Если вы не вошли в систему, то вы не включаете CURLOPT_COOKIEFILE, вы входите в следующую строку:

curl_setopt ($ch, CURLOPT_COOKIEJAR, $Cookie);

Я создал две разные, но похожие функции. CurlPage() и CurlLogin(). Единственное отличие: CurlPage() имеет параметр COOKIEFILE, CurlLogin() имеет параметр COOKIEJAR плюс следующие две строки:

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

Затем я вызываю следующие функции:

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

Помните, что на некоторых сайтах требуется несколько страниц входа. Сначала вы отправляете форму, затем вам нужно ввести код подтверждения или нажать кнопку или что-то еще. Если в этом случае ваша функция входа в систему, возможно, должна будет прочитать источник, предпримите дополнительные действия до того, как вы войдете в систему, и созданный файл cookie будет создан и сохранен в cookie.txt

Ответ 6

Используйте безгласный браузер - действительно масштабируемое решение. (Скажите, работает ли он с учетной записью google:)

Что я сделал (полезный для себя также:)

  • Установить композитор https://getcomposer.org (если не установлен) Убедитесь, что он установлен, введя в командной строке

         composer -V
    
  • Создайте папку, скажем, TryGoutte где-нибудь в каталоге вашего веб-сервера

  • Создайте файл composer.json(просто для тестирования композитора):

     {
       "require": {
           "monolog/monolog": "1.0.*"
        }
     } 
    
  • Введите "установка композитора". Он должен установить монолог.

  • Введите "composer require fabpot/goutte". Он должен установить все пакеты для "goutte" https://github.com/FriendsOfPHP/Goutte (произносится gu: t, как и загрузка)

  • Затем создайте файл, скажем try-goutte.php в 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());
    
    ?>
    

Наслаждайтесь и читайте дальше!

UPDATE: здесь используется http://lycenok.com/site-login/programmatic-site-login.php, чтобы проверить, работает ли решение для вас