Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP i curl - Logowanie
Forum PHP.pl > Forum > PHP
acztery
Hej,

Mam taki kłopot chcę się zalogować na stronę:

https://www.rebvoice.com/login/ przez CURL'a

robię to tak:

  1. $postfields='login[login]='.urlencode($login).'&login[password]='.urlencode($pass);
  2. $this->ch=curl_init();
  3. curl_setopt($this->ch, CURLOPT_URL, $this->url.'/login/');
  4. curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,1);
  5. curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  6. curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);
  7. curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
  8. curl_setopt($this->ch, CURLOPT_POST, 1);
  9. curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookiejar);
  10. curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postfields);
  11. curl_setopt($this->ch, CURLOPT_HEADER, 1);
  12. curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
  13. curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->timeout);
  14. $out=curl_exec($this->ch);


i nie działa

Wyśwela mi

Kod
HTTP/1.1 302 Found Date: Sat, 14 Jan 2012 19:18:23 GMT Server: Apache P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT" Set-Cookie: PHPSESSID=27v3oeg20qi58e7teafltcpk35; expires=Mon, 23-Apr-2012 19:18:23 GMT; path=/; HttpOnly 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 Location: https://www.voipdiscount.com/warning.html Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 HTTP/1.0 200 OK Date: Sat, 14 Jan 2012 19:18:24 GMT Server: Apache P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT" Set-Cookie: PHPSESSID=g97rbqv99pebsv3or9fo84ql10; expires=Mon, 23-Apr-2012 19:18:24 GMT; path=/; HttpOnly 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 Description: Free phone calls with VoipDiscount. Call your online friends for free as well as a special selection of popular international destinations. Keywords: free call, voip, download, cheap calls, free sms, discount voip Connection: close Content-Type: text/html; charset=utf-8


A ich system logowania już wyśwetla swój błąd.

"Sorry, but your session has already expired. Click here to go back and refresh the page again."

Co mam zrobić by to przeszło ma ktoś jakiś pomysł. może jakiś nagłówek.

Gdzie "$this->cookiejar" to:

  1. ...
  2. $this->cookiejar=realpath(dirname(__FILE__).'/../cookies').'/'.session_id().'.txt';
  3. ...
cycofiasz
Nie wysyłasz w post tokena który jest za pewne wymagany. Najpierw pobierz strone logowania, pobierz nazwe tokena oraz jego wartość i dopiero się zaloguj.
acztery
mam coś takiego


<input type="hidden" id="b0d1709ebd01f2b52b81dbee5fd85240" name="b0d1709ebd01f2b52b81dbee5fd85240" value="a7353be55a196843718a3f8ff691122d"/>


jak wysylam to to to samo i te dane w tym polu formularza się nie zmieniają..

przesyłane dane postem zmieniłem na:

  1. $postfields='b0d1709ebd01f2b52b81dbee5fd85240=a7353be55a196843718a3f8ff691122d&login[login]='.urlencode($login).'&login[password]='.urlencode($pass);
  2.  


i nic..


zastanawia mnie ten kawałek:

HttpOnly Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control

cycofiasz
Ale nie wklejaj tego tokena na stałe do skryptu tylko jak wcześniej pisałem "Najpierw pobierz strone logowania, pobierz nazwe tokena oraz jego wartość i dopiero się zaloguj." Oczywiście pobierz przez curla i wyciągnij token preg_match czy czymś innym
acztery
ten token jest cały czas taki sam .... odświeżam odświeżam i token się nie zmienia.... zobacz sobie kilka razy to się przekonasz.

mam na mysli to


<input type="hidden" id="b0d1709ebd01f2b52b81dbee5fd85240" name="b0d1709ebd01f2b52b81dbee5fd85240" value="a7353be55a196843718a3f8ff691122d"/>


caly czas tak samo wygląda na kazdej przegladarce..
cycofiasz
Zanim odpowiedziałem to się przekonałem i nie jest tak jak piszesz. Co więcej: napisałem skrypt któremu udało się zalogować.

  1. $src = my_curl('https://www.rebvoice.com/login','GET','',dirname(__FILE__).'/mycurl.txt','');
  2.  
  3. preg_match('#name="(.{32})" value="(.{32})"#siU',$src,$matches);
  4.  
  5. my_curl('https://www.rebvoice.com/login','POST','login%5Busername%5D=xxx&login%5Bpassword%5D=xxx&login%5Bremember_me%5D=checked&'.$matches[1].'='.$matches[2],dirname(__FILE__).'/mycurl.txt','DEBUG');



Ja to zrobiłem w oparciu o własną funkcję my_curl ale ona jest tylko nakładką na zwykłego curla więc rozpisz to po swojemu ale trzymaj się tego schematu
acztery
o prawie działa:) super

mam tak

  1.  
  2. $this->ch1=curl_init();
  3. curl_setopt($this->ch1, CURLOPT_URL, $this->url.'/login/');
  4. curl_setopt($this->ch1, CURLOPT_RETURNTRANSFER,1);
  5. curl_setopt($this->ch1, CURLOPT_SSL_VERIFYPEER, FALSE);
  6. curl_setopt($this->ch1, CURLOPT_AUTOREFERER, true);
  7. curl_setopt($this->ch1, CURLOPT_FOLLOWLOCATION, true);
  8. curl_setopt($this->ch1, CURLOPT_HEADER, 1);
  9. curl_setopt($this->ch1, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
  10. curl_setopt($this->ch1, CURLOPT_TIMEOUT, $this->timeout);
  11. $out2=curl_exec($this->ch1);
  12.  
  13. preg_match('#name="(.{32})" value="(.{32})"#siU',$out2,$matches);
  14.  
  15.  
  16.  
  17. $postfields='login%5Busername%5D='.urlencode($login).'&login%5Bpassword%5D='.urlencode($pass).'&'.$matches[1].'='.$matches[2];
  18.  
  19.  
  20. echo $postfields;
  21.  
  22. $this->ch=curl_init();
  23. curl_setopt($this->ch, CURLOPT_URL, $this->url.'/login/');
  24. curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,1);
  25. curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  26. curl_setopt($this->ch, CURLOPT_AUTOREFERER, true);
  27. curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
  28. curl_setopt($this->ch, CURLOPT_POST, 1);
  29. curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postfields);
  30. curl_setopt($this->ch, CURLOPT_HEADER, 1);
  31. curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
  32. curl_setopt($this->ch, CURLOPT_TIMEOUT, $this->timeout);
  33. $out=curl_exec($this->ch);
  34. //$this->parse_response($out);
  35.  
  36. echo $out;
  37.  


z tym że w zmiennej $out w przypadku złego komunikatu powinno pisać Incorrect Username or Password. a nie pisze. jeszcze chyba czegoś tam brakuję jak zrobisz print_r(wynik_currla) to ma tam taki komunikat?
cycofiasz
Nie obsługujesz w swoim skrypcie ciasteczek. Co do komunikatu to u mnie jest widoczny
acztery
dodalem cos takiego curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookiejar);

gdzie

cookiejar to

$this->cookiejar=realpath(dirname(__FILE__).'/../cookies').'/'.session_id().'.txt';

Ps

to tez nie działa

curl_setopt($this->ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
curl_setopt($this->ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');

cycofiasz mozesz mi powiedzieć

1) wysyłasz jakieś nagłówek
2) albo useragent?

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.