Autor Zpráva
lisak
Profil *
Dobrý den,

něco mi jede normálně a něco se rozjelo, když jsem udělal změnu v CURLOPT_HTTPHEADER. Proto si myslím, že v tom jede právě on a teď moje šibalská otázka: Jak zjistím na stránce, správný zápis pro CURLOPT_HTTPHEADER ?

Shválně jsem se ve firefoxu přihlásil a vytáhnul jsem si informace o stránce, ale odpověď proč jako jediná stránka mi nedovoluje získat data jsem nenašel.
Jan Tvrdík
Profil
lisak:
Nechápu otázku. Posíláš přes cURL nějaký HTTP požadavek s vlastními hlavičkami a nevíš, jestli jsou ty hlavičky v pořádku? Podle čeho definuješ správnost těch hlaviček? A co vlastně posíláš za hlavičky?
lisak
Profil *
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6');
  curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Content-type: text/html; charset='.$charset,'Authentication-API-Key: 12345'));

Chci se jednoduše přihlásit a vytáhnout si nějaká data ze svého profilu.


Hledám návody na internetu a testuju. Vypisoval by sem si to rád sám, ale nevím jak zjistím co ta daná stránka chce


Už jsem na to přišel, ale vypisuje mi:
Bad Request - Invalid Header

HTTP Error 400. The request has an invalid header name.

  curl_setopt($ch, CURLOPT_HTTPHEADER, Array('GET / HTTP/1.0;Host: domena.cz;Connection: close;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9) Gecko/2008052906 Firefox/3.0;Accept-Encoding: gzip;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;Accept-Language: cs,en-us;q=0.7,en;q=0.3;Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7;Cache-Control: no-cache'));
lisak
Profil *
U tohodle se mi chybová hláčka o špatně vypsané hlavičce nezobrazí, ale zároveň se mi nezobrazí vůbec nic. Kde dělám chybu?

CURLOPT_HTTPHEADER, Array('Connection: close; User-Agent: Web-sniffer/1.0.44 (+http://web-sniffer.net/); Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;Accept-Language: cs,en-us;q=0.7,en;q=0.3; Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7;Cache-Control: no-cache'));
Davex
Profil
URL se nastavuje samostatně v inicializaci cURL a metoda se nastavuje jinde. Do CURLOPT_HTTPHEADER patří jen dodatečné hlavičky, kde je každá jako samostatný prvek v poli. Nemají být v jednom prvku jako řetězec oddělený středníkem.
lisak
Profil *
Já mám zápis takhle:

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.8.1) Gecko/20061010 Firefox/2.0');
  curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7'));
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1024);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $get);
  $data = curl_exec($ch);
  curl_close($ch);

Bojuji furt s CURLOPT_HTTPHEADER a snažím se mu tam nacpat tu správnou hlavičku. Jen furt nevím co dělám špatně


Takhle se mi taky nic nevypisuje, ale myslel jste to takhle?

  $accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  $content = 'text/html; charset=utf-8';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.8.1) Gecko/20061010 Firefox/2.0');
  curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Accept: ' .$accept, 'Content-type: '.$content));
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1024);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $get);
  $data = curl_exec($ch);
  curl_close($ch);



Může mi prosím někdo napsat jak se to má správně psát?
lisak
Profil *
Nemusíte se všichni přetrhnout :-) Vždyť já si tu rád píšu sám se sebou :-)
Jan Tvrdík
Profil
lisak:
Mělo by to být skoro dobře. Akorát vyhoď posílání té Content-type hlavičky, protože pravděpodobně nechceš cílové stránce posílat HTML soubor, ale nějaké parametry. Záleží, co máš v proměnné $get, kterou jsi nám tady neukázal.
lisak
Profil *
Mám tam: Nick=ja&Pwd=code


bez Content-type to nejde. Provadim prihlaseni a beru si kod. Nebo spis je to mim cilem :-)


Jde mi o to se napojit na lide a tam si vzit jen pocet prijatych vzkazu. Uzivatele by pak na me strance videli kolik mam nebo maji vzkazu oni.


Vsechno zvládnu, ale potrebuju se přihlásit. Chmod 777 mám samozřejmě nastavený a v minulosti ten samí kod mi fungoval perfektně na jiný stránce. Jen na tyhle mi to nejde. Někde jsem se dočetl, že pokud je správně nastavený CURLOPT_HTTPHEADER tak vše pak jede. Proto se snažím a zaměřuju jen na hlavičky protože vše okolo předpokládám mám dobře
Jan Tvrdík
Profil
lisak:
bez Content-type to nejde
Proč? Zkoušel jsi to? Co ti to vlastně teď vrací?
lisak
Profil *
I kdyz to stim fungovalo, tak jsem to zrusil jako nadbitecny prikaz, ale stranka se nezobrazila. Kdyz jsem to vratil, tak se mi zobrazila.
Jan Tvrdík
Profil
lisak:
Tvůj způsob vyjadřování zdá se mi poněkud nešťastný :)

I kdyz to stim fungovalo
Co myslíš tím „fungovalo“? Mám dojem, žes říkal, že ti to pořád nefunguje.

ale stranka se nezobrazila
On ten kód má zobrazovat nějakou stránku? Nebo tím myslíš? Vrací případně něco funkce curl_error?

Kdyz jsem to vratil, tak se mi zobrazila.
Co se kde zobrazilo? Ten kód rozhodně nic nezobrazuje.
lisak
Profil *
Omlouvám se. Máte pravdu, že se blbě vyjadřuju a to jsem právě taky pochopil. Už to funguje, ale ten volík na místo toho aby mě zobrazil stránku pod mim php, tak mě přihlásí, ale presmeruje na svoji

Místo: domena.cz/script.php
Mám: http://lide.cz
Jan Tvrdík
Profil
lisak:
ten volík
Nevím kdo nebo co to je. Bez rozpoznání podmětu nejsem schopen danou větu pochopit. Prosím, dej si záležet na tom, ať to, co píšeš, jsou skutečně platné české věty.
lisak
Profil *
Dobře. Má tam danou ochranu refreshem. Tak jsem si vlastně vytvořil věc, která mne bez otravného vyplnování přihlásí, ale ke kodu se nedostanu.
Napadlo mě jedině, že se provede zapis do cookie a ten si potom vytahnout dalšim curl
Jan Tvrdík
Profil
lisak:
Má tam danou ochranu refreshem.
Nevím, co si mám představit pod „ochranou refreshem“. To, že po přihlášení (metodou POST) dojde k přesměrování, je očekávané chování. To, že je to přesměrování automaticky následováno, je dáno explicitním nastavením CURLOPT_FOLLOWLOCATION na true.

Napadlo mě jedině, že se provede zapis do cookie a ten si potom vytahnout dalšim curl
Uložení přijatých cookies se už provedlo, konkrétně do souboru nastaveného jako CURLOPT_COOKIEFILE. Poslání dalšího požadavku se stejnými cookies je zcela korektní způsob, jak se běžně získávají data, která k přístupu vyžadují přihlášení.
lisak
Profil *
a jak mám tedy udělat aby to fungovalo jak má? Jý už nic nevim, ale jsem už blízko


Zrušil jsem echo u toho curl a dal jsem mu jeste tohle, ale zobrazi mi stranku bez prihlaseni

$ch = curl_init();
      curl_setopt($ch,CURLOPT_URL,"http://profil.lide.cz");
      curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); 
      curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
      $data = curl_exec($ch);
      curl_close($ch);
      echo $data;



Proč to nefunguje?


Ten co funguje (zapisuje cookie a prihlasuje) jsem nechal bez spuštění. Vše se provede, ale nejsem nikam presmerovanej. Tak jsem ještě dodal tohle:

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_URL, 'http://www.lide.cz/');
  curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
  curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
  $data = curl_exec($ch);
  curl_close($ch);
  echo $data;

Do cookie.txt se vse zapise a myslel jsem si, že tímhle se dostanu na stránku jako přihlášený. Zase jsem se spletl a sice se stránka zobrazí, ale nejsem přihlášený i když se vše zapsalo. Kde je prosím chyba?

cookie.txt pro uvěření:
#HttpOnly_.szn.cz    TRUE    /    FALSE    0    lsds    6|OVQF6USDLMEEIVKKHBRAWRKQKBAQSUYJJIFQWDATBY4GOYYQMN6H24DDMRJQCRAIKFBQCGQFA4VCCPQFKAEBOEAJDBMA6YZ5MFMHIYSTKZHVGWQSLZCXO2IJIFLV4QIMLYAA6RKWLVBF643DNJKGOMZVORRS6VCESICPY4NQ7Y34EGGIPKW5ODJ62ZJMNIFR
#HttpOnly_.szn.cz    TRUE    /    FALSE    1397957719    ls    seznam:email.cz:0:0
Micruss
Profil
Zkus se podívat sem
http://micruss.eu/skripty/curl.phps
lisak
Profil *
Micruss:
Děkuju. To taky bohuzel nefunguje. Seznam to bude mít pělně zabezpečený. Tak jsem si řekl, že se procvičím na rande.cz :-)

To jsem se dřív pokoušel taky a zjistil jsem, že to je optížný. Proto si myslím, že na učení je ideální.


Potřebuju pochopit ty hlavičky. To je podle mě důležitý a tohle když zmáknu, tak ostatní bude jen hra. Hledal jsem vysvětlení pro blbečky, ale žádný jsem nenašel, tak to musím pochopit sám. Nebo je tu někdo kdo mi to vysvětlí? Určitě nebudu jedinej kdo si ten návod rád prostuduje.


Třeba taková malá zajímavost, kterou mi hlava nebere:
<input name="ctl00$login$login_nick" type="text" id="login_login_nick" class="userPanel_txtNick" onkeypress="pressDefaultButton('login_ctl00', event);" />

Nikde není uveden začátek ani konec form. Proto jestli tohle zdolám, tak jsem připravenej na seznam :-)


Nevíte někdo jak je možný, že tam nemá form?
lisak
Profil *
<?php session_start(); 
$strCookie = 'PHPSESSID='.$_COOKIE['PHPSESSID'].'; path=/';
session_write_close(); 
//header("Content-type: text/plain");
$contentType = 'text/html';
$method = 'POST';
$header1 = 'Authentication-API-Key: 12345';
$charset= 'UTF-8';

            $ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0');
curl_setopt($ch, CURLOPT_URL, "http://www.rande.cz/");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");  //initiates cookie file if needed
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");  // Uses cookies from previous session if exist
curl_setopt($ch, CURLOPT_COOKIE, $strCookie); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Content-type: '.$contentType.'; charset='.$charset, $header1));
curl_setopt($ch, CURLOPT_POSTFIELDS, "ctl00$login$login_nick=nick&ctl00$login$login_heslo=heslo&ctl00loginctl00=Přihlásit");
            $vys = curl_exec($ch);
echo $vys;
?>

Ví někdo proč to nefunguje? Vím, že jsem říkal, že se na tom naučím, ale pořád v tom bloudím a potřebuju poradit.


Na co je diskusní forum o programování, když tu jen někdo hází hlášky o porušování pravidel a nikdo neporadí? Adminům rád vzkazuju, že by sem to řešení dal jako konec vlákna. Jinak všem moc děkuju za super pomoc a hlavně, že jsem se díky této diskusi neco naučil :-)
lisak
Profil *
Vlákno se může ukončit :-)
Vyřešilo se to na jiném foru.
Davex
Profil
lisak:
Vyřešilo se to na jiném foru.
A jak?
lisak
Profil *
Jeden klučina mi dobře pomohl pochopit proces. Ještě nehotové řešení:

<?php       //header("Content-type: text/plain");
            $ch = curl_init('https://login.szn.cz/loginProcess');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0');
curl_setopt($ch, CURLOPT_HTTPHEADER, Array('charset=iso-8859-1'));  
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);     
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);   
curl_setopt($ch, CURLOPT_POSTFIELDS, 'username='.$nick.'&domain='.$dome.'&password='.$pasw.'&login=Přihlásit se&serviceId=lide&disableSSL=0&forceSSL=0&lang=cz&loginType=seznam&returnURL=http://profil.lide.cz/'.$nick.'@'.$dome.'/profil/&forceRelogin=0'); 
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);

preg_match_all("'<a.*?href=\"(http[s]*://[^>\"]*?)\"[^>]*?>(.*?)</a>'si", $ziskej, $matches, PREG_SET_ORDER);
foreach($matches as $match){
  $url = $match[1];
}

            // Jsme prihlaseni na seznam a ted pokracujem na lide 
            $ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0');
curl_setopt($ch, CURLOPT_HTTPHEADER, Array('charset=iso-8859-1'));  
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); 


            // Jsme prihlaseni (profil) 
            $ch = curl_init('http://profil.lide.cz/'.$nick.'@'.$dome.'/profil/');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0');
curl_setopt($ch, CURLOPT_HTTPHEADER, Array('charset=iso-8859-1'));  
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); 
echo $ziskej;
?>
Pokud se někdo chce přidat a dokončit to se mnou, tak budu jen rád. Ale jsem jen kousek od konce, tak upřímně je mi to už jedno :-)
Jen jsem slíbil, že hotové řešení později doplním. Prozatím mám jen tohle, tak to sem dávam aby byl vidět nějaký postup


Jenom dodatek:

Při tomhle kodu se provede tento zápis do cookie. lide, které chceme mají špatný zápis pro relaci, tak na týhle opravě ted pracuju.
#HttpOnly_.szn.cz    TRUE    /    FALSE    0    lsds    6|OVQF6USCLMAUWVCAHBRAWRKQKFAASUYNJIFQWDATBY4GOYYQMN6H24DDMRJQCRAAKSBQCGQFA4VCCPQFKAEBOEAJDBMA6YZ5MFMHIYSTKZHVGWQSLZCXO2IJIFLV4QIMLYBA6RKWLVBF643DNJKGMMZVO5QS6VCE5XBQSAZSUDCERPKPP3VTUISYWSYTDXFG
#HttpOnly_.szn.cz    TRUE    /    FALSE    1398067759    ls    seznam:email.cz:0:0
profil.lide.cz    FALSE    /    FALSE    0    last_visited    nick@domena.cz!M!!!0!0!0!0!0



To vážně nikdo nechce pomoct? Věřím tomu, že pokud to dokážu, tak kopírovat to bude spousta lidí, ale když jde o pomoc, tak nikdo :-)
Typický čecháčkové :-)

„Vyřešilo se to na jiném foru.“
A jak?

Zajímal Vás kod nebo provedení? Koukám, že tohle fórum je o samomluvě, samořešení a ostatní aby kopírovali. Mám tam menší problémy, které vyřeším, ale řešení neuveřejním už jen proto, že nikdo neměl nejmenší snahu pomoct. Jsou někdy chvilky kdy se stydím, že jsem čech. Všichni plivete na Arabáše, ale nešaháme jim povahově ani pokotníky.

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:

0