Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Logowanie poprzez curl
Forum PHP.pl > Forum > PHP
KuKa
Hej, mam do napisania skrypt pobierający ceny z pewnej hurtowni.
Muszę się zalogować, przejść na konkretną podstronę i pobrać cenę.
I problem mam taki, że skrypt działa na localhoscie ale po przeniesieniu na serwer dedykowany logowanie już nie działa(przechodzę normalnie na podstrony lecz jestem nie zalogowany).
W czym może być problem?
Na serwerze jest curl i działa logowanie na inne strony.
Próbowałem także logować się korzystając z proxy lecz taka sama historia.

  1. $usecookie = 'cookie.txt';
  2.  
  3. $handle = curl_init();
  4.  
  5. curl_setopt($handle, CURLOPT_URL, "http://jakisurlDoZalogowania.pl");
  6.  
  7. curl_setopt($handle, CURLOPT_HEADER, 1);
  8. curl_setopt($handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3");
  9. curl_setopt($handle, CURLOPT_REFERER, "http://jakisurl.pl" );
  10. curl_setopt($handle, CURLOPT_COOKIEJAR, $usecookie);
  11. curl_setopt($handle, CURLOPT_COOKIEFILE, $usecookie);
  12. curl_setopt($handle, CURLOPT_RETURNTRANSFER,1);
  13. curl_setopt($handle, CURLOPT_FOLLOWLOCATION,1);
  14. curl_setopt($handle, CURLOPT_POST,1);
  15. curl_setopt($handle, CURLOPT_POSTFIELDS,"dane do logowania");
  16.  
  17. if($result = curl_exec ($handle)){
  18. curl_setopt($handle, CURLOPT_POST,0);
  19. curl_setopt($handle, CURLOPT_COOKIEJAR, $usecookie);
  20. curl_setopt($handle, CURLOPT_COOKIEFILE, $usecookie);
  21. curl_setopt($handle, CURLOPT_URL, "konkrenty url");
  22. curl_setopt($handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3");
  23. curl_setopt($handle, CURLOPT_REFERER, "http://jakisurlDoZalogowania.pl" );
  24. curl_setopt($handle,CURLOPT_RETURNTRANSFER,1);
  25. curl_setopt($handle,CURLOPT_FOLLOWLOCATION,1);
  26.  
  27. $result = curl_exec ($handle);
  28. echo $result;
  29. };
Sephirus
Sprawdzałeś czy pliki z COOKIE się tworzą?
KuKa
Tak, tworzą się. Prawa plików są poprawne.
"I zauważyłem że nawet się zaloguję, lecz jak wchodzę na drugi url to już jestem wylogowany." - tylko raz tak udało mi się zalogować, teraz znowu nie mogę :/
Sephirus
czy na serwerze masz ustawiony "OPEN BASEDIR"? Bo spotkałem się z problemem takim, że jak jest włączony to nie działa w CURL'u FOLLOWLOCATION - a może być wymagane przez serwer na który się logujesz?

W razie co możesz łatwo i szybko sprawdzić czy to działa tworząc skrypt w którym dajesz przekierowanie na drugi z jakąś treścią. Zobacz co Ci curl zwróci - treść 1szego czy drugiego skryptu...

Ogólnie kod jest ok - błędów nie widzę zresztą pisałeś, że to działa na localu :/ hmmm...
KuKa
Cytat(Sephirus @ 4.11.2011, 11:51:23 ) *
czy na serwerze masz ustawiony "OPEN BASEDIR"? Bo spotkałem się z problemem takim, że jak jest włączony to nie działa w CURL'u FOLLOWLOCATION - a może być wymagane przez serwer na który się logujesz?

W razie co możesz łatwo i szybko sprawdzić czy to działa tworząc skrypt w którym dajesz przekierowanie na drugi z jakąś treścią. Zobacz co Ci curl zwróci - treść 1szego czy drugiego skryptu...


sprawdziłem i działa z przekierowaniem :/

Jest możliwość aby serwer do którego się próbuje połączyć, blokował takie połączanie z curla?
Bo już nie wiem co jest źle, w czym tkwi problem.
Sephirus
Jest możliwe, że serwer z którego robisz requesta jest zbanowany przez ten, na ktory chcesz się zalogować - ale wtedy objawiało by się to pustym ciągiem zwróconym przez curl'a, lub błędem typu timeout (ewentualnie jakieś 403)...

W tym przypadku nie sądzę by to było to - ale z drugiej strony też nie wiem co to może być :/ Jeżeli ten twój dedyk jest na OVH to mógł by być zbanowany ale tak jak pisałem wyżej...

Masz jeszcze jedną opcję - pośrednią ale warto spróbować:

Czy na tym serwerze, na którym się logujesz możliwe jest zapamiętywanie hasła albo coś takiego? Może ustawiają na stałe jakieś ciasteczko autoryzacji bez związku z sesją (często tak jest) wówczas wystarczyło by wywołać stronę CURL'em z ustawionym tylko takim ciasteczkiem i zobaczyć czy to coś da - ale to już bez podawania COOKIE_FILE i COOKIE_JAR do CURL - tylko zwykłe "CURLOPT_COOKIE" i wartość typu "auth=123456789abcdefghij"

Zobacz może tak się to da obejść.

Sprawdź też co w ogóle siedzi w tym pliku z ciastkami - możesz też spróbować olać w drugim zapytaniu (po zalogowaniu) nadpisywanie tego pliku z ciasteczkami (czyli bez COOKIE_JAR)...

DODATKOWO - w celu debugu możesz porównać nagłówki odpowiedzi uzyskiwane z tego serwera na który się logujesz na localu i dedyku - jak dasz CURLOPT_HEADER na 1 i CURLOPT_NOBODY na 1 to wyrzuci Ci same nagłówki - zobacz czym się różnią - może mają jakieś jeszcze inne zabezpieczenie i trzeba jeszcze coś pododawać do CURL'a - możesz nawet wrzuć kod nagłówków tutaj to zerknę
KuKa
Nie ma możliwości zapamiętania logowania.

Nagłówki z localhosta:
  1. HTTP/1.1 200 OK
  2. Date: Fri, 04 Nov 2011 13:10:56 GMT
  3. Server: Apache/2.2.3 (CentOS)
  4. X-Powered-By: PHP/5.1.6
  5. Set-Cookie: ec_sessid=ce28ca122db38d4f2feb29e26e7a7e16; path=/
  6. Expires: Thu, 19 Nov 1981 08:52:00 GMT
  7. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  8. Pragma: no-cache
  9. Connection: close
  10. Transfer-Encoding: chunked
  11. Content-Type: text/html; charset=iso-8859-2

Z serwera:
  1. HTTP/1.1 200 OK
  2. Date: Fri, 04 Nov 2011 13:07:42 GMT
  3. Server: Apache/2.2.3 (CentOS)
  4. X-Powered-By: PHP/5.1.6
  5. Set-Cookie: session_start=1; path=/
  6. Set-Cookie: ec_sessid=29e8fcc915a86abff019e8ba4f422052; path=/
  7. Expires: Thu, 19 Nov 1981 08:52:00 GMT
  8. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  9. Pragma: no-cache
  10. Set-Cookie: ip_checked=1
  11. Connection: close
  12. Transfer-Encoding: chunked
  13. Content-Type: text/html; charset=iso-8859-2
Sephirus
  1. HTTP/1.1 200 OK
  2. Date: Fri, 04 Nov 2011 13:07:42 GMT
  3. Server: Apache/2.2.3 (CentOS)
  4. X-Powered-By: PHP/5.1.6
  5.  
  6. // TU COŚ JEST
  7. Set-Cookie: session_start=1; path=/
  8.  
  9. Set-Cookie: ec_sessid=29e8fcc915a86abff019e8ba4f422052; path=/
  10. Expires: Thu, 19 Nov 1981 08:52:00 GMT
  11. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  12. Pragma: no-cache
  13.  
  14. // TU COŚ JEST
  15. Set-Cookie: ip_checked=1
  16.  
  17. Connection: close
  18. Transfer-Encoding: chunked
  19. Content-Type: text/html; charset=iso-8859-2


Jak widać coś tu jest... Tylko nie za bardzo wiem o co może tu chodzić :|

Ale ok załóżmy, że to sprawdzimy - jak:

odpal na serwerze skrypt jeszcze raz z nagłówkami żebyś miał identyfikator sesji ( Set-Cookie: ec_sessid=29e8fcc915a86abff019e8ba4f422052; )

Skopiuj go, i odpal skrypt już bez opcji logowania (bezpośrednio do strony) i zamiast COOKIE_FILE i COOKIE_JAR :

'CURLOPT_COOKIE', 'ec_sessid=[to wyciągnięte id]&session_start=1&ip_checked=1'

I zobacz co Ci curl zwróci. Najlepiej zrób tak żeby mieć wszystkie opcje możliwe czyli:

(wszędzie dajesz to id sesji)
1. z session_start bez ip_checked
2. bezz session_start z ip_checked
3. bez jednego i drugiego

I sprawdź czy w którymś przypadku loguje wink.gif jak tak daj znac
KuKa
Nic nie pomaga.

Zrobiłem też tak: zalogowałem się normalnie do hurtowni i połączyłem się curlem wysyłając numer cookisa jaki serwer podał mi podczas logowania i też mi pokazuję że jestem niezalogowany. A normalnie jak poruszając się po stronie jestem zalogowany.
Sephirus
No to może faktycznie serwer w jakimś stopniu blokuje twojego dedyka...

Ostatnia myśl jaka mi przychodzi do głowy to zabezpieczenie przed multilogowaniem - to znaczy, że może mają systemik, który nie pozwala się zalogować z jakiegoś IP jeżeli jest aktualnie zalogowany ktoś z innego...

hmmm. sad.gif
KuKa
Też myślałem o multilogowaniem lecz jakby takie coś mieli, nie mógłbym się zalogować na localhoscie.
Coś pokombinuje jeszcze.

Dzięki za pomoc.
Fifi209
Ścieżkę do plików cookie podaj pełną ;]

możesz spróbować np.
dirname(__FILE__).'/cookie.txt'
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.