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


目次

はじめに

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

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

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

2Captchaとは

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

仕組み

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

言語対応

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

2Captchaの使用準備

アカウント登録

https://2captcha.com/ にアクセス
右上の「Registration」ボタンからアカウント登録をします。

メールアドレスとパスワードを設定して登録完了です。

ログインすると以下のようなページになります。

入金

残念ながら2Captchaは無料では利用できません。
ログイン後画面上部の「Add funds」から入金を行います。
※ 入金前は「0$」と表示されているはずです。

利用可能な決済サービスを選んで金額を設定します。私はPayPalで払いました。
とりあえず最低入金額の3$入金しましょう。

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

APIキーの取得

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

Python+Selenium+2Captchaで『reCAPTCHAv2』を突破

Pythonを使ってreCAPTCHAv2を突破してみます。

パッケージインストール

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

pip install 2captcha-python

また,以下のテストではSeleniumでHeadless Chromeを扱います。
Selniumの準備はこちらの記事などを参考にしてみてください。

reCAPTCHAのデモページでテスト

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

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以外のキャプチャ機能などにも対応しているようです。
多少お金がかかってしまうことがネックですが,どうしても必要なときの一つの選択肢として持っておくと役に立ちそうです。

参考