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

この投稿ではGoogle reCaptcha v2.0を解決するため、[2captcha](https://2captcha.com/?from=7633032)への自動接続をするコードを紹介します。今から少し前に、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](https://2captcha.com/demo/recaptcha-v2)を作成しました。

## クレデンシャルを取得

2captchaサービスでは、次のパラメータを提供する必要があります。

| リクエストパラメータ | 値 |
| ---- | ---- | 
| key | SERVICE_KEY (2 captchasのサービスキー) | 
| googlekey | g-recaptchaブロックのdata-sitekey属性値 | 
| pageurl | [https://2captcha.com/demo/recaptcha-v2](https://2captcha.com/demo/recaptcha-v2) (recaptchaのあるターゲットページのurl) | 
| method | userrecaptcha | 

次に、サイトページに移動し、ウェブ開発者ツールで recaptcha htmlコードを調べます (F12を押す)。g-recaptchaブロックでdata-sitekey属性値を見つけて取得します。その値は、Googleが提供するsite_key値である単一サイトの定数です。下の画像で青色で強調表示された値を参照してください。:

![](https://storage.googleapis.com/zenn-user-upload/00b35e9cb7cb-20221006.png)

そのため、それを選択して右クリックしてコピーします。

これでgooglekeyパラメータを取得しました (サイトのgoogle site key ): 6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8

次のリクエストのSERVICE_KEYは2captchaのアカウント設定[2captcha account settings](https://2captcha.com/setting?from=7633032)から取得しています:

![](https://storage.googleapis.com/zenn-user-upload/5b96e91dd6f0-20221006.png)

## 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](http://2captcha.com/in.php?key=SERVICE_KEY&method=userrecaptcha&googlekey=6Lf5CQkTAAAAAKA-kgNm9mV6sgqpGmRmRMFJYMz8&pageurl=https://testing-ground.webscraping.pro/recaptcha)

## Pysonのコード

```py
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](http://2captcha.com/res.php?key=SERVICE_KEY&action=get&id=Captcha_ID)

## Pythonコード

```py
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

```py
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](https://webscraping.pro/insert-configure-recaptcha-no-captcha-code-in-php/)に関する投稿を参照してください。

## Googleによるサイト検証のためにg-recaptcha-responseをproxy.phpに送信するPythonコード

```py
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 コード:

```py
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)
```

## コード全体

```py
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](https://webscraping.pro/2captcha-service-integration-with-c-code) (同じテストグラウンドページのコード)

## 一括フォーム送信のための高速recaptchaソリューション

現在、サービスの平均解決時間は25 秒です。次の投稿では、このサービスを使用したrecaptchaの一括解決に関して、recaptchaソリューションを最適化する方法を共有します。