reCaptcha v2.0を突破するための2captchaサービス (python版)
この投稿ではGoogle reCaptcha v2.0を解決するため、2captchaへの自動接続をするコードを紹介します。今から少し前に、Googleはユーザー行動のreCaptcha(v2.0)を大幅に複雑にしました。このオンラインサービスは、それを解決する方法を提供します。
このサービスが使用する単純なアルゴリズムは次のとおりです。:
- ターゲットサイトを開くクレデンシャル(recaptchaの「サイト キー」、サイトURL、オプション: プロキシ IP) は、利用者(クライアント) によってコピーされ、2captchaサービスに送信されます。シンプルなウェブ開発者ツールでそれらを見つけることができます。
- 2captchaサービス側の作業者は提供されたクレデンシャルを使用して reCaptchaを突破します。
- 10-30 秒で、g-recaptcha-responseトークンとして解答をリクエストします。
- このg-recaptcha-responseトークンは、recaptchaを使用してターゲットサイトの[送信] フォーム内で使用します。
これらの手順はすべて、ブラウザを模倣することなく、純粋なhttp GETおよびPOSTリクエストだけで実行できます。その方法を示します。
説明のために、recaptchaを使ってテストグラウンドtesting ground with recaptchaを作成しました。
クレデンシャルを取得
2captchaサービスでは、次のパラメータを提供する必要があります。
リクエストパラメータ | 値 |
---|---|
key | SERVICE_KEY (2 captchasのサービスキー) |
googlekey | g-recaptchaブロックのdata-sitekey属性値 |
pageurl | https://2captcha.com/demo/recaptcha-v2 (recaptchaのあるターゲットページのurl) |
method | userrecaptcha |
次に、サイトページに移動し、ウェブ開発者ツールで recaptcha htmlコードを調べます (F12を押す)。g-recaptchaブロックでdata-sitekey属性値を見つけて取得します。その値は、Googleが提供するsite_key値である単一サイトの定数です。下の画像で青色で強調表示された値を参照してください。:
そのため、それを選択して右クリックしてコピーします。
これでgooglekeyパラメータを取得しました (サイトのgoogle site key ): 6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8
次のリクエストのSERVICE_KEYは2captchaのアカウント設定2captcha account settingsから取得しています:
Recaptchaソリューションのリクエストをサービスに送信する
次に、上記のパラメーターを使用して2captchaサービス (.phpエンドポイントで)にGETまたはPOSTリクエストを送信します。:
http://2captcha.com/in.php?key=SERVICE_KEY&method=userrecaptcha&googlekey=6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8&pageurl=https://testing-ground.webscraping.pro/recaptcha
Pysonのコード
import requests
from time import sleep, time
service_key = 'xxxxxxxxxxxxxx' # 2captcha service key
google_site_key = '6LfxxxxxxxxxxxxxxxxxxxxxFMz856JY'
pageurl = 'https://testing-ground.webscraping.pro/recaptcha'
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:]
2captchaサービスは、OK|Captcha_ID の形式でレスポンスをレンダリングします。ここで、Captcha_ID – はシステム内のrecaptchaのIDになります。
有効なトークンを受信する
次に、作業者がrecaptchaを突破し、Googleが有効なトークンをサービスに返すまで待つ必要があります。そのために、有効なトークンを取得するまで、5 秒ごとに2captchaサービスにリクエストを送信できます。パラメータ付きの res.phpエンドポイントへのリクエストを確認してください。
http://2captcha.com/res.php?key=SERVICE_KEY&action=get&id=Captcha_ID
Pythonコード
fetch_url = "http://2captcha.com/res.php?key="+ service_key + "&action=get&id=" + captcha_id
for i in range(1, 10):
sleep(5) # wait 5 sec.
resp = requests.get(fetch_url)
if resp.text[0:2] == 'OK':
break
print('Google response token: ', resp.text[3:])
Google のトークンをフォームで送信する
次に、g-recaptcha-responseトークンを使用してフォームを送信します。
ターゲットサイト (サーバー側) はこのトークンをチェックします。サイトのスクリプトは、g-recaptcha-responseトークンの有効性を確認するためにGoogleにリクエストを送信します。それが正しいかどうか、そのサイトに関連するかどうかなどです。CAPTCHAテストグラウンドでは、このトークンはフォームの送信前に確認されます。これは、ajax (xhr) リクエストを介してトークンをproxy.phpに渡すことによって行われます。proxy.phpは、サイトが検証されているかどうかをGoogleに問い合わせ、Googleのレスポンスを返します。
Proxy.php
header('Content-type: application/json');
$response = $_GET['response'];
$secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$json = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=' . $secret . '&response=' . $response);
echo $json;
詳しくはphpにreCaptchaコードを挿入して構成する方法on how to insert and configure reCaptcha code in phpに関する投稿を参照してください。
Googleによるサイト検証のためにg-recaptcha-responseをproxy.phpに送信するPythonコード
verify_url = "https://testing-ground.webscraping.pro/proxy.php?response=" + resp.text[3:]
resp = requests.get(verify_url)
print(resp.text)
スクリプトはjson になります。:
{ “success”: true,
“challenge_ts”: “2016-09-29T09:25:55Z”,
“hostname”: “testing-ground.webscraping.pro”
}
g-recaptcha-responseを使用してフォームを送信するPython コード:
submit_url = "https://testing-ground.webscraping.pro/recaptcha
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
payload = {'submit': 'submit', 'g-recaptcha-response': resp.test[3:] }
resp = requests.post(submit_url, headers=headers, data=payload)
コード全体
import requests
from time import sleep, time
start_time = time()
# send credentials to the service to solve captcha
# returns service's captcha_id of captcha to be solved
url="http://2captcha.com/in.php?key=1069c3052adead147d1736d7802fabe2&method=userrecaptcha&googlekey=6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8&pageurl=https://testing-ground.webscraping.pro/recaptcha"
resp = requests.get(url)
if resp.text[0:2] != 'OK':
quit('Error. Captcha is not received')
captcha_id = resp.text[3:]
# fetch ready 'g-recaptcha-response' token for captcha_id
fetch_url = "http://2captcha.com/res.php?key=1069c3052adead147d1736d7802fabe2&action=get&id=" + captcha_id
for i in range(1, 20):
sleep(5) # wait 5 sec.
resp = requests.get(fetch_url)
if resp.text[0:2] == 'OK':
break
print('Time to solve: ', time() - start_time)
# final submitting of form (POST) with 'g-recaptcha-response' token
submit_url = "https://testing-ground.webscraping.pro/recaptcha"
# spoof user agent
headers = {'user-agent': 'Mozilla/5.0 Chrome/52.0.2743.116 Safari/537.36'}
# POST parameters, might be more, depending on form content
payload = {'submit': 'submit', 'g-recaptcha-response': resp.text[3:] }
resp = requests.post(submit_url, headers=headers, data=payload)
制限事項
受信したg-recaptcha-responseトークン (2captchaサービス) は 120秒間 (2分間) しか有効ではないため、その制限時間内に対象サイトの [送信] フォームに適用してください。
その他の言語のソリューション
2captchaサービスを適用する方法については、他の言語オプションも参照してください。
C# code (同じテストグラウンドページのコード)
一括フォーム送信のための高速recaptchaソリューション
現在、サービスの平均解決時間は25 秒です。次の投稿では、このサービスを使用したrecaptchaの一括解決に関して、recaptchaソリューションを最適化する方法を共有します。
Discussion