🌊

reCaptcha v2.0を突破するための2captchaサービス (python版)

2022/10/06に公開約6,500字

この投稿ではGoogle reCaptcha v2.0を解決するため、2captchaへの自動接続をするコードを紹介します。今から少し前に、Googleはユーザー行動のreCaptcha(v2.0)を大幅に複雑にしました。このオンラインサービスは、それを解決する方法を提供します。

このサービスが使用する単純なアルゴリズムは次のとおりです。:

  1. ターゲットサイトを開くクレデンシャル(recaptchaの「サイト キー」、サイトURL、オプション: プロキシ IP) は、利用者(クライアント) によってコピーされ、2captchaサービスに送信されます。シンプルなウェブ開発者ツールでそれらを見つけることができます。
  2. 2captchaサービス側の作業者は提供されたクレデンシャルを使用して reCaptchaを突破します。
  3. 10-30 秒で、g-recaptcha-responseトークンとして解答をリクエストします。
  4. この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

ログインするとコメントできます