使用python selenium解决谷歌验证码(reCAPTCHA)
不止于python ]
https://2captcha.com/
不但支持reCAPTCHA, 还支持 TikTok等等验证, 功能齐全, 但比较贵
不但支持reCAPTCHA, 还支持 TikTok等等验证, 功能齐全, 但比较贵
只支持reCAPTCHA验证, 目前V3版本验证质量一般, 价格美丽, 而且注册就送1500点数, 一次15点数, 可以调用100次, 充值的话是1元1000点
下面以yescaptcha为例, 说一下如何使用(两个平台验证流程几乎相同)
http://yescaptcha.365world.com.cn/ 注册后会生成一个token

REFERER: 网站验证的referer, 找到xxxx/api.js的请求

SITE_KEY: 找到ancher的请求

或者查看网页源代码, 找到 data-sitekey
data-sitekey
创建验证码任务
url : http://api.yescaptcha.365world.com.cn/v3/recaptcha/create
参数:
参数名 |
是否必须 |
说明 |
token |
请在个人中心获取 (Token) |
|
siteKey |
ReCaptcha SiteKey (固定参数) |
|
siteReferer |
ReCaptcha Referer (一般也为固定参数) |
|
captchaType (验证码版本) |
ReCaptchaV2(默认) / ReCaptchaV3 不知道是哪一种看后面的说明 ReCaptchaV3 V3必填 |
|
siteAction |
ReCaptchaV3 必填 Action动作 默认verify |
|
minScore |
ReCaptchaV3 选填 最小分数(0.1-0.9) |
代码
会返回一个任务id, 用于获取验证结果
- 获取任务结果
url: http://api.yescaptcha.365world.com.cn/v3/recaptcha/status
参数:
参数名 |
是否必须 |
说明 |
taskId |
创建任务获取到的ID |
代码
https://shimowendang.com/docs/5o4z8XhhvsUSzYFa/read
非回调:
在页面上可以看到验证, 验证完后, 然后可以点击登录, 就像我们正在验证的demo网站
代码:
https://shimowendang.com/docs/vQRuIEUiT5ocoAZ9/read
- 直接在页面上验证
打开控制台, 搜索
的文本框元素g-recaptcha-response
这样就不验证也可以直接点击提交
跳转到验证成功页面
完整代码
# -*- coding: utf-8 -*-
import requests
import time
class ReCAPTCHA(object):
# Token
TOKEN = 'xxxxxxxxxx'
REFERER = 'https://www.google.com/recaptcha/api2/demo'
BASE_URL = 'http://api.yescaptcha.365world.com.cn'
# Site Key
SITE_KEY = '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-'
CREATE_TASK_URL = f"{BASE_URL}/v3/recaptcha/create?token={TOKEN}&siteKey={SITE_KEY}&siteReferer={REFERER}"
GET_TOKEN_URL = "{BASE_URL}/v3/recaptcha/status?token={TOKEN}&taskId={task_id}"
TASK_ID = None
@classmethod
def create_task(cls):
try:
response = requests.get(cls.CREATE_TASK_URL)
if response.status_code == 200:
data = response.json()
cls.TASK_ID = data.get('data', {}).get('taskId')
print(f"Task created, ID:{cls.TASK_ID}")
except requests.RequestException as e:
print(f'Create task failed:{e}')
@classmethod
def get_token(cls, task_id=None, retry_times=120):
if not task_id:
cls.create_task()
task_id = task_id or cls.TASK_ID
if not task_id:
print("Not found task id")
return False
print(f"Start pull task:{task_id} result")
url = cls.GET_TOKEN_URL.format(BASE_URL=cls.BASE_URL, TOKEN=cls.TOKEN, task_id=task_id)
count = 0
while count < retry_times:
try:
response = requests.get(url)
if response.status_code == 200:
data = response.json()
status = data.get('data', {}).get('status')
print('task status', status)
if status == 'Success':
return data.get('data', {}).get('response')
except requests.RequestException as e:
print('task failed', e)
finally:
count += 1
time.sleep(1)
def verify(response_token):
url = "https://www.google.com/recaptcha/api2/demo"
data = {
"g-recaptcha-response": response_token
}
response = requests.post(url, data=data)
if response.status_code == 200:
print("Verify Success")
return response.text
if __name__ == "__main__":
token = ReCAPTCHA.get_token()
print(token)
verify(token)
运行结果