Autor Zpráva
xlifer
Profil
Snažím se odeslat skriptem POST formulář.
Chci provést úplně to samé, jako když bych odeslal formular.php pomocí tlačítka Odeslat.
Nejde mi tedy primárně o předávání parametrů, tudíž nějaké schovávání do SESSION apod., ale nasimulovat odeslaní POST formuláře.

Poradíte, zda je to vůbec možné?

skript.php

$post_data = "jmeno=TEST&heslo=HESLO";
$content_length = strlen($post_data);
header('POST /formular.php HTTP/1.1');
header('Content-type: application/x-www-form-urlencoded');
header('Content-length: '.$content_length);
header($post_data);

formular.php:

<form action="formular.php" method="post" name="pokus">
Jmeno: <input type="text" name="jmeno" value="<?echo $_POST[jmeno];?>">
Heslo: <input type="password" name="heslo" value="<?echo $_POST[heslo];?>">
<input type="submit" name="tlacitko" value="Odeslat">
</form>
Keeehi
Profil
A hledat jsi zkoušel? Toto byl můj první odkaz v googlu: stackoverflow.com/questions/5647461/how-do-i-send-a-post-request-with-php

Ještě jde využít knihovny curl.
xlifer
Profil
Přiznám se, hledal jsem, ale nebyl jsem z výsledku úplně moudrý...

Akorát nevím jestli jsem dobře pochopil ten první nalezený příklad, ale to asi není co bych potřeboval... nebo jsem se špatně nevyjadřil.

Chci stejně jako, když kliknu na ODESLAT ve formuláři, udělat nějakým skriptem. Tzn. hlavička předá action skriptu hodnoty ke zpracování jako bych ten formulář odesílal. Chapeme se nebo to píšu špatně k pochopení?
Keeehi
Profil
xlifer:
Akorát nevím jestli jsem dobře pochopil ten první nalezený příklad, ale to asi není co bych potřeboval
Ale ano, to je přesně to co potřebuješ. Jen nepoužiješ tebou navrhovaný header, jelikož by jsi to posílal sobě do prohlížeče ale v příkladu uváděný file_get_contents který ten požadavek vytvoří a pošle na správnou adresu.
xlifer
Profil
Aha, rozumím a proč to nelze způsobem přes Header() ?

Tohle mi třeba funguje jako přesměrování, ale nepošle to POST hodnoty?

$req="jmeno=TEST&heslo=HESLO";
header("Method: POST\r\n");
header("Host: localhost\r\n");
header("Content-Type: application/x-www-form-urlencoded\r\n");
header("Content-Length: ".strlen($req)."\r\n");
header($req."\r\n\r\n");
header("Connection: close\r\n\r\n");
header("Location: /formular.php\r\n");
juriad
Profil
xlifer:
Protože pomocí funkce header odesíláš hlavičky odpovědi, ty chceš opak: vyvolat požadavek.
xlifer
Profil
juriad:

Aha, tak teď už jsem doma! Tak to je jasný... pravda.
xlifer
Profil
A kdybych se chtěl logovat přes takovou napsanou funkci třeba do e-shopu, kde je klasické přihlášení zákazníka přes zadaní uživatele a hesla a přihlásit, tak bude file_get_contents() fungovat, jak bych tam vstoupil jako uživatel?

Jako, že bych si udělal takový "odkaz" a na kliknutí bych se přes něj přihlásil?
Micruss
Profil
Ne, na toto už potřebuješ již zmiňovaný cURL
xlifer
Profil
Micruss:

Díky.

A ješte souvísející dotaz:

Stačí to provést jednou a pak už být v prohlížeči jakoby přihlášen?

Jako že, kliknu na odkaz přihlásit ( to bude skript , který mě přes cURL naloguje) a pak už zůstanu na tom webu (url) jako běžný přihlášený uživatel. Snad jsem to napsal k pochopení.
juriad
Profil
Napřed se pomocí curl přihlásíš, to přihlášení způsobí uložení nějakých cookies.
Další požadavky po přihlášení půjdou taktéž přes curl, ten využije těch cookies, které si uložil v prvním kroku, aby přesvědčil server, že jsi to stále ty.
V opačném případě, by každý požadavek byl úplně nezávislý (žádné přihlášení by nepřežilo).

Mrkni na příklad:
http://blog.andyhunt.info/2011/12/21/using-php-and-curl-to-log-in-to-a-website/
Napřed nastaví, kam se uloží cookies, pak se zaloguje (řádek 27). Následně použije ty cookies (protože mezitím nezměnil parametr CURLOPT_COOKIEJAR) při dotazu na chráněnou stránku (vyžadující přihlášení).
xlifer
Profil
A rozumím dobře, že Cookies využívá cURL (nikoliv stránka do které se loguju), aby si tam schovávál nějaké informace pro sebe, které pak předává serveru jak píšeš, aby ho přesvědčil, že jsem to stále já?
juriad
Profil
Skoro. Ty Cookies není nic magického.
Server, ke kterému se přihlašuješ, obvykle vygeneruje náhodné číslo a to ti pošle, jakmile se přihlásíš.
Dále očekává, že mu při každém požadavku pošleš to číslo zpět, aby poznal, kdo jsi (z té hromady přihlášených lidí).
Když mu pošleš neexistující číslo nebo žádné, předpokládá, že jsi nepřihlášený.

Mrkni na ty diagramy na http://en.wikipedia.org/wiki/HTTP_cookie#Setting_a_cookie

Chceš tedy zajistit, aby dva požadavky po sobě sdíleli cookies (to číslo, které si má prohlížeč pamatovat). Příčemž první je zapíše, druhý a další je použíjí.
To umí curl pomocí nastavení opšny CURLOPT_COOKIEJAR.
Micruss
Profil
// Prihlaseni 
$ch = curl_init('http://www.cz/url_na_prihlaseni_.php');  
curl_setopt ($ch, CURLOPT_POST, 1);  
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'login='.$nick.'&heslo='.$heslo); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // SSL pokud vyžaduje SSL login 0=false, 1=true
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
#curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_HEADER, 1); 
$ziskej = curl_exec ($ch);  
curl_close ($ch); 

tady máš menší příklad jak by to přihlášení mohlo vypadat... (musíš vytvořit soubor) cookie.txt a dát mu případně 777 chmod, curl uloží tvoje cookies to doto souboru, takže pokud se logneš a uloží si tě jejich server do session tak tobě se automaticky uloží do soubor cookie.txt tvoje phpsessid a při přiští zadání cURL (tentokrát) bez poslání POST dat, tak už máš být přihlášený via cURL

edit: login, heslo jak je v tom postfields tak to je podle <input name='....'>
xlifer
Profil
Micruss:

Díky moc, vykouším to...
xlifer
Profil
Micruss:

A jak poznám, že to vlastně funguje? :-) Zkouším to, ale vždy to vypadá, že skript přihlašení proběhne, ale nic se nestane, žádný výsledek na výstup v prohlížeči?

Když zobrazím HTML kód s výsledkem po tom skriptu přihlášení, tak to vrátí toto: ? Myslel jsem, že se zobrazí ta stránka, kam jsem se nalogoval?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=windows-1250" http-equiv=Content-Type></HEAD>
<BODY></BODY></HTML>
Micruss
Profil
Vytvoříš nový cURL. Většinou, když se někam přihlásíš, tak tě přesměrují na nějakou stránku, tak si to dáš jako novou url... a nebo tam napíšeš url kterou by si chtěl navštívit, akorát když dáš echo $ziskej; tak to vypíše html kód ;-), já většinou cURL používám pokud chci vypsat něco ze stránky a potřebuju login nebo tak... taky pokud tam chci něco zadat...a potom se to dá použít i s cronem

<?php
# jsme prihlaseni
$ch = curl_init('http://www.cz/logged.php');  
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
#curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_HEADER, 1); 
$ziskej = curl_exec ($ch);  
curl_close ($ch); ?>
xlifer
Profil
Micruss:

Takže zda dobře chápu, že vždy musím znovu pokračovat dalším curl_init() s novým požadavkem? Tudíž např. přihlásím se někam, něco tam můžu třeba uložit/vykonat jako bych tam byl normálně přihlášen a tak to jde stále dokola... Lze tím vlastně vytvořit takovou vzdálenou konzoli na ovládání. Chápu správně?

Jo a ješte proč je tam vždy zakomentovaný to CURLOPT_FOLLOWLOCATION ?
Micruss
Profil
Ano chápeš... dá se s tím opravdu vyhrát a taky zneužít :D...

jinak k tomu Followlocation: přesměruje tě to na nějakou stránku, pokud tam nějaký přesměrování je... dělalo mi to bordel tak jsem to zakomentoval a nepoužívám to.. přijde mi to zbytečný, můžeš to zkusit odkomentovat ;-)

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: