こんにちは、ハッカー見習いのたぬ(@tanuhack)です!
Seleniumを使ってスクレイピングをしているときにぶつかる、一番の難所は『reCAPTCHA(リキャプチャ)』だと思いませんか?
[aside]reCAPTCHAとは左隣のチェックボックスをオンにすることで悪質なプログラムによるサービスへの侵入や乱用を防ぐツールです。プログラムから干渉されにくいのが最大の売りで、多くのWebサイトに導入されています。[/aside]
reCAPTCHAを使った認証作業は、iframeタグの中にチェックボックスが存在するので、普通であればSeleniumのライブラリだけでは操作できません。
ですが、今回紹介する『2Captcha』というサービスを用いれば、なんと堅牢なreCAPTCHAでさえもPythonのプログラムから突破することが出来るようになります!
驚きませんか?それでは、始めます。
目次
2Captchaとは
ロシアの会社が開発したreCAPTCHAを突破するためのプラットフォームです。
通常であれば、プログラムからreCAPTCHAにチェックをいれることは、ほぼ不可能レベルだと言われています。
では、なぜ2Captchaを使うだけで、可能なのでしょうか。
2Captchaの仕組み
2Captchaの仕組みを簡単に説明すると、reCAPTCHAのチェックボタンをネット上の『Worker』と呼ばれている人達に代わりに押してもらっているイメージです。
PythonのSeleniumで説明すると、プログラムの実行中にWorkerの誰かがリアルタイムで解錠した結果を2Captcha経由で受け取ると言ったところでしょう。
なので、2Captchaはプログラムで解錠しているように見えるけど、実際は人力…みたいなオチです。
使用方法
2Captchaを使うためには、公式サイトでの『アカウントの作成』と『少額のお金(1000回突破ごとに3$くらい)』が要ります。
2Captchaは有料なサービスな訳ですが、reCAPTCHAを一回突破するごとに0.3円くらいしか掛かりません。
1回あたりたったの0.3円程度で、最強の防御力を誇るreCAPTCHAを突破できると考えたら安すぎますね。
アカウントを作成する
2Captchaは有料サービスなので、アカウントを開設しないと何も始まりません。開設は3分もかからないので、サクッと済ませちゃいましょう。
STEP1:公式サイトにアクセスする
STEP2:必要事項を記入する
アドレスとパスワードを入力したら、『チェックイン』を押します。
今回は、2Captchaを利用する立場なので『Customer』を選択して、『Next』を選択します。
これで、アカウントの作成が終了しました。
課金する
STEP1:Add fundsを選択
STEP2:支払い方法を選択
上から3番目のPayUを選択するとクレカ払いができるようになります。
PayUは、最低3$から入力することができます。
STEP3:支払い情報を入力
名前、アドレス、電話番号を入力したら『Next step』を選択します。
クレカの情報を入力したら『Finish order』を選択します。
STEP4:金額が反映されているのを確認する
反映されるのは1〜60分間かかるみたいです。自分は入金して、すぐ反映されました。
次は、実際に2Captchaを使ったプログラムを見てみましょう。
プログラム
下準備
- 2CaptchaのAPI KEY
- reCAPTCHAが設置してあるサイトのURL
- reCAPTCHAのgoogle_site_key
STEP1:2CaptchaのAPI KEYを取得する
Account settingsのAPI KEYをコピーします。
STEP2:reCAPTCHAが設置してあるサイトのURLを取得する
今回は、例として『たぬハック』の問い合わせページ(https://tanuhack.com/contacts/)のreCAPTCHAを突破したいと思います。
ゆえに、サイトURLは『https://tanuhack.com/contacts/』になります。
STEP3:reCAPTCHAのgoogle_site_keyを取得する
次は、解錠したいreCAPTCHAの一意のIDを取得します。ブラウザのDeveloperツールを使って確認すると楽ちんです
『data-sitekey』で検索すると一発で確認できますよ。
reCAPTCHA解錠の流れ
もう一度、2Captchaの流れを振り返ってみましょう。
PythonのプログラムからreCAPTCHAを依頼すると、次のようなトークンが返されます。
このトークンを鍵として、利用することでreCAPTCHAを突破することができます。
STEP1:トークンの使用方法
reCAPTCHAのチェックボックスは、iframeの中にあるのでSeleniumで直接選択することはできません。
では、どのようにトークンを使用するのでしょうか。
…
答えは、iframeタグのすぐ下にあるtextareaタグにトークンをぶち込みます。
STEP2:textareaの確認
『g-recaptcha-response』と検索すれば一発で出てきます。
しかし、このtextareaタグは『display:none;』で隠されているので、PythonからJavaScriptを実行させて、無理やりこじ開けることでトークンを入力することが出来るようになります。
STEP3:display:noneを解除する
大まかな流れは以上です。
ソースコード
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』を突破する方法を紹介しました。
よいスクレイピングライフを!
それでは。