Autor Zpráva
RogRog
Profil *
Zdravím,

učím se pracovat s CURL přímo tedy s odesláním formuláře POST. Můj problém tkví v tom, že sem se snažil odeslat formulář, který obsahuje jednoduchou kaptchu (anty-spam), která generuje náhodně dvě čísla, která se mají sečíst. (1+5 =) (9+7=)...apod.

Co už mám - Culr dotazy na vyplnění formuláře, preg_match na vytáhnutí kaptchy tím pádem mám sice vypočítaný výsledek kaptchy, ale už to nedokážu do toho formuláře použít, protože to mám tak,že nejdřív se připojím vytáhnu kaptchu a pak se spojím znovu a chci odeslat formulář jenomže ve chvíli kdy se připojím po druhé už jsou čísla kaptchy jiná generují se při každém refreshy nová.

Můj dotaz zní jde to nějak vykoumat na jedno spojení? TZN 1.připojit se díky curl k formuláři 2.vytáhnout čísla s kaptchy 3.vyplnit formulář už s výsledkem kaptchy to vše na jediné spojení ;)

Předem díky, jen doufám že jsem to vysvětlil jasně ;)
blazej44800
Profil
Skus to spravit ako to mám ja na svojej stránke www.itking.ic.cz zaregistruj sa tam ak chces a pochopis tomu.
Ja na generovanie kodu mam spraveny skript: http://www.itking.ic.cz/book/kod.php a ten mi zabezpeci to ze sa mi vypise url obrazka s kodom a naplni sa mi neaka premenna na obsah toho obrazka (to znamena ze musis mat v skripte http://www.itking.ic.cz/book/kod.php urobeny neaky zoznam ze ak sa vygeneruje obrazok xy k nemu prislucha kod xy. Potom musis spravit to aby sa ti do formulara pridal riadok
<INPUT TYPE="HIDDEN" VALUE="kod" NAME="kod_original">
. Cize sa ti odolse spolu s formularom a potom spracovatelsky skript vyhodnoti ci sa zhoduju.
Ked chces dam ti aj kod. Chces???
RogRog
Profil *
Já nevím zda jsme se dobře pochopili.

Já umím odeslat ten formulář, také umím díky regulárním výrazům vytáhnout obrázek či text kaptchy, ale neumím to spojit do jedné funkce do jednoho souvislého kódu.

Mám
1. Spojení k formuláři :

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1024);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
$data = curl_exec($ch);


2. Vytáhnu kaptchu a rovnou jí  sečtu = $spam 

preg_match('/<tr id=\"check_tr\">(.*):&nbsp;(.*)\+(.*)\=/msU',$url,$title); 

$spam = $title[2] + $title[3];

3.Spojím se znovu a nyní chci už vyplňovat položky formuláře i z vygenerovanu kaptchou.

$form = array(
'test' => '410'........'spam' =>$spam..............)

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1024);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $form);
$data = curl_exec($ch);
curl_close($ch);








Ale pokud se připojím po druhé už je spam přeci jiný než byl, protože se generuje po každém načtení nový. ;)
blazej44800
Profil
Tak si ho uloz do session
RogRog
Profil *
blazej44800:
Nastíníš alespoň jak?

Díky
RogRog
Profil *
blazej44800:
*Stačí mi princip toho jak to myslíš. Ke kódu se už dopracuju
nightfish
Profil
Prohlížeč funguje úplně stejně:
1) pošle požadavek na formulář, server mu vrátí formulář i s captchou
2) uživatel vyplní formulář (a tedy i captchu) a formulář odešle
3) server vrátí nějakou odpověď, uloží cookie, začne session atp.

Jediným problémem je, že server musí zjistit, ke kterému prohlížeči patří která captcha - pravděpodobně buď podle nějakého skrytého formulářového pole nebo do cookie. V prvním případě stačí zjistit, jak se to pole jmenuje a jakou má hodnotu, a připojit ho do proměnné $form. Ve druhém případě je potřeba v curl zapnout podporu ukládání cookies (nastavit parametry CURLOPT_COOKIEFILE a CURLOPT_COOKIEJAR) - jak v prvním, tak i druhém požadavku.
RogRog
Profil *
nightfish
Jenže toto je trochu složitější :

Jde o to, captcha se generuje do dipslay:none inputu. A do toho inputu se vkládá součet captchy javascriptem při window.onload.

input vypadá takhle = <input name="spam" /> hodnotu value mu přiděluje až javascript. $('spam').value = (součet catpchy);

Co se týká cookies pokud přidám do CURL kódu kookie mi vyhodí jen sesid

(FALSE / FALSE 0 PHPSESSID 1o2ac8k35s7vc5ugio0i763ia1)

A nevím jak ho využít ke svůj prospěch. Asi se budu muset smířit s tím že to nepůjde ;)
nightfish
Profil
RogRog:
Jde o to, captcha se generuje do dipslay:none inputu. A do toho inputu se vkládá součet captchy javascriptem při window.onload.
To je jenom věc "přítulnosti pro uživatele".

A nevím jak ho využít ke svůj prospěch.
Pravděpodobně si v této session server ukládá jaký má očekávat výsledek protispamové kontroly. Pokud se po prvním požadavku uloží do souboru cookie s tímto identifikátorem session a při druhém požadavku se tato cookie pošle, mělo by to fungovat.
RogRog
Profil *
Tak bohužel beze změny. Teď mi tak dochází, že ten spam číslo + číslo se nikam neukládá do (cookie).

Funguje to podle mě na principu

$cislo1 = rand(1,10);
$cislo2 = rand(1,10);
echo $cislo1 ." + ". $cislo2; = <input> a hodnota se do něj dopisuje jen reálným součtem...

Tím pádem při každém novém načtení je $spam jinde. Pokud to tedy nejde vytáhnout a zapsat na jedno spojení nemám šanci.
RogRog
Profil *
nightfish:

1. curl_exec($ch) = $vytažení captchy první spojení
2. curl_exec($ch) = odeslání post formuláře druhé spojení

Chtělo by to aby se to první spojení neukončovalo a druhé jen navázalo zkoušel jsem to i bez curl_close($ch); ale bez výsledku. Podaří se mi formulář odeslat jednou z 50 pokusů když se zrovna trefím do stejné captchy ;)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0