Pisze właśnie automat do automatyzacji uzupełniania formularza na zewnętrznej stronie do której nie mam dostępu od strony ftp.
Do odwoła używam biblioteki curl. Problem polega na analizie zapytań w momencie kiedy strona robi przekierowanie nie wyświetlając ani błedu anni komunikatu jedynie przekierowuje na strone z informacją że zapytanie jest błedne. Wydaje mi się że wysyłam wszystkie parametry jakie są oczekiwane na następnym kroku ale prawdopodobnie jestem jakoś wykrywany lub poprostu robie coś źle. poniżej fragment kodu
function get_headers_from_curl_response($response) { if ($i === 0) $headers['http_code'] = $line; else { $headers[$key] = $value; } return $headers; } function get_body_from_curl_response($response) { } // jeśli nie ma to obsługuje ale nie dodaje pliku $tmpCookieFilePath = __DIR__ . '/tmp'; file_put_contents($tmpCookieFile, ''); chmod($tmpCookieFile,0777); // $tmpCookieFile = ''; $visaTypeNo = 3; $postData = 'service_requested=' . $visaTypeNo; $agentUser = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0'; $sslOn = 1; $followlocation = 1; $returnTransfer = 1; $curlPost = 1; $cookieSession = 1; $ch = curl_init(); // etap 1 wejście w sesje formularzy curl_setopt( $ch, CURLOPT_URL, 'https://indianvisaonline.gov.in/visa/Registration'); curl_setopt( $ch, CURLOPT_HEADER, 1 ); // pobieram nagłówek curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData ); // dane post curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $sslOn ); // wyłaczam werifikacje ssl curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $sslOn ); // wyłaczam werifikacje ssl curl_setopt( $ch, CURLOPT_USERAGENT, $agentUser ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, $returnTransfer ); // pobieram body curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, $followlocation ); // podążam za lokacją curl_setopt( $ch, CURLOPT_COOKIESESSION, $cookieSession ); curl_setopt( $ch, CURLOPT_COOKIEJAR, $tmpCookieFile ); // - określam plik ciasteczek curl_setopt( $ch, CURLOPT_REFERER, "https://indianvisaonline.gov.in/visa/tvoa.html" ); // dowiązanie z poprzedniej strony curl_setopt( $ch, CURLOPT_POST, $curlPost ); // post jest przesyłany $data = curl_exec($ch); $info = curl_getinfo($ch); $headerData = get_headers_from_curl_response($data); $bodyData = get_body_from_curl_response($data); foreach( $cookieData as $cData ) { $sessionCookieData = $cData; } } } // pobieram token $dom = new DOMDocument(); $dom->loadHTML($bodyData); // name $elements = $dom->getElementsByTagName('input'); foreach ($elements as $element) { if( $element->getAttribute('name') == 'token' ) $token = $element->getAttribute('value'); } // generate image url $output = curl_exec( $ch ); $info = curl_getinfo( $ch ); $url = "https://indianvisaonline.gov.in/visa/captcha?rand=" . $time_stamp; $urlRef = 'https://indianvisaonline.gov.in/visa/Registration?service_requested=3'; 'returnTransfer' => $returnTransfer, 'sslOn' => $sslOn, 'agentUser' => $agentUser, 'followlocation' => $followlocation, 'cookieSession' => $cookieSession, 'tmpCookieFile' => $tmpCookieFile, 'url' => $url, 'urlRef' => $urlRef ); // form 2 pobranie tekstu z obrazka captcha - używam serwisu anti captcha $captaResult = getCaptcha( $args, $ch ); $email = 'ala@op.pl'; $nationality = 'POL'; $jurneyDate = '25/12/2016'; $birthdate = '04/11/1996'; $portOfArival = 'I022'; /* * Pola * appl.birthdate * appl.email * appl.email_re * appl.journeydate * appl.missioncode * appl.nationality * appl.ppt_type_id * captcha * submit_registration=Continue * token * */ // etap 2 przejście z 1 do 2 formularza 'appl.birthdate' => $birthdate, 'appl.email' => $email, 'appl.email_re' => $email, 'appl.journeydate' => $jurneyDate, 'appl.missioncode' => $portOfArival, 'appl.nationality' => $nationality, 'appl.ppt_type_id' => 1, 'captcha' => $captaResult, 'submit_registration' => 'Continue', 'token' => $token, ); $postData = http_build_query( $postData ); curl_setopt( $ch, CURLOPT_URL, 'https://indianvisaonline.gov.in/visa/Registration'); curl_setopt( $ch, CURLOPT_HEADER, 1 ); // pobieram nagłówek curl_setopt( $ch, CURLINFO_HEADER_OUT, true ); // pobieram nagłówek curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $sslOn ); // wyłaczam werifikacje ssl curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $sslOn ); // wyłaczam werifikacje ssl curl_setopt( $ch, CURLOPT_USERAGENT, $agentUser ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, $returnTransfer ); // pobieram body curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, $followlocation ); //$followlocation ); // podążam za lokacją curl_setopt( $ch, CURLOPT_COOKIESESSION, $cookieSession ); curl_setopt( $ch, CURLOPT_COOKIEFILE, $tmpCookieFile ); // - określam plik ciasteczek curl_setopt( $ch, CURLOPT_REFERER, 'https://indianvisaonline.gov.in/visa/Registration?service_requested=3' ); // dowiązanie z poprzedniej strony curl_setopt( $ch, CURLOPT_POST, $curlPost ); // post jest przesyłany $data = curl_exec($ch); $info = curl_getinfo($ch); $bodyData = ''; $headerData = get_headers_from_curl_response($data); $bodyData = get_body_from_curl_response($data); }
Formularz składa się z kilku etapów natomiast narazie mam problem z określeniem co może być przyczyną przekierowania mnie na adres https://indianvisaonline.gov.in/visa/invalid.html zamiast przejście na stronę https://indianvisaonline.gov.in/visa/BasicDetails. Ścieżka wejścia na formularz ze strony to wejście na adres https://indianvisaonline.gov.in/visa/tvoa.html i kliknięcie przycisku w menu górnym "e-Tourist Visa Application". Oczywiście moim zamiarem nie jest włamanie do formularza tylko zautomatyzowanie pracy w biurze aby nie trzeba było za każdym razem wpisywać tych samych danych do crm i do formularza na stronie.