0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

この投稿では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ソリューションを最適化する方法を共有します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?