Google『reCAPTCHA』を突破！『2Captcha』でブラウザ操作の完全自動化に挑む


# 目次
- [はじめに](#はじめに)
- [2Captchaとは](#2captchaとは)
- [2Captchaの使用準備](#2captchaの使用準備)
- [Python+Selenium+2Captchaで『reCAPTCHAv2』を突破](#pythonselenium2captchaでrecaptchav2を突破)
- [さいごに](#さいごに)
- [参考](#参考)


# はじめに

スクレイピングやブラウザ操作の自動化タスクにおける一番の難所は各種キャプチャの突破だと思います。そもそもキャプチャ機能はロボット操作されないために設置するものなので，それを突破しようとする時点でどうなのという気はしますが，それでもなんとかしたいと思うことがあります。そんなときの解決方法として「**2Captcha**」というサービスがあります。

最近このサービスを知り利用してみたところ，あまりに簡単にキャプチャ突破できたので，ここで紹介しようと思います。

※ ご利用は自己責任でお願いします。くれぐれも悪用しないように。


# 2Captchaとは
![スクリーンショット 2020-11-06 17.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/d6b0191a-22f8-1481-7e39-b078cae81c47.png)

ロシアの会社が提供するキャプチャ機能を突破するためのサービスです。
2CaptchaのAPIを利用することでキャプチャ処理を自動化することができます。
有料サービスですが，APIリクエスト1回の料金は0.3円程度ですので，十分安い金額だと思います。


## 仕組み
2Captchaというサービスでは，難関のキャプチャ機能を圧倒的な人海戦術で突破します。
ユーザーが2CaptchaのAPIを利用して解除したいキャプチャの情報を送信すると，どこかにいる大量のWorkerがキャプチャを解除し必要な情報を返してくれます。

<img width="600" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/be6cd82c-dbea-6b47-2c5c-111db46c1e89.jpeg">


## 言語対応
2CaptchaではAPIをより簡単に利用するための方法として，複数のプログラム言語でライブラリが用意されています。

- PHP : [GitHub](https://github.com/2captcha/2captcha-php) [Packageist](https://packagist.org/packages/2captcha/2captcha)
- Java : [GitHub](https://github.com/2captcha/2captcha-java) [Maven](https://search.maven.org/artifact/com.github.2captcha/2captcha-java)
- C# : [GitHub](https://github.com/2captcha/2captcha-csharp) [Nuget](https://www.nuget.org/packages/2captcha-csharp/)
- Python : [GitHub](https://github.com/2captcha/2captcha-python) [PyPi](https://pypi.org/project/2captcha-python/)
- C++ : [GitHub](https://github.com/2captcha/2captcha-cpp)


# 2Captchaの使用準備

## アカウント登録
https://2captcha.com/ にアクセス
右上の「Registration」ボタンからアカウント登録をします。
![スクリーンショット 2020-11-06 13.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/36d39558-4ddb-e5d6-d235-aaeb425e4099.png)

メールアドレスとパスワードを設定して登録完了です。
<img width="300" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/4066ae10-3c25-3c97-9474-f84eb663cfdd.png">

ログインすると以下のようなページになります。
<img width="600" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/1535ca07-9d7e-dc04-5a85-3df1d40410ec.png">



## 入金
残念ながら2Captchaは無料では利用できません。
ログイン後画面上部の「Add funds」から入金を行います。
※ 入金前は「0$」と表示されているはずです。
![スクリーンショット 2020-11-06 16.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/b7eb6370-faad-c66b-7232-ed4333538723.png)

利用可能な決済サービスを選んで金額を設定します。私はPayPalで払いました。
とりあえず最低入金額の3$入金しましょう。
<img width="600" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/679d20dd-a704-07c0-aa6c-0871c0ad8b39.png">


決済が完了すると,もとの画面の表示が3$に変わっているはずです。
（決済手段によって多少時間がかかる場合があるようです。）


## APIキーの取得
ログイン後画面中央にAPIキーが表示されています。
2Captchaの利用に必要なのでコピーしておきます。

![スクリーンショット 2020-11-06 16.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231104/0e3f964b-0a44-fc30-ef7e-c85a520aaa68.png)


# Python+Selenium+2Captchaで『reCAPTCHAv2』を突破
Pythonを使ってreCAPTCHAv2を突破してみます。

## パッケージインストール
Python用のパッケージが用意されているので，まずはそれをインストールします。

```bash
pip install 2captcha-python
```

また，以下のテストではSeleniumでHeadless Chromeを扱います。
Selniumの準備は[こちらの記事](https://qiita.com/derodero24/items/9e9567790bde9e4b9d0c)などを参考にしてみてください。


## reCAPTCHAのデモページでテスト

今回はこちらのデモページを使って2Captchaのテストをしたいと思います。
https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php

```python
import traceback

import chromedriver_binary
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('YOUR_API_KEY')  # 自分のAPIキーを設定してください
url = 'https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php'


def main():
    # ブラウザ起動
    options = Options()
    options.add_argument('--headless')
    driver = webdriver.Chrome(options=options)

    try:
        # ページアクセス
        driver.get(url)

        # data-sitekey属性の値を取得
        data_sitekey = driver.find_element_by_css_selector('[data-sitekey]').get_attribute('data-sitekey')

        # 2Captchaで解除コードを取得
        response = solver.recaptcha(sitekey=data_sitekey, url=url)
        code = response['code']

        # 解除コードを所定のtextareaに入力
        textarea = driver.find_element_by_id('g-recaptcha-response')
        driver.execute_script(f'arguments[0].value = "{code}";', textarea)

        # ボタンクリック
        driver.find_element_by_css_selector('button[type="submit"]').click()

        # 結果表示 (成功:"Success!", 失敗:"Something went wrong")
        result = driver.find_element_by_css_selector('body>main>h2:nth-child(3)').text
        print(result)

    except BaseException:
        print(traceback.format_exc())
    driver.quit()


if __name__ == '__main__':
    main()
```


実行結果：`Success!`

2Captchaのレスポンスには5~20秒ほどかかりましたが，確かにreCAPTCHAを突破することができました。


# さいごに
いかがでしたでしょうか。
今回はGoogleのreCAPTCHAv2の突破を試しましたが，他にもreCAPTCHAv3やGoogle以外のキャプチャ機能などにも対応しているようです。
多少お金がかかってしまうことがネックですが，どうしても必要なときの一つの選択肢として持っておくと役に立ちそうです。


# 参考
- https://2captcha.com/2captcha-api
- https://tanuhack.com/pr-2captcha/