Mam taki problem, że loguję się pierw na pewną stronę za pośrednictwem CURLa. Logowanie przebiega OK, ciasteczka są zapisywane i mogę dalej krążyć po tej stronie jako zalogowany (czyli trzyma sesje, wszystko jest jak trzeba).

Następnie próbuję wykonać pewną operację, którą normalnie wykonuje się poprzez formularz. Sprawa wygląda tak, że po naciśnięciu submita odpalany jest kod javascript, który przekierowuje do pliku .php i odpowiedź printuje na stronie.
Jak to robię normalnie na tej stronie z poziomu użytkownika to wszystko jest OK. Uruchomiłem sobie firebuga i przepisałem wszystkie nagłówki, jakie są wysyłane przez przeglądarkę w tym całym procesie, aby zrobić to samo poprzez CURLa.

Mój kod prezentuje się następująco:

  1. $post = 'post_id=1090456&comments=true&name=moj_nick&mail=&editor_mode=&skin=styl_2014';
  2.  
  3. $c = curl_init();
  4. curl_setopt($c, CURLOPT_URL, 'http://www.strona.pl/engine/ajax/file.php');
  5. curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0');
  6. curl_setopt($c, CURLOPT_HTTPHEADER, array(
  7. "Accept" => "*/*",
  8. 'Accept-Encoding' => 'gzip, deflate',
  9. 'Accept-Language' => 'pl,en-US;q=0.7,en;q=0.3',
  10. 'Cache-Control' => 'no-cache',
  11. 'Connection' => 'keep-alive',
  12. 'Content-Length' => '175',
  13. 'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8',
  14. 'Host' => 'www.strona.pl',
  15. 'Pragma' => 'no-cache',
  16. 'X-Requested-With' => 'XMLHttpRequest'
  17. )
  18. );
  19. curl_setopt($c, CURLOPT_POST, true);
  20. curl_setopt($c, CURLOPT_POSTFIELDS, $post);
  21. curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
  22. curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
  23. curl_setopt($c, CURLOPT_REFERER, 'http://www.strona.pl/');
  24. curl_setopt($c, CURLOPT_COOKIEFILE, 'cookies.txt');
  25. curl_setopt($c, CURLOPT_COOKIEJAR, 'cookies.txt');
  26. curl_setopt($c, CURLOPT_HEADER, true);
  27. $p = curl_exec($c);
  28. curl_close($c);


Przepisałem wszystkie nagłówki, mimo to strona wie, że żądanie nie jest wykonywane przez stronę. Pomyślałem więc o ciasteczkach, wręcz byłem pewien, że tu leży problem bo jak napisałem wyżej - nie wszystkie ciasteczka są tworzone przy użyciu curla (okazało się, że to javascript tworzy te pozostałe, tak jak napisałeś).

Próbowałem na tej stronie usuwać po jednym ciastku i sprawdzałem kiedy strona pokaże błąd. Okazuje się, że strona normalnie działa, jedyne ciastko jakie jest potrzebne podczas tego procesu to PHPSESSID (czyli musze być po prostu zalogowany), nic więcej. Jak wiadomo, to ciasteczko mam i CURL je ładnie tworzy i trzyma u siebie w plikach.

Nie mam pojęcia skąd ta strona "wie", że próbuję się dostać z zewnątrz na nią. Przepisałem wszystkie headery (nagłówki), jak leci, z góry na dół, poza user-agent, referer i cookies bo to zapisałem w postaci zmiennych:

  1. curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0');
  2. curl_setopt($c, CURLOPT_REFERER, 'http://www.strona.pl/');
  3. curl_setopt($c, CURLOPT_COOKIEFILE, 'cookies.txt');
  4. curl_setopt($c, CURLOPT_COOKIEJAR, 'cookies.txt');


Oto co wypluwa fire bug:



Skoro to nie cookies, nagłówki wszystkie przepisane to jak oni to mogą jeszcze inaczej weryfikować? :/