Autor Zpráva
Dvory59
Profil
Ahoj,
mám takový problém, který se netýká přímo PHP, ale v mém případě to s tím tak nějak souvisí.
Snažím se posílat request na tuto stránku pomocí toho kódu
$query = http_build_query($data);
$request = [
        'http' => [
                'method' => "POST",
                'header' =>
                        "Accept-language: en-US,en;q=0.5\r\n" .
                        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
                        "Connection: keep-alive\r\n".
                        "Host: www.rvvi.cz\r\n".
                        "Referer: https://www.rvvi.cz/riv?s=rozsirene-vyhledavani\r\n".
                        "Upgrade-Insecure_Requests:1\r\n".
                        "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/2010\r\n".
                        "Cookie: foo=bar\r\n".
                        "Content-type: application/x-www-form-urlencoded\r\n",
                "Content-Length: ".strlen($query)."\r\n",
                'content' => $query],
];
$context=stream_context_create($request);
$page = file_get_html("https://www.rvvi.cz/riv",false,$context);
ale dostávám tento error :

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at www.rvvi.cz…yGothics.ttf. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Hledal jsem co to znamená a podle informací na developer.moz­zila.org jsem tak nějak pochopil, že k tomu aby můj request prošel by museli mít na straně serveru ke kterému tento požadavek posílám nastaveno něco ve smyslu : "Access-Control-Allow-Origin: *" ,takže s tím nic neudělám, pokud to nemají povolené.
Nevím ale, jeslti jsem to pochopil správně, protože jsem našel spoustu lidí, co řeší stejný problém a povedlo se jim ho vyřešit. Nicméně řešení, které jsem od nich našel na to mé nefunguje.

Proto jsem z toho celkem zmatený a nevím, jeslti s tím opravdu něco mohu udělat nebo ne.

Setkal se už někdo s tímto problémem, případně neví prosím někdo jak ho vyřešit?
Budu vděčný za jakoukoliv radu!
Keeehi
Profil
Dvory59:
Nemohu chybu zreplikovat. Například

        $data = [

            'rivB' => [
                "zu_dv" => "P",
                "zu_kv" => 0,
                "zu_jv" => "cze",
                "zu_dd" => "AV0",
                "zu_ik" => "",
                "pv_no" => "",
                "pc_ks" => "",
                "pv_ico" => "",
                "pv_noj" => "",
                "pv_koj" => "",
                "pv_pr" => "",
                "pv_jm" => "",
                "pv_ss_rok" => 0,
                "pv_ss_pos" => "",
                "pv_ss" => 2,
                "tv_pr" => "",
                "tv_jm" => "",
                "tv_iv" => "",
                "vy_sp" => "",
                "vy_na" => "",
                "vy_rs_o" => 2017,
                "vy_rs_d" => "-",
                "vy_ru_o" => 2017,
                "vy_ru_d" => "-",
                "vy_os" => "",
                "vy_ks" => "",
                "vy_ii" => "",
                "vy_nd" => "",
                "vy_ps_min" => "",
                "vy_ps_max" => "",
                "kp_vooecd" => [
                    "F0" => 0,
                    "F1" => 0,
                    "F2" => 0
                ],
                "nv_vd" => "",
                "nv_os" => "",
                "nv_ikp" => ""
            ],
            "s" => "rozsirene-vyhledavani",
            "e" => 1,
            "searchHash" => "831fda16d416c0fd3582b30b84fb8bc53626b82a",
            "searchKey" => 41212207
        ];
        $query = http_build_query($data);
        $request = [
            'http' => [
                'method' => "POST",
                'header' =>
                    "Accept-language: en-US,en;q=0.5\r\n" .
                    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
                    "Connection: keep-alive\r\n".
                    "Host: www.rvvi.cz\r\n".
                    "Referer: https://www.rvvi.cz/riv?s=rozsirene-vyhledavani\r\n".
                    "Upgrade-Insecure_Requests:1\r\n".
                    "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/2010\r\n".
                    "Cookie: PHPSESSID=8c2ci90pv5gg67ms52sran5270\r\n".
                    "Content-type: application/x-www-form-urlencoded\r\n",
                "Content-Length: ".strlen($query)."\r\n",
                'content' => $query],
        ];
        $context=stream_context_create($request);
        $page = file_get_contents("https://www.rvvi.cz/riv",false,$context);
        echo $page;
Mi vrátí 5 patentů z roku 2017. Samozřejmě je potřeba mít správný searchHash a PHPSESSID. Taky jsem změnil funkci file_get_html na file_get_contents, protože pro test odmítám k tomu stahovat nějakou další knihovnu a ta knihovna stejně interně používá tuto funkci. Jinak CORS hlavičky by na to neměly mít vliv. Ty totiž vyhodnocují prohlížeče, knihovny tyto hlavičky nezajímají.
Dvory59
Profil
Keeehi:
V první řadě bych ti chtěl moc poděkovat, že jsi si na to udělal čas. Problém byl právě v té cookie a searchHash.
Jen mám trochu problém v automatizaci tohoto scriptu.. Teda jestli vůbec jde udělat automatickej.

Co se PHPSESSID týče, to dostanu z get_headers(), ale asi problém bude v tom searchHash, popřípadě i v tom searchKey.
Nenapadá tě, jestli by byla nějaká cesta jak tyhle dva paramatery nějak dostat, abych je mohl přidávat a posílat automaticky jako proměnnou?
Keeehi
Profil
Dvory59:
Musíš si nejdříve načíst stránku s formulářem a ty data v nich najít. A potom je použít v druhém dotazu.
Dvory59
Profil
Keeehi:

Zkouším to, ale uvízl sem na slepé koleji :/ Nevím , jestli na to jdu vůbec dobře. Mohl by jsi se prosím na tohle mrknout, jestli nejsem uplně vedle?

Prvně si najdu to PHPSESSID
$header = (get_headers("https://www.rvvi.cz/riv"));
$set_cookie = str_replace("; path=/","",$header[7]);
$cookie= str_replace(" ","",str_replace("Set-","",$set_cookie));
Tenhle kód mi z té hlavičky vyseparuje Cookie v podobě "Cookie:PHPSESSID=****"

Potom s touto $cookie v hlavičce a s prázdnými daty pošlu požadavek s cílem zjistit Hash a Key :
$data=[];
$query = http_build_query($data);
$request = [
    'http' => [
        'method' => "POST",
        'header' =>
            "Accept-language: en-US,en;q=0.5\r\n" .
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
            "Connection: keep-alive\r\n".
            "Host: www.rvvi.cz\r\n".
            "Referer: https://www.rvvi.cz/riv?s=rozsirene-vyhledavani\r\n".
            "Upgrade-Insecure_Requests:1\r\n".
            "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/2010\r\n".
            "".$cookie."\r\n".
            "Content-type: application/x-www-form-urlencoded\r\n",
        "Content-Length: ".strlen($query)."\r\n",
        'content' => $query],
];
$context=stream_context_create($request);
$page=file_get_html("https://www.rvvi.cz/riv",false,$context);
Potom z toho vypreparuju value $hash a $key
$hash=$page->find("input[name=searchHash]",0)->value;
$key=$page->find("input[name=searchKey]",0)->value;
To mi najde hash a key v pohodě. Teda aspoň to tak vypadá, ale když pošlu další požadavek se stejnou cookie jako sem poslal ten první a s daty ve kterých je už $hash a $key, tak sem na konci této strastiplné cesty a dostávám Nelze vyhledat požadované výsledky.
Ten poslední požadavek je uplně stejný jako předtím, pro ušetření už tak dost spamovýho příspěvku ukážu jen jak dávám ten konkrétní $hash a $key do pole
"searchHash" => "".$hash."",
"searchKey" => "".$key.""
, kde ty uvozovky jsou pravděpodobně zbytečný, ale už jsem to zkoušel posílat i ve stojce, jeslti to náhodou nepomůže... Nepomohlo...

Nevíš prosím, proč mi to takhle dělá?

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: