Autor Zpráva
Fibi
Profil
Řeším tu takový, alespoň pro mě zapeklitý problém.
Potřebuji PHP scriptem stáhnout soubor, který je na stránce za loginem.
Když už mám potřebnou cookies, tak to jde. Ale nedaří se mi ji od webu získat.
Jak to zkouším :
$prihlaseni_dotaz = http_build_query(
    array(
        'email' => $jmeno,
        'password' => $heslo,
        '_do' => 'loginForm-loginForm-submit'
    )
);
//$prihlaseni_dotaz = "email=$jmeno&password=$heslo&_do=loginForm-loginForm-submit"; //pokus skladat to jinak nez pomoci http_build_query, ale take to neslo

echo $prihlaseni_dotaz ;//jen si ukazuju co se slozilo

$prihlaseni_opts = array (
        'http' => array (
            'method' => 'POST',
            'header' => 
            "Content-Type: application/x-www-form-urlencoded\r\n".
            "Content-Length: " . strlen($prihlaseni_dotaz) . "\r\n",
            'timeout' => 600,
            'content' => $prihlaseni_dotaz
            )         
        );

$prihlaseni_context = stream_context_create($prihlaseni_opts);
$prihlaseni_odpoved = file_get_contents('https://adresawebusloginem.cz', false, $prihlaseni_context);

Odeslat ten přihlašovací formulář se tedy nejspíš daří, ale nevím jak získat hodnotu cookies co mi to vrací.

Prosím o nakopnutí kterým směrem pátrat ?
Hledal jsem okolo té funkce file_get_contents, ale neúspěšně.
Keeehi
Profil
Použij CURL. Je to mnohem lepší varianta pro posílání požadavků na jiné servery než funkce, která je primárně určená na práci se souborovým systémem.
Fibi
Profil
Keeehi:
To by asi šlo, i když je to o dost složitější.
Ale s její pomocí získat tu cookies ?
Keeehi
Profil
Fibi:
Ale s její pomocí získat tu cookies ?
Samozřejmě. Můžeš získat cookie z jednoho požadavku a tu pak poslat v dalším. Umí to ale něco lepšího. Když tomu dáš uložiště (soubor) tak si to umí zapamatovat obdržené cookies a v příštím požadavku je automaticky odeslat.
Fibi
Profil
Keeehi:
A prosím nemáte někdo, nějaký ukázkový script jak na to ?
Keeehi
Profil
Tak základ máš v dokumentaci.
Kompletní výpis všech možností, které se dají nastavit najdeš na php.net/manual/en/function.curl-setopt.php
Tebe bude hlavně nejdříve zajímat CURLOPT_POST a CURLOPT_POSTFIELDS, protože chceš poslat post požadavek a pak taky CURLOPT_COOKIEJAR a CURLOPT_COOKIEFILE pro automatické ukládání cookies.
No a pak už to záleží na situaci. Dost často se používá CURLOPT_RETURNTRANSFER pro uložení vráceného obsahu do proměnné a CURLOPT_FOLLOWLOCATION pro automatické sledování přesměrování.
Fibi
Profil
Moc díky za nasměrování. cURL jsem se chtěl za každou cenu vyhnout, když jsem viděl to množství voleb v manuálu :-)
Ale nakonec to nebylo tak hrozné.
Je tedy fakt, že uložení cookies do souboru se mi nezdařilo ani s jednou volbou (CURLOPT_COOKIEJAR, CURLOPT_COOKIEFILE)
Ale nakonec jsem to přeci jen přepral, kdyby to někdo hledal tak tohle je výsledek mého snažení, díky kterému jsem tu cookie získal:
//icializace cURL.
$curl = curl_init();

//URL kam miri prihlasovaci formular
curl_setopt($curl, CURLOPT_URL, 'https://sem-miri-formular.examle.com');
 
//Budu posilat metodou POST
curl_setopt($curl, CURLOPT_POST, true);
 
//Data co budu posilat, uz vystup z http_build_query
curl_setopt($curl, CURLOPT_POSTFIELDS, $prihlaseni_dotaz);

//USER AGENT ... když je potřeba podstrčit formuláři něco konkrétního
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36');
 
//Na výstup mi vrátí co server odpověděl
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 
//Nastavím referer
curl_setopt($curl, CURLOPT_REFERER, 'https://adresa-formulare.examle.com');

//Do výstupu zahrnu hlavicky
curl_setopt($curl, CURLOPT_HEADER, true);

//Spusteni prikazu
$hlavicky = curl_exec($curl);

A teď už jen regulárem najdu ve výstupu potřebnou cookie.
Keeehi
Profil
Aby možnost CURLOPT_COOKIEJAR fungovala, je potřeba aby PHP mělo práva zapisovat do daného souboru. A dále je nutné zavolat funkci curl_close, protože soubor s cookies se vytváří až po ukončení spojení. Podle mě to bude ten důvod, proč ti to nefungovalo.

Ještě jsem se dočetl, že je možné aby CURLOPT_COOKIEJAR ukládalo cookies ne do fyzického souboru ale do paměti což bude řešit problém který by mohl vzniknout při paralelním spuštění skriptu. Aby curl ukládalo cookies do paměti, prý stačí nastavit cestu na prázdný řetězec. Sám jsem to ale nezkoušel.

curl_setopt($curl, CURLOPT_COOKIEJAR, '');
...
curl_exec($curl);
curl_close($curl);

$curl = curl_init();
...
curl_setopt($curl, CURLOPT_COOKIEFILE, '');

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: