【2Captcha】Python+Seleniumで『reCAPTCHA』を突破する方法

こんにちは、ハッカー見習いのたぬ(@tanuhack)です!

Seleniumを使ってスクレイピングをしているときにぶつかる、一番の難所は『reCAPTCHA(リキャプチャ)』だと思いませんか?

pr-2captcha1

[aside]reCAPTCHAとは
左隣のチェックボックスをオンにすることで悪質なプログラムによるサービスへの侵入や乱用を防ぐツールです。プログラムから干渉されにくいのが最大の売りで、多くのWebサイトに導入されています。[/aside]

reCAPTCHAを使った認証作業は、iframeタグの中にチェックボックスが存在するので、普通であればSeleniumのライブラリだけでは操作できません。

ですが、今回紹介する『2Captcha』というサービスを用いれば、なんと堅牢なreCAPTCHAでさえもPythonのプログラムから突破することが出来るようになります!

驚きませんか?それでは、始めます。

2Captchaとは

pr-2captcha3
2Captcha公式ページ

ロシアの会社が開発したreCAPTCHAを突破するためのプラットフォームです。

通常であれば、プログラムからreCAPTCHAにチェックをいれることは、ほぼ不可能レベルだと言われています。

では、なぜ2Captchaを使うだけで、可能なのでしょうか。

2Captchaの仕組み

2Captchaの仕組みを簡単に説明すると、reCAPTCHAのチェックボタンをネット上の『Worker』と呼ばれている人達に代わりに押してもらっているイメージです。

pr-2captcha2

PythonのSeleniumで説明すると、プログラムの実行中にWorkerの誰かがリアルタイムで解錠した結果を2Captcha経由で受け取ると言ったところでしょう。

なので、2Captchaはプログラムで解錠しているように見えるけど、実際は人力…みたいなオチです。

使用方法

2Captchaを使うためには、公式サイトでの『アカウントの作成』と『少額のお金(1000回突破ごとに3$くらい)』が要ります。

2Captchaは有料なサービスな訳ですが、reCAPTCHAを一回突破するごとに0.3円くらいしか掛かりません。

1回あたりたったの0.3円程度で、最強の防御力を誇るreCAPTCHAを突破できると考えたら安すぎますね。

アカウントを作成する

2Captchaは有料サービスなので、アカウントを開設しないと何も始まりません。開設は3分もかからないので、サクッと済ませちゃいましょう。

STEP1:公式サイトにアクセスする

pr-2captcha4
https://2captcha.com/ja/|公式サイト

STEP2:必要事項を記入する

pr-2captcha5

アドレスとパスワードを入力したら、『チェックイン』を押します。

pr-2captcha6

今回は、2Captchaを利用する立場なので『Customer』を選択して、『Next』を選択します。

これで、アカウントの作成が終了しました。

課金する

STEP1:Add fundsを選択

pr-2captcha7
https://2captcha.com/enterpage

STEP2:支払い方法を選択

pr-2captcha8

上から3番目のPayUを選択するとクレカ払いができるようになります。

pr-2captcha9

PayUは、最低3$から入力することができます。

STEP3:支払い情報を入力

pr-2captcha10

名前、アドレス、電話番号を入力したら『Next step』を選択します。

pr-2captcha11

クレカの情報を入力したら『Finish order』を選択します。

pr-2captcha12

STEP4:金額が反映されているのを確認する

pr-2captcha13

反映されるのは1〜60分間かかるみたいです。自分は入金して、すぐ反映されました。

次は、実際に2Captchaを使ったプログラムを見てみましょう。

プログラム

下準備

必要なもの
  1. 2CaptchaのAPI KEY
  2. reCAPTCHAが設置してあるサイトのURL
  3. reCAPTCHAのgoogle_site_key

STEP1:2CaptchaのAPI KEYを取得する

pr-2captcha14
https://2captcha.com/enterpage

Account settingsのAPI KEYをコピーします。

STEP2:reCAPTCHAが設置してあるサイトのURLを取得する

今回は、例として『たぬハック』の問い合わせページ(https://tanuhack.com/contacts/)のreCAPTCHAを突破したいと思います。

pr-2captcha15

ゆえに、サイトURLは『https://tanuhack.com/contacts/』になります。

STEP3:reCAPTCHAのgoogle_site_keyを取得する

次は、解錠したいreCAPTCHAの一意のIDを取得します。ブラウザのDeveloperツールを使って確認すると楽ちんです

『data-sitekey』で検索すると一発で確認できますよ。

pr-2captcha16

reCAPTCHA解錠の流れ

もう一度、2Captchaの流れを振り返ってみましょう。

pr-2captcha2
2Captchaの仕組み

PythonのプログラムからreCAPTCHAを依頼すると、次のようなトークンが返されます。

トークン(例)
03ADlfD1_UpiIL4QPm548Hk0LCGt-3SkI0mmwIXLOsr0_h7qnm7ttln23GXRVYpg8Sx15PKanz6F13kkt1beHYDay1y1YG0_Q_BB7eJEsfXrxclvgDswDZHlO4e4qa0ZdO9EzKDWbPyZFGFGgt10IjsGbXgj_S9KnH1Gaa9ghvlgwBPgy0qlu6He3SA7eBVpxzbfffwOBnHuw-kBdXHTm156zANlA8Ib1mzk8iPNOXAIvizg-0wc9mNn6kmQNQX1FpVM50UxShUf15pnf7gA36VfYnMvrP_9S9qQ

このトークンを鍵として、利用することでreCAPTCHAを突破することができます。

STEP1:トークンの使用方法

reCAPTCHAのチェックボックスは、iframeの中にあるのでSeleniumで直接選択することはできません。

では、どのようにトークンを使用するのでしょうか。

答えは、iframeタグのすぐ下にあるtextareaタグにトークンをぶち込みます。

STEP2:textareaの確認

『g-recaptcha-response』と検索すれば一発で出てきます。

pr-2captcha17

しかし、このtextareaタグは『display:none;』で隠されているので、PythonからJavaScriptを実行させて、無理やりこじ開けることでトークンを入力することが出来るようになります。

pr-2captcha18

STEP3:display:noneを解除する

JavaScriptで『display:none』を解除する
driver.execute_script('var element=document.getElementById("g-recaptcha-response"); element.style.display="";')

大まかな流れは以上です。

ソースコード

import getpass # 実行ユーザーを取得するために使用
import requests
import json
import time       #時間を操作するPythonの標準ライブラリ
from selenium import webdriver
from selenium.webdriver.support.ui import Select # Selectタグが扱えるエレメントに変化させる為の関数を呼び出す

###############
# 省略
###############

# JSでtextareaタグのdisplay:noneを削除する
driver.execute_script('var element=document.getElementById("g-recaptcha-response"); element.style.display="";')

service_key = 'API KEY' # 2captcha service key 
google_site_key = 'google_site_key' # reCAPTCHAのdata-sitekey
pageurl = 'reCAPTCHAが設置してるURL' 
url = "http://2captcha.com/in.php?key=" + service_key + "&method=userrecaptcha&googlekey=" + google_site_key + "&pageurl=" + pageurl 
resp = requests.get(url) 
if resp.text[0:2] != 'OK': 
    quit('Service error. Error code:' + resp.text) 
captcha_id = resp.text[3:]


fetch_url = "http://2captcha.com/res.php?key="+ service_key + "&action=get&id=" + captcha_id
 
for i in range(1, 10):
    time.sleep(5) # wait 5 sec.
    resp = requests.get(fetch_url)
    if resp.text[0:2] == 'OK':
        break
print('Google response token: ', resp.text[3:])

# textareaにトークンを入力する
driver.find_element_by_id('g-recaptcha-response').send_keys(resp.text[3:])

###############
# 省略
###############

サンプルのプログラムは以上です。

他にどんな使い方ができるかは、公式のAPIサイトで確認してくださいね。

さいごに

今回は、2Captchaというサービスを用いて、Python+Seleniumで『reCAPTCHA』を突破する方法を紹介しました。

よいスクレイピングライフを!

それでは。