Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: cURL - problem z logowaniem na stronę
Forum PHP.pl > Forum > PHP
quak
Witam. Bardzo proszę o pomoc w rozwiązaniu mojego problemu. Postaram się wszystko wyjaśnić ale jakby co to proszę pytać. A więc chciałbym się zalogować za pomocą cURLa na pewną stronę www. Włączyłem Live HTTP headers i przechwyciłem to co wysyła przeglądarka przy logowaniu.
CODE
http://www.jakasstronka.pl/logowanie.php

POST /logowanie.php HTTP/1.1
Host: www.jakasstronka.pl
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.jakasstronka.pl/login.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
login=jakislogin&pass=jakieshaslo&submit=Zaloguj

HTTP/1.1 302 Moved Temporarily
Date: Sat, 19 Jun 2010 10:52:32 GMT
Server: Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8g
X-Powered-By: PHP/5.2.5-pl1-gentoo
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=1347fd201120ffc73dc1405074f99eae; path=/
Set-Cookie: PHPSESSID=1a70b7248455ae298b5ddbae80011f92; path=/
Location: index.php
Content-Length: 0
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/html
----------------------------------------------------------
http://www.jakasstronka.pl/index.php

GET /index.php HTTP/1.1
Host: www.jakasstronka.pl
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.jakasstronka.pl/login.php
Cookie: PHPSESSID=1a70b7248455ae298b5ddbae80011f92

HTTP/1.1 200 OK
Date: Sat, 19 Jun 2010 10:52:32 GMT
Server: Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8g
X-Powered-By: PHP/5.2.5-pl1-gentoo
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html


Przy okazji dlaczego są dwie różne wartości PHPSESSID? Po co jest ta pierwsza?
Ok nieważne, następnie stworzyłem taki pomocniczy plik t.php w którym jest:
  1. <?php
  2. $g = $_GET['ciacho'];
  3. echo $g;
  4. $ch = curl_init('http://jakasstronka.pl/index.php');
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  6. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)');
  7. curl_setopt($ch, CURLOPT_HEADER, 1);
  8. curl_setopt($ch, CURLOPT_COOKIE,'PHPSESSID='.$g);
  9. $odpowiedz = curl_exec($ch);
  10. echo $odpowiedz;
  11. curl_close($ch);
  12. ?>


I teraz tak: Po zalogowaniu się przez przeglądarkę i odczytaniu tej drugiej wartości PHPSESSID z Live HTTP headers, wywołałem w przeglądarce mój plik t.php z przekazaniem PHPSESSID czyli: http://localhost/q/t.php?ciacho=1a70b72484...b5ddbae80011f92 (w tym przypadku tak to wyglądało). No i wszystko ok, ukazała mi się stronka i byłem zalogowany, więc wymyśliłem, że napiszę sobie plik index.php:

  1. <?php
  2. function createPostString($aPostFields) {
  3. foreach ($aPostFields as $key => $value) {
  4. $aPostFields[$key] = urlencode($key) . '=' . urlencode($value);
  5. }
  6. return implode('&', $aPostFields);
  7. };
  8.  
  9.  
  10. $postfields['login']='jakislogin';
  11. $postfields['pass']='jakieshaslo';
  12. $postfields['submit']='Zaloguj';
  13. $ch = curl_init('http://jakasstrona.pl/logowanie.php');
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  15. curl_setopt($ch, CURLOPT_POSTFIELDS, createPostString($postfields));
  16. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)');
  17. curl_setopt($ch, CURLOPT_HEADER, 1);
  18. curl_setopt($ch, CURLOPT_NOBODY, 1);
  19. $naglowki = curl_exec($ch);
  20. echo $naglowki;
  21. $uciete = stristr($naglowki, 'phpsessid='); // ta i ponizsze linijki wyciagaja z naglowkow wlasnie ta druga wartosc PHPSESSID i zapisuja do zmiennej $ciastko
  22. $bez1znaku = substr($uciete, 1);
  23. $uciete2 = stristr($bez1znaku, 'phpsessid=');
  24. $ciastko = substr($uciete2, 10, 32);
  25. echo $ciastko;
  26. curl_close($ch);
  27. echo '<br><a href="http://localhost/q/t.php?ciacho='.$ciastko.'">t.php</a>'; //link do pliku t.php z przekazaniem ciastka
  28. ?>


Hmm i tu jest pies pogrzebany. Na pewno tu jest coś nie tak ale nie wiem co. Po kliknięciu na link nie jestem zalogowany. Męczę się z tym już naprawdę sporo czasu i proszę o pomoc bo mnie krew zalewa już.

Nie wiem czy to się komuś przyda, ale jak wejdę na mój index.php to źródło strony wygląda tak:
  1. HTTP/1.1 200 OK
  2. Date: Sat, 19 Jun 2010 11:17:44 GMT
  3. Server: Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8g
  4. X-Powered-By: PHP/5.2.5-pl1-gentoo
  5. Expires: Thu, 19 Nov 1981 08:52:00 GMT
  6. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  7. Pragma: no-cache
  8. Set-Cookie: PHPSESSID=dd3f054ce2cf2371cbd0971609911c56; path=/
  9. Set-Cookie: PHPSESSID=78a3e0a3d104885d011ebb741fbcab0e; path=/
  10. Content-Type: text/html
  11.  
  12. 78a3e0a3d104885d011ebb741fbcab0e<br><a href="http://localhost/q/t.php?ciacho=78a3e0a3d104885d011ebb741fbcab0e">t.php</a>


Z tego wynika, że dobrze zrobiłem wyodrębnienie tego drugiego PHPSESSID bo w linku jest to ładnie zawarte. Nie mam siły już do tego... Proszę pomóżcie sadsmiley02.gif
yevaud
z tego co pamietam CURLOPT_COOKIEJAR sprawi ze nie musisz bawic sie w reczne ustawianie ciastek, curl ustawi te ciastka ktore dostanie od serwera
wysylasz wtedy tylko tego posta ktorym chcesz sie logowac i wszystko powinienes miec done bez zadnych czarymary smile.gif
quak
Albo mi to nie działa albo nie wiem jak to zrobić sad.gif Można coś więcej o tych opcjach? Co to niby robi dokładnie? Bo na http://wortal.php.pl/wortal/artykuly/php/b...ol_http/ciastka jakoś skąpo jest to opisane.

EDIT: Ok jak dodaję takie coś:
Kod
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');

To w katalogu pojawia się plik cookies.txt w którym jest identyfikator sesji (tylko ten drugi) czyli niby ok ale jak ja mam użyć tego ciasteczka?
yevaud
po prostu za kazdym razem jak uzywasz curl dodawaj te opcje, i ciasteczko "uzyje sie samo" smile.gif
po logowaniu pusc urla i sprawdz czy strona wyglada jak po zalogowaniu - prawdopodobnie tak
quak
Nie działa. Szlak mnie trafia powoli bo nie mam pojęcia o co chodzi! sciana.gif

EDIT: Usunąłem to co zbędne i działa ohmy.gif Nie wiem o co chodziło tongue.gif W każdym razie dzięki za pomoc, pozdrawiam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.