コミュニティ

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

目次

はじめに

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

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

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

2Captchaとは

スクリーンショット 2020-11-06 17.00.05.png

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

仕組み

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

スクリーンショット

言語対応

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

2Captchaの使用準備

アカウント登録

https://2captcha.com/ にアクセス
右上の「Registration」ボタンからアカウント登録をします。
スクリーンショット 2020-11-06 13.43.33.png

メールアドレスとパスワードを設定して登録完了です。
スクリーンショット

ログインすると以下のようなページになります。
スクリーンショット

入金

残念ながら2Captchaは無料では利用できません。
ログイン後画面上部の「Add funds」から入金を行います。
※ 入金前は「0$」と表示されているはずです。
スクリーンショット 2020-11-06 16.37.01.png

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

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

APIキーの取得

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

スクリーンショット 2020-11-06 16.04.10.png

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

参考

derodero24
主に画像認識/言語処理AIの研究・開発に従事 Python,JS,Julia,FLutter
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
コメント

なるほど!人海戦術か!
タイトルを見た瞬間に画像認識の記事かなと思っていましたが、人件費の安い所で人にやらせた方が手っ取り早いですね。
エンジニアはなんでもコードを書いて解決しようとせずに、もっと広い視点を持たなければ。

reCAPTCHAを自動で突破したらイカンでしょ…

9kwなど無料の類似サービスはたくさんありますよ。

どこかにいる大量のWorkerがキャプチャを解除し必要な情報を返してくれます。

じわじわくる

面白い記事ですね

技術でもなんでもない力業。自分でできないほど大量の突破など悪事にしか使えない。使った場合、逆に使用者の情報漏洩の危険すらある。LGTM する要素がない。

技術でもなんでもない力業。

エンジニアは忘れがちですが、コードを書くことはあくまで手段であり、目的ではないはずです。(大部分のエンジニアにとって)

そういう意味ではアリの手法だと思いますよ。

倫理的にやっちゃいけないとか、つかれる穴を残すほうが悪いとかはどちらの立場も理解できるし、永遠に答えが出ないテーマなので

(編集済み)

SNS よりも手紙の方が有効な場面はありますが、手紙の重要性や時候の挨拶の書き方を説くのはここではないと思います。

個人的感情からすると Looks Evil To Me っぽい記事ではありますが、人間が解くにせよニューラルネットワークが解くにせよ、肝要なのは「reCAPTCHAは現時点で(というか、ずいぶん前からとっくに)突破可能な関門である」という点であって、「いやーreCAPTCHAがあるから人間以外はアクセスしてこないよ、モニタリングとか後回していいでしょー」みたいなのんびりしたことを考えている人に向けて警鐘を鳴らすという意味はあるのかなと思いました。

あなたはデータを解析する人の視点から問題を見ようとします

こちらの記事は「宣伝や販売を主目的とした記事は投稿しない」という規約に違反していませんか?

2Captchaの公式Twitterアカウントから宣伝を目的とした記事投稿の依頼が飛んでくることがあるようですが(写真1枚目),もしそのような依頼に基づいて投稿した記事であれば,qiitaの「宣伝や販売を主目的とした記事は投稿しない」という規約に違反していることになります.@2captchaという捨て垢がこの記事にコメントを残している(写真2枚目)点も非常に疑わしく感じます.

EmYq6ISVMAU8I4M.jpg
スクリーンショット 2020-11-10 22.27.05.png

You will write a useful article in which our service will be mentioned, and we will pay for it.

私たちのサービスに言及する有用な記事を書いてもらえれば、それに対価を支払います。

The more the article gets likes, the more we will pay after publication.

記事に LGTM が多いほど、支払いは多くなります。

完全にアウトですね。
LGTM した人の中にはサクラもいることでしょう。
Qiita ではこういう小銭目当てにプライドや他人を売る人多いですね。

あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした