大使館で日付の利用可能性を確認するためのスクリプト

前書き:


ベラルーシでは、ユーロ圏(つまり、シェンゲン)へのビザの取得に深刻な問題があります。 これはすべて、ポーランド大使館がショッピング用のいわゆるマルチビザ(複数)を提供しているためです。 登録はオンラインで大使館のウェブサイトで行われます。 しかし、全体の問題は、空き日がないことです。 唯一のオプションは、24時間体制でページをチェックすることです。日付が表示された場合は、すぐに「キャッチ」して登録を完了します。 なぜなら 24時間チェックの自由時間がありません;このプロセスを自動化する決定が下されました。

ただちに、無料の日付をキャッチし、人々が支払いを受けるさまざまなスクリプトがあることを予約します。 私のスクリプトは、速度、品質などにおいて彼らの場所であると主張していません。 このスクリプトは自分専用に作成されたものであり、商業的なメリットやその他のメリットは追求しませんでした。



問題ステートメントと入力データ:


まず、登録プロセスがどのように進むかを研究する必要がありました。

大使館のウェブサイトへのリンク: by.e-konsulat.gov.pl

メインページには、国と都市を選択できる2つの選択項目があります。 必要なパラメーターを選択したらby.e-konsulat.gov.pl/Informacyjne/Placowka.aspx?IDPlacowki=94にリダイレクトします

次に、メニューから「シェンゲンビザ-フォームを登録」を選択し、 by.e-konsulat.gov.pl / Uslugi / RejestracjaTerminu.aspx?IDUSLUGI = 8&IDPlacowki = 94にアクセスします。 前のページを自動化しても意味がありません(もちろん、その前にこのURLにクリーンなCookieを入力する可能性を確認しました)

次に、キャプチャが表示されます。 それを入力すると、結果が表示されます-無料の日付がありません。

このデータに基づいて、将来のスクリプトの概要をスケッチできます。

画像



ツール選択


何をする必要があるかを決めた後、適切なツールについて疑問が生じました。 私はすぐに予約をしたい、私はプログラマーではない、私はテスターだ。 しかし、いくつかの言語スキルが存在します。

最初は、TestCompleteでこのプロセスを自動化したかったのです。 自動化後、いくつかの問題が発生しましたが、その主な原因はスクリプトの速度でした。さらに、Mozzila 3.5ブラウザーで動作する古いバージョンのテストスイート7.5を使用しました。 このような古いブラウザでは、要素の表示が不完全であり、レイアウトが適切に配置されることを理解しています。 したがって、私はこのツールで得点し、Selenium WebDriverを調べました。

スクリプト言語としてPythonが選択されました。 彼に選ばれた理由は1つだけでした。私はこのスクリプト言語に少し精通していました。たとえば、Javaに乗って学習する時間も欲望もありませんでした。



キャプチャを使用する


実際、これらのアクションを自動化することは難しくありませんが、悪意のあるキャプチャはすべてを台無しにします。 全体の問題は、CAPTCHAが1〜2か月ごとに変更されたため、CAPTCHAを解決する技術(テンプレート、マスクなどの作成)について考えることには意味がなかったことです。 このため、私はアンチゲートに従事することにしました。

そこに登録して3ドルを投げることで、3000キャプチャのリソースを受け取りました。

しかし、今では、このキャプチャを処理するアルゴリズムを考え直し、アンチゲートに送信し、キャプチャの値を取得する必要がありました。 次のようになりました。

画像

アンチゲートを使用するために、このサービスのAPIを使用しました。 PHPのサーバーをローカルマシンに展開する必要がありましたが、気にすることなく、Denwerが選択しました。 ローカルサイトtest1.ruを作成し、APIサービスを操作するためにphpページに配置します。

このページのリスト

<?php function recognize( $filename, $apikey, $is_verbose = true, $sendhost = "antigate.com", $rtimeout = 10, $is_phrase = 0, $is_regsense = 1, $is_numeric = 0, $min_len = 4, $max_len = 4, $is_russian = 1) { if (!file_exists($filename)) { if ($is_verbose) echo "<b>file $filename not found</b>"; return false; } $fp=fopen($filename,"r"); if ($fp!=false) { $body=""; while (!feof($fp)) $body.=fgets($fp,1024); fclose($fp); $ext=strtolower(substr($filename,strpos($filename,".")+1)); } else { if ($is_verbose) echo "<b>could not read file $filename<b>"; return false; } if ($ext=="jpg") $conttype="image/pjpeg"; if ($ext=="gif") $conttype="image/gif"; if ($ext=="png") $conttype="image/png"; $boundary="---------FGf4Fh3fdjGQ148fdh"; $content="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"method\"\r\n"; $content.="\r\n"; $content.="post\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"key\"\r\n"; $content.="\r\n"; $content.="$apikey\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"phrase\"\r\n"; $content.="\r\n"; $content.="$is_phrase\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"regsense\"\r\n"; $content.="\r\n"; $content.="$is_regsense\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"numeric\"\r\n"; $content.="\r\n"; $content.="$is_numeric\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"min_len\"\r\n"; $content.="\r\n"; $content.="$min_len\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"max_len\"\r\n"; $content.="\r\n"; $content.="$max_len\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"is_russian\"\r\n"; $content.="\r\n"; $content.="$is_russian\r\n"; $content.="--$boundary\r\n"; $content.="Content-Disposition: form-data; name=\"file\"; filename=\"capcha.$ext\"\r\n"; $content.="Content-Type: $conttype\r\n"; $content.="\r\n"; $content.=$body."\r\n"; $content.="--$boundary--"; $poststr="POST http://$sendhost/in.php HTTP/1.0\r\n"; $poststr.="Content-Type: multipart/form-data; boundary=$boundary\r\n"; $poststr.="Host: $sendhost\r\n"; $poststr.="Content-Length: ".strlen($content)."\r\n\r\n"; $poststr.=$content; $fp=fsockopen($sendhost,80,$errno,$errstr,30); if ($fp!=false) { fputs($fp,$poststr); $resp=""; while (!feof($fp)) $resp.=fgets($fp,1024); fclose($fp); $result=substr($resp,strpos($resp,"\r\n\r\n")+4); } else { if ($is_verbose) echo "<b>could not connect to anti-captcha</b>"; if ($is_verbose) echo "<b>socket error: $errno ( $errstr )</b>"; return false; } if (strpos($result, "ERROR")!==false or strpos($result, "<HTML>")!==false) { if ($is_verbose) echo "<b>server returned error: $result</b>"; return false; } else { $ex = explode("|", $result); $captcha_id = $ex[1]; if ($is_verbose) echo "<b>$captcha_id</b>"; } } $text=recognize("captcha.png","       ",true,"antigate.com"); ?>
      
      





何が起こっているのかを完全には理解していませんでしたが、設定したのは次の設定だけでした。

  $is_phrase = 0, //     $is_regsense = 1, //   ? $is_numeric = 0, //  ? $min_len = 4, //  $max_len = 4, //  $is_russian = 1 //   
      
      





その結果、index.phpが配置されているディレクトリにcaptcha.png画像を配置し、test1.ru urlを通過する必要があります。

その結果、キャプチャが推測されると、タグbで囲まれたIDがサービスに届くか、表示されるエラーが発生します。

小さい場合はそのままで、idでページからcaptchaの値を取得します。



スクリプト作成


なぜなら すべての準備が完了しているため、スクリプトの作成に直接進むことができます。

2つの開いているFirefoxウィンドウで作業します。 なぜなら 1つのウィンドウで日付のチェックが行われ、2番目のウィンドウですべての作業がキャプチャに関連します。 新しいウィンドウにcaptchaを表示するには、ページ上の要素をidで検索し、現在のcaptchaのURLを読み取ります。 このURLにアクセスすると、キャプチャの画像のみが取得され、不要な要素は含まれません。

画像



次に、コメント付きのスクリプトをリストします。

 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait import time driver = webdriver.Firefox() #   () add_driver = webdriver.Firefox() #       driver.get("https://by.e-konsulat.gov.pl/Uslugi/RejestracjaTerminu.aspx?IDUSLUGI=8&IDPlacowki=94") #    captcha_url = driver.find_element_by_id('c_uslugi_rejestracjaterminu_ctl00_cp_botdetectcaptcha_CaptchaImage').get_attribute('src') #     id   ,      add_driver.get(captcha_url) #      add_driver.set_window_size(50,200) #   ,     ,     add_driver.get_screenshot_as_file('captcha.png') #  ,                test1.ru, ..     ,     add_driver.get(http://test1.ru) #    ,     captcha_id = add_driver.find_element_by_xpatch('//b') # ,     b,  ,    id  count = false while (count == false) add_driver.get('http://antigate.com/res.php?key=    &action=get&id=" + captcha_id) captcha_complete = add_driver.find_element_by_xpatch('//pre').text #    (      pre) if (captcha_complete.find('ERROR') >= 0) #,    time.sleep(5) # 5  else count = true #    #        captcha_complete,      driver.find_element_by_id('ctl00_cp_BotDetectCaptchaCodeTextBox').send_keys(captcha_complete) #       driver.find_element_by_id('ctl00_cp_btnDalej').click() #       result = driver.find_element_by_id('ctl00_cp_lblBrakTerminow').text if (result.find('') >= 0) print(' ') else print(' ')
      
      







今後の改善


基礎の準備が完了し、スクリプトがページに移動し、キャプチャを受け取り、認識サービスを介して認識し、キャプチャを入力し、クリックして日付を確認します。 自分のために、私は次のことを行いました-このすべてのアクションをwhile(true)ループに入れ、日付がキャッチされるまでサイトをチェックしました(肯定的な結果の場合、石鹸に手紙を送ることも追加しました)。 もちろん、スクリプトには多くの改善点があります。たとえば:

1)エラーをチェックし、エラーに基づいてさまざまなアクションを実行します

2)間違ったキャプチャにチェックを入れて、アンチゲートにレポートを送信します(悪い従業員について文句を言います)

3)日付チェッカーだけでなく、自動レコーダーを追加します

など



あとがき


もう一度、このスクリプトがかなり弱いという予約をしたいと思いますが、それから結果がありました。 また、大使館は愚か者とはほど遠いものであり、多くの場合キャプチャを変更するため、新しい条件でスクリプトを書き直す必要があることに注意してください。



All Articles