CAPTCHAソリューションの自動化

公式サイトの説明によると：

「2captcha.comは手動の画像認識によるCAPTCHA突破サービスです。こちらではスキャンしたドキュメント、レターヘッド、CAPTCHAからリアルタイムでテキストを認識する必要がある人と、画面からテキストを入力してお金を稼ぎたい人を見つけることができます。

The system employs English-speaking and Russian-speaking workers.
このシステムでは英語を話す作業者とロシア語を話す作業者が働いています。

アンチCAPTCHAサービス、2captcha.comは、pixodrom、antigate、anti-captchaなどのサービスと同等の標準 APIをサポートするだけでなく、自動化との戦いのあらゆる段階で必要となる高度な機能を続々と追加しています。2captcha APIはReCaptcha v2(写真をクリックする必要がある)、ClickCaptcha(特定のポイントをクリックする必要がある)、および Rotatecaptcha(適切に回転する必要があるFunCaptchaおよびその他のCAPTCHA)のいずれにも対応しています。」

まあ、悪くないですね！

この方法では、ブラウザをエミュレートして画像を送信しなくてもCAPTCHAを実行できます。そしてさらに重要なのはこの方法により100%正しく突破されたCAPTCHAが得られることです。

では、どのデータを取得する必要があり、どこでそれを見つけ、どこに挿入すればよいのでしょうか? (F12 を押して) ページのHTMLコードを確認してみてください。:

- パラメーター「data-sitekey」を見つけてください。 — これはサイトキーであり、サイトごとに一定でユニークなものです。 (サイト管理者が手動で変更する場合以外)。
- テキストエリアを見つけてください。

```
<textarea id="g-recaptcha-response" 
name="g-recaptcha-response" 
class="g-recaptcha-response" 
style="width: 250px; height: 40px;
border: 1px solid #c1c1c1; margin: 10px 25px; 
padding: 0px; resize: none; "></textarea> 
```

こちらでサービスからのレスポンスを挿入する必要があります。

インストレーション
もちろん、それだけでは十分ではありません。本物のプログラマーはすべてを自動化します。では、適切なライブラリを使用してPythonでCAPTCHA防止プログラムを作成しましょう。

// こちらでこの画像を貼り付けします。
https://dantealighierin.github.io/assets/robot_captcha.gif

次の方法を使ってモジュールをインストールできます。:

## pip経由
```
pip3 install python-2captcha
```

githubのページに載っているpipですが、私の場合は対応するパッケージが見つからなかったので、pip3で全てやりました(どうやら開発者は古いものではなく、現在のpythonのブランチを使うことにしたようです)。

## またはソースからコンパイル
```
git clone https://github.com/AndreiDrang/python-2captcha.git
cd python-2captcha
python setup.py install
```

## 動作の例
あるいは、Callback APIを使用することもできます。ただし、その場合だとテストはローカルサーバーで実行され、ローカルクライアントを使用して2captchaからのPOST要求をエミュレートします。動作原理は下の図で確認できます。

ただし、この方法は合理的ではありません。小さな問題であったとしてもそれを解決するために、サーバーを起動するからです。

すべてはよりシンプルにすることができます。:

## Simple captcha

```py
from python_2captcha import ImageCaptcha
# Enter here your 2captcha’s API-key (can be found in your account settings)
2CAPTCHA_KEY = ""
# Link to the captcha image
image_link = ""
# Here is a JSON with information about captcha
user_answer = ImageCaptcha.ImageCaptcha(2captcha_key=2CAPTCHA_KEY).captcha_handler(captcha_link=image_link)

if not user_answer['error']:
    # captcha solution
    print(user_answer['captchaSolve'])
    print(user_answer['taskId'])
elif user_answer['error']:
    # Error body in case of error
    print(user_answer['errorBody']['text'])
    print(user_answer['errorBody']['id'])
```

## KeyCaptcha

```py
from python_2captcha import KeyCaptcha
# Enter here your 2captcha’s API-key (can be found in your account settings)
2CAPTCHA_KEY = ''

answer = KeyCaptcha.KeyCaptcha(2captcha_key=2CAPTCHA_KEY) \
    .captcha_handler(key_params = {
                's_s_c_user_id':15,
                        's_s_c_session_id':'',
                        's_s_c_web_server_sign':'',
                        's_s_c_web_server_sign2':'',
                        'pageurl':'https://www.keycaptcha.com/signup/'
            }
    )

# Captcha solved properly, error = 0
if not answer['error']:
    # captcha solution
    print(answer['captchaSolve'])
    print(answer['taskId'])
# error occured while solving the captcha, error = 1
elif answer['error']:
    # Error body in case of error
    print(answer['errorBody'])
```

## ReCaptcha v.2

```py
from python_2captcha import ReCaptchaV2
# Enter here your 2captcha’s API-key (can be found in your account settings)
2CAPTCHA_KEY = ""
# G-ReCaptcha site key
SITE_KEY = ""
# Link to the page with ReCaptcha on it
PAGE_URL = ""
# Here is a JSON with information about captcha
user_answer = ReCaptchaV2.ReCaptchaV2(2captcha_key=2CAPTCHA_KEY).captcha_handler(site_key=SITE_KEY,
                                                                                   page_url=PAGE_URL)

if not user_answer['error']:
    # captcha solution
    print(user_answer['captchaSolve'])
    print(user_answer['taskId'])
elif user_answer['error']:
    # Error body in case of error
    print(user_answer['errorBody']['text'])
    print(user_answer['errorBody']['id'])
```

## ReCaptcha v.3
どのソリューションも似たような構造を持っているため、ここまで実際の例については説明しませんでした。サイトで見つけたURLとサイトキーなどを入力します。ReCaptchaの3 番目のバージョンの例として特定のタスクのソリューションを提示することにしました。:

```py
from python_2captcha import ReCaptchaV3
# Enter here your 2captcha’s API-key (can be found in your account settings)
2CAPTCHA_KEY = ""
# G-ReCaptcha site key
SITE_KEY = ""
# Link to the page with ReCaptcha on it
PAGE_URL = ""
# Value of action parameter which was found in the page code
ACTION = 'verify'
# Worker’s rating needed, from 0.1 (bot) to 0.9 (human)
MIN_SCORE = 0.4
# Here is a JSON with information about captcha
user_answer = ReCaptchaV3.ReCaptchaV3(2captcha_key=2CAPTCHA_KEY, 
                      action = ACTION, 
                      min_score = MIN_SCORE).captcha_handler(site_key=SITE_KEY,
                                         page_url=PAGE_URL)

if not user_answer['error']:
    # captcha solution
    print(user_answer['captchaSolve'])
    print(user_answer['taskId'])
    print(user_answer['user_check'])
    print(user_answer['user_score'])
elif user_answer['error']:
    # Error body in case of error
    print(user_answer['errorBody']['text'])
    print(user_answer['errorBody']['id'])
```

テストには次のサイトを使います。: https://patrickhlauke.github.io/recaptcha/

コードの中で必要なデータを置き換えましょう。:

```py
from python_2captcha import ReCaptchaV3
# Enter here your 2captcha’s API-key (can be found in your account settings)
2CAPTCHA_KEY = ""
# G-ReCaptcha site key
SITE_KEY = "6Ld2sf4SAAAAAKSgzs0Q13IZhY02Pyo31S2jgOB5"
# Link to the page with ReCaptcha on it
PAGE_URL = "https://patrickhlauke.github.io/recaptcha/"
# Value of action parameter which was found in the page code
ACTION = 'verify'
# Worker’s rating needed, from 0.1 (bot) to 0.9 (human)
MIN_SCORE = 0.4
# Here is a JSON with information about captcha
user_answer = ReCaptchaV3.ReCaptchaV3(2captcha_key=2CAPTCHA_KEY, 
                      action = verify, 
                      min_score = 0.4).captcha_handler(site_key=6Ld2sf4SAAAAAKSgzs0Q13IZhY02Pyo31S2jgOB5,
                                         page_url=https://patrickhlauke.github.io/recaptcha/)

if not user_answer['error']:
    # captcha solution
    print(user_answer['captchaSolve'])
    print(user_answer['taskId'])
    print(user_answer['user_check'])
    print(user_answer['user_score'])
elif user_answer['error']:
    # Error body in case of error
    print(user_answer['errorBody']['text'])
    print(user_answer['errorBody']['id'])
```

課題は解決しました。:

Price policy価格ポリシー
CAPTCHA認識コストが非常に低く、CAPTCHA 1件当たり$0.0005からであることは注目に値します。便宜上、すべての価格はCAPTCHA 1000件ごとに計算されますが、システム内の請求は各CAPTCHAごとに個別に行われます。違うタイプのCAPTCHAは異なる価格で認識されます。

- Simple captcha: 1000件あたり$0.5から$1
価格はサービスの負荷によって変わります。 負荷が低い場合、価格も低くなります。そしてサービスの負荷が高いほど価格が高くなります。統計画面では、最近1時間ごとの平均価格を確認できます。

- Big CAPTCHA、ReCaptcha v2の画像: 1000件当たり$1
Big CAPTCHAは、高さと幅の合計が400ピクセルを超えるものです。サーバーの負荷に関係なく、価格はいつでも$1です。ReCaptcha v2 画像とは正しい正方形を選択する必要があるrecaptchaの写真になります。

- ReCaptcha v2トークン: 1000件当たり$2.99
割引、プロモコード、ボーナスがないにもかかわらず、かなり安価になっています。ただし、誰かに紹介することなく、1か月間毎日2,000ドル以上を費やす場合は、「サポート」セクションでメッセージをいただければ割引価格で提供します。