Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]cURL pobieranie sesji ze strony
Forum PHP.pl > Forum > Przedszkole
Watt
Cześć,

Mam duży problem z poberaniem sesji przez curl. Mam 2 requesty pierwszy zbiera sesję, drugi wykonuje zapytanie w post (który wymaga sesji).

Problem w tym, że ten pierwszy nie pobiera mi poprawnie sesji. Gdy odpalam stronę przez curl, w headerze strony wyrzuca mi atrybut np."Set-Cookie: JSESSIONID=07tP-hXzHurc-bL9bpOvVzmK; Path=/; HttpOnly", później gdy wrzucam go jako sesję w drugim curlu to strona wyrzuca mi "<partial-response>". Po każdym odświeżeniu strony JSESSIONID zmienia wartość.

W momencie jednak, gdy kopiuje sesję z przeglądarki wszysko śmiga. Starałem się dopisywać atrybuty jak leci i dalej nic. Jak sprawić, żeby strona poprawnie utworzyła sesję?

Pierwszy curl wyglada tak:

Kod
$chh = curlinit();
curlsetopt($chh, CURLOPT_URL, $strona);

curl_setopt($chh, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($chh, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($chh, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($chh, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($chh, CURLOPT_SSL_VERIFYPEER, false);


curl_setopt($chh, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chh, CURLOPT_VERBOSE, 1);
curl_setopt($chh, CURLOPT_COOKIESESSION, 1);
curl_setopt($chh, CURLOPT_HEADER, 1);

$header_size = curl_getinfo($chh, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);

$exp = explode("Set-Cookie:", $header);
$sesja = explode("; Path=/; HttpOnly", $exp[1]);


Dodam jeszcze, że strona w firefoxie wyrzuca mi np:

Kod
Cookie: __utma=179393144.1468963194.1462999507.1462999507.1462999507.1; _ga=GA1.3.1468963194.1462999507; JSESSIONID=UhpC5Rq4mETGZxq4wPXBgAJf


Natomiast tak jak wyżej, w curlu ten atrubut to nie Cookie: tylko Set-Cookie:
markuz
Obsługa sesji to po prostu obsługa cookies, to się robi automatycznie przez opcje:
  1. curl_setopt ($ch, CURLOPT_COOKIEJAR, 'jakisplik');
  2. curl_setopt ($ch, CURLOPT_COOKIEFILE, 'jakisinnyplik');

Pomijajac fakt, że masz blędnie nazwane stałe - nie potrzebne Ci $exp, $sesja itd.
Po prostu zarówno w 1 requeście (gdzie otrzymujesz id sesji w cookies) jak i 2 korzystasz z tych samych plików (w nich zapisuje się np. id sesji).
Watt
Cytat
Pomijajac fakt, że masz blędnie nazwane stałe - nie potrzebne Ci $exp, $sesja itd.

Tak tak wybacz coś się źle skopiowało tongue.gif

Po prostu zarówno w 1 requeście (gdzie otrzymujesz id sesji w cookies) jak i 2 korzystasz z tych samych plików (w nich zapisuje się np. id sesji).

Kod
$tmpfname = "cookie.txt";

$chh = curl_init();
curl_setopt($chh, CURLOPT_URL, $strona);

curl_setopt($chh, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($chh, CURLOPT_COOKIEJAR, $tmpfname);


curl_setopt($chh, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chh, CURLOPT_VERBOSE, 1);
curl_setopt($chh, CURLOPT_COOKIESESSION, 1);
curl_setopt($chh, CURLOPT_HEADER, 1);
$response = curl_exec($chh);


Problem w tym, że plik cookies.txt pozostaje pusty. Czy ma to związek z tym, że strona zwraca parametr "Set-Cookie: ", a nie "Cookie:"?
markuz
CURLOPT_COOKIEJAR i CURLOPT_COOKIEFILE to chyba powinny być 2 pliki, a Ty podajesz im 1 ścieżkę (pewnie jeden nadpisuje drugi, o ile ścieżka jest poprawna).

Sprawdź czy takie coś Ci się zapisze do pliku:
file_put_contents($tmpfname, 'abc');
Jeżeli nie to popraw ścieżke.
Watt
Kod
$tmpfname = "cookie.txt";
$tmpfname2 = "cookie2.txt";
file_put_contents($tmpfname, 'abc');
$chh = curl_init();
curl_setopt($chh, CURLOPT_URL,$strona);

curl_setopt($chh, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($chh, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($chh, CURLOPT_COOKIEFILE, $tmpfname2);
curl_setopt($chh, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($chh, CURLOPT_SSL_VERIFYPEER, false);


curl_setopt($chh, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chh, CURLOPT_VERBOSE, 1);
curl_setopt($chh, CURLOPT_COOKIESESSION, 1);
curl_setopt($chh, CURLOPT_HEADER, 1);

// ...
$response = curl_exec($chh);


Niestety dodało tylko abc do pliku cookie.txt i nic poza tym. Czy problem leży w samym zapytaniu? Nie powinno pobierać choć ciastek od google analitics?
markuz
Od google analytics na pewno nie bo to javascript dodaje te ciastka.

Masz też ustawione: curl_setopt($chh, CURLOPT_COOKIESESSION, 1); co jest chyba błędem w Twoim przypadku:
Cytat
Pass a long set to 1 to mark this as a new cookie "session". It will force libcurl to ignore all cookies it is about to load that are "session cookies" from the previous session. By default, libcurl always stores and loads all cookies, independent if they are session cookies or not. Session cookies are cookies without expiry date and they are meant to be alive and existing for this "session" only.
Watt
Kod
$tmpfname = "cookie.txt";
$tmpfname2 = "cookie2.txt";

$chh = curl_init();
$useragent = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0';

curl_setopt($chh, CURLOPT_USERAGENT, $useragent);
curl_setopt($chh, CURLOPT_URL, $strona);

curl_setopt($chh, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($chh, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($chh, CURLOPT_COOKIEFILE, $tmpfname2);

curl_setopt($chh, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($chh, CURLOPT_RETURNTRANSFER, true);

// ...
$response = curl_exec($chh);


Spróbowałem uprościć i dalej nic. No cóż, pomęcze się z tym jeszcze. Dziękuje Ci bardzo za pomoc.

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.