Witam wszystkich.
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)
{
$header_text = substr($response, 0
, strpos($response, "\r\n\r\n"));
foreach (explode("\r\n", $header_text) as $i => $line) if ($i === 0)
$headers['http_code'] = $line;
else
{
list
($key, $value) = explode(': ', $line);
$headers[$key] = $value;
}
return $headers;
}
function get_body_from_curl_response($response)
{
return substr($response, strpos($response, "\r\n\r\n") + 4
); }
// jeśli nie ma to obsługuje ale nie dodaje pliku
$tmpCookieFilePath = __DIR__ . '/tmp';
$tmpCookieFile = $tmpCookieFilePath . '/cookie_' . microtime(true) . '.txt'; 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);
if( !empty($data) && $info['http_code'] == 200
){ $headerData = get_headers_from_curl_response($data);
$bodyData = get_body_from_curl_response($data);
$cookieData = explode(';', $headerData['Set-Cookie']);
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 );
$currDate = date('d/m/Y'); $arrivalDateMin = date('d/m/Y', strtotime( '+4 day', $currDate )); $arrivalDateMax = date('d/m/Y', strtotime( '+34 day', $currDate ));
$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 = '';
if( !empty($data) && $info['http_code'] == 200
){ $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.