CURL - nie tworzy wszystkich cookies

0

Łączę się z pewną stroną za pomocą CURLa. Połączenie wygląda tak:

$post = 'login_name='.$user.'&login_password='.$pass.'&login=Zaloguj';

$c = curl_init();
curl_setopt($c, CURLOPT_URL, 'http://www.strona.pl/index.php');
curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 desktopsmiley_2_2_5643778701369665_44_71 DS_gamingharbor Firefox/3.5.2 (.NET CLR 3.5.30729)');
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $post);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($c, CURLOPT_REFERER, 'http://www.strona.pl/');
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($c, CURLOPT_COOKIEJAR, 'cookies.txt');
$p = curl_exec($c);
curl_close($c);

Na stronę loguje ładnie i co ważne, po przejściu do kolejnych stron (po prostu podczas "chodzenia" po stronie) sesja trzyma i cały czas jestem jako zalogowany user. Jednak problem jest tego typu, że w pliku "cookies.txt" tworzy się jedno ciastko (PHPSESSID) oraz cztery inne, które są jakoś dziwnie zakomentowane:

#HttpOnly_.strona.pl	TRUE	/	FALSE	1453449962	dle_user_id	137
#HttpOnly_.strona.pl	TRUE	/	FALSE	1453449962	dle_password	e9291ff074e2076f0076ba
#HttpOnly_.strona.pl	TRUE	/	FALSE	1453449962	dle_hash	635cfb7e7db1ba6d3c1bc
#HttpOnly_.strona.pl	TRUE	/	FALSE	1453449963	dle_newpm	0

Standardowe ciastko wygląda tak:

www.strona.pl FALSE / FALSE 0 PHPSESSID e52oimu55u3351haqquor

W przeglądarce mam stworzonych ok. 11 ciasteczek, a tutaj jedno i cztery zakomentowane jakby. Finalnie mam problem z odwiedzeniem jednej z podstron na tej witrynie i przypuszczam, że tam właśnie sprawdzane są ciasteczka. Gdy nie ma któregoś z nich to skrypt mnie odrzuca.

Co może być powodem tworzenia małej ilości ciasteczek no i co z tymi ciasteczkami, które są zakomentowane?

0

To nie jest komentarz! To zupełnie normalne zjawisko.
http://stackoverflow.com/questions/11261069/curl-cookiejar-line-commented-out

W przypadku cURL każde ciastko i tak jest w zasadzie httpOnly, bo cURL to jakby strona serwerowa, nie ma tam strony klienta.

A fakt, że cURL obsługuje coś takiego jest chęć utrzymania obsługi 1:1 porzuconego już formatu pliku z informacjami o ciasteczkach, którego kiedyś używały przeglądarki:
http://curl.haxx.se/rfc/cookie_spec.html
http://curl.haxx.se/docs/http-cookies.html (sekcja 1.2)

Brakujące cookies zapewne ustawiane są przy pomocy javascriptu, cURL to nie przeglądarka, pobierze tylko te ciastka, które idą od serwera.

edit: Jakbyś się zastanawiał - nie, w cURL nie ma prostego sposobu na dopisanie ciastka do żądania, musisz modyfikować cookiejar, albo sam je parsować, dopasowywać do requestu (ścieżka, czas życia ciastka itd - w większości przypadków zbędne) i podawać jako string.

0

Jednak to nie problem ciastek. Może Ty będziesz w stanie mi pomóc bo ja nie mam już pomysłu.

Chodzi o to, ż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.

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

$post = 'post_id=1090456&comments=true&name=moj_nick&mail=&editor_mode=&skin=styl_2014';

$c = curl_init();
curl_setopt($c, CURLOPT_URL, 'http://www.strona.pl/engine/ajax/file.php');
curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0');
curl_setopt($c, CURLOPT_HTTPHEADER, array(
	"Accept" => "*/*",
	'Accept-Encoding' => 'gzip, deflate',
	'Accept-Language' => 'pl,en-US;q=0.7,en;q=0.3',
	'Cache-Control' => 'no-cache',
	'Connection' => 'keep-alive',
	'Content-Length' => '175',
	'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8',
	'Host' => 'www.strona.pl',
	'Pragma' => 'no-cache',
	'X-Requested-With' => 'XMLHttpRequest'
	)
);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $post);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_REFERER, 'http://www.strona.pl/');
curl_setopt($c, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($c, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($c, CURLOPT_HEADER, true);
$p = curl_exec($c);
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:

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

Oto co wypluwa fire bug:

user image

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

0

Content-Length na sztywno? Jaki kod HTTP zwrotki dostajesz?

Druga rzecz - wchodzimy w coraz bardziej niepewny temat. Z treści postów (kodu) wynika duże prawdopodobieństwo, że piszesz bota na forum warezowe (mam kilka typów), w dodatku sam widzisz - oni tam Twojego bota nie chcą. Miej na uwadze, że pisanie takich programów podpada pod paragrafy (i nie mówię tu o udostępnianiu czegokolwiek tylko zakłócaniu pracy systemów informatycznych) a i nam nie bardzo wypada pomagać w takiej działalności.

[edit: a, to Ty, ten od pobierania plików z filehosterów, no to warezy :p]

1 użytkowników online, w tym zalogowanych: 0, gości: 1