Использование 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 ive.

 <?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 раньше.

благодаря

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

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

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

Вероятно, вам нужно установить опции 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); } 
 $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); 

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

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

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

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

 curl_setopt ($ch, CURLOPT_COOKIEFILE, $Cookie); 

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

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

 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

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

То, что я сделал (полезно для себя, а также 🙂

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

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

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

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

  5. Тип «композитор требует fabpot / goutte». Он должен установить все пакеты для «goutte» https://github.com/FriendsOfPHP/Goutte (произносится как gu: t, например boot)

  6. Затем создайте файл, скажем 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, чтобы проверить, работает ли решение для вас