Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Analiza zapytań http
Forum PHP.pl > Forum > PHP
Raptor1
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

  1. function get_headers_from_curl_response($response)
  2. {
  3. $headers = array();
  4.  
  5. $header_text = substr($response, 0, strpos($response, "\r\n\r\n"));
  6.  
  7. foreach (explode("\r\n", $header_text) as $i => $line)
  8. if ($i === 0)
  9. $headers['http_code'] = $line;
  10. else
  11. {
  12. list ($key, $value) = explode(': ', $line);
  13.  
  14. $headers[$key] = $value;
  15. }
  16.  
  17. return $headers;
  18. }
  19.  
  20. function get_body_from_curl_response($response)
  21. {
  22. return substr($response, strpos($response, "\r\n\r\n") + 4 );
  23. }
  24.  
  25. // jeśli nie ma to obsługuje ale nie dodaje pliku
  26.  
  27.  
  28. $tmpCookieFilePath = __DIR__ . '/tmp';
  29. $tmpCookieFile = $tmpCookieFilePath . '/cookie_' . microtime(true) . '.txt';
  30. file_put_contents($tmpCookieFile, '');
  31. chmod($tmpCookieFile,0777);
  32.  
  33.  
  34. // $tmpCookieFile = '';
  35. $visaTypeNo = 3;
  36. $postData = 'service_requested=' . $visaTypeNo;
  37. $agentUser = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0';
  38. $sslOn = 1;
  39. $followlocation = 1;
  40. $returnTransfer = 1;
  41. $curlPost = 1;
  42. $cookieSession = 1;
  43.  
  44. $ch = curl_init();
  45.  
  46. // etap 1 wejście w sesje formularzy
  47.  
  48. curl_setopt( $ch, CURLOPT_URL, 'https://indianvisaonline.gov.in/visa/Registration');
  49. curl_setopt( $ch, CURLOPT_HEADER, 1 ); // pobieram nagłówek
  50. curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData ); // dane post
  51. curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $sslOn ); // wyłaczam werifikacje ssl
  52. curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $sslOn ); // wyłaczam werifikacje ssl
  53. curl_setopt( $ch, CURLOPT_USERAGENT, $agentUser );
  54. curl_setopt( $ch, CURLOPT_RETURNTRANSFER, $returnTransfer ); // pobieram body
  55. curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, $followlocation ); // podążam za lokacją
  56. curl_setopt( $ch, CURLOPT_COOKIESESSION, $cookieSession );
  57. curl_setopt( $ch, CURLOPT_COOKIEJAR, $tmpCookieFile ); // - określam plik ciasteczek
  58. curl_setopt( $ch, CURLOPT_REFERER, "https://indianvisaonline.gov.in/visa/tvoa.html" ); // dowiązanie z poprzedniej strony
  59. curl_setopt( $ch, CURLOPT_POST, $curlPost ); // post jest przesyłany
  60.  
  61. $data = curl_exec($ch);
  62. $info = curl_getinfo($ch);
  63.  
  64. if( !empty($data) && $info['http_code'] == 200 ){
  65. $headerData = get_headers_from_curl_response($data);
  66. $bodyData = get_body_from_curl_response($data);
  67. $cookieData = explode(';', $headerData['Set-Cookie']);
  68.  
  69. foreach( $cookieData as $cData ) {
  70. if( preg_match('/^JSESSIONID/', $cData ) ) {
  71. $sessionCookieData = $cData;
  72. }
  73. }
  74. }
  75.  
  76. echo $bodyData;
  77.  
  78. // pobieram token
  79.  
  80. $dom = new DOMDocument();
  81. $dom->loadHTML($bodyData);
  82.  
  83. // name
  84. $elements = $dom->getElementsByTagName('input');
  85.  
  86. foreach ($elements as $element) {
  87. if( $element->getAttribute('name') == 'token' ) $token = $element->getAttribute('value');
  88. }
  89.  
  90. // generate image url
  91.  
  92. $output = curl_exec( $ch );
  93. $info = curl_getinfo( $ch );
  94.  
  95. $time_stamp = number_format(microtime(true)*1000,0,'.','');
  96. $url = "https://indianvisaonline.gov.in/visa/captcha?rand=" . $time_stamp;
  97. $urlRef = 'https://indianvisaonline.gov.in/visa/Registration?service_requested=3';
  98.  
  99. $args = array(
  100. 'returnTransfer' => $returnTransfer,
  101. 'sslOn' => $sslOn,
  102. 'agentUser' => $agentUser,
  103. 'followlocation' => $followlocation,
  104. 'cookieSession' => $cookieSession,
  105. 'tmpCookieFile' => $tmpCookieFile,
  106. 'url' => $url,
  107. 'urlRef' => $urlRef
  108. );
  109.  
  110. // form 2 pobranie tekstu z obrazka captcha - używam serwisu anti captcha
  111. $captaResult = getCaptcha( $args, $ch );
  112.  
  113. $currDate = date('d/m/Y');
  114. $arrivalDateMin = date('d/m/Y', strtotime( '+4 day', $currDate ));
  115. $arrivalDateMax = date('d/m/Y', strtotime( '+34 day', $currDate ));
  116.  
  117. $email = 'ala@op.pl';
  118. $nationality = 'POL';
  119. $jurneyDate = '25/12/2016';
  120. $birthdate = '04/11/1996';
  121. $portOfArival = 'I022';
  122.  
  123. /*
  124.  * Pola
  125.  * appl.birthdate
  126.  * appl.email
  127.  * appl.email_re
  128.  * appl.journeydate
  129.  * appl.missioncode
  130.  * appl.nationality
  131.  * appl.ppt_type_id
  132.  * captcha
  133.  * submit_registration=Continue
  134.  * token
  135.  *
  136.  */
  137.  
  138. // etap 2 przejście z 1 do 2 formularza
  139. $postData = array(
  140. 'appl.birthdate' => $birthdate,
  141. 'appl.email' => $email,
  142. 'appl.email_re' => $email,
  143. 'appl.journeydate' => $jurneyDate,
  144. 'appl.missioncode' => $portOfArival,
  145. 'appl.nationality' => $nationality,
  146. 'appl.ppt_type_id' => 1,
  147. 'captcha' => $captaResult,
  148. 'submit_registration' => 'Continue',
  149. 'token' => $token,
  150. );
  151.  
  152. $postData = http_build_query( $postData );
  153.  
  154. curl_setopt( $ch, CURLOPT_URL, 'https://indianvisaonline.gov.in/visa/Registration');
  155. curl_setopt( $ch, CURLOPT_HEADER, 1 ); // pobieram nagłówek
  156. curl_setopt( $ch, CURLINFO_HEADER_OUT, true ); // pobieram nagłówek
  157. curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData );
  158. curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $sslOn ); // wyłaczam werifikacje ssl
  159. curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $sslOn ); // wyłaczam werifikacje ssl
  160. curl_setopt( $ch, CURLOPT_USERAGENT, $agentUser );
  161. curl_setopt( $ch, CURLOPT_RETURNTRANSFER, $returnTransfer ); // pobieram body
  162. curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, $followlocation ); //$followlocation ); // podążam za lokacją
  163. curl_setopt( $ch, CURLOPT_COOKIESESSION, $cookieSession );
  164. curl_setopt( $ch, CURLOPT_COOKIEFILE, $tmpCookieFile ); // - określam plik ciasteczek
  165. curl_setopt( $ch, CURLOPT_REFERER, 'https://indianvisaonline.gov.in/visa/Registration?service_requested=3' ); // dowiązanie z poprzedniej strony
  166. curl_setopt( $ch, CURLOPT_POST, $curlPost ); // post jest przesyłany
  167.  
  168. $data = curl_exec($ch);
  169. $info = curl_getinfo($ch);
  170.  
  171. $bodyData = '';
  172.  
  173. if( !empty($data) && $info['http_code'] == 200 ){
  174. $headerData = get_headers_from_curl_response($data);
  175. $bodyData = get_body_from_curl_response($data);
  176. }
  177.  
  178. var_dump( $info );
  179. var_dump( $bodyData );


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.
Niree
Jednak edytuję, w zły link wszedłem.

Może captcha coś się nie zgadza?
Raptor1
Może masz rację natomiast na tej stronie wcześniej był troche inny formularz. Zmieniły się pola i linki do kolejnych kroków. Wcześniej captcha działało a mechaniz był w zasadzie ten sam przynajmniej jak wydedukowałem w momwnecie ogólnie sprawdzanie obrazka jest o tyle trudne że w momencie gdy wchodzę do firebuga to tam jest w obrazku link do modułu który zwraca obrazek i w momencie gdy na niego najadę to się zmienia ale na sronie dalej widnieje już nie aktualny obrazek. W skrypcie celowo wywołuje jeszcze raz mechanizm żeby przeładował i pobrał nowy obrazek. Jeśli bym przeszedł po DOM'ie to nie jestem pewien ale efekt mógłby być podobny czyli odwołał by się do linka a moduł pod linkiem zmienił by wartość. Ale nie jestem w 100% pewein nie miałem wcześniej doświadczenia z przechodzeniem przez captcha.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.