reCAPTCHA v1: 这是最初的版本,它向用户呈现扭曲的文本,他们必须解读并输入到一个框中。这对于数字化书籍和其他印刷材料很有用,但对于人类来说通常很难解决。
reCAPTCHA v2: 此版本引入了“我不是机器人”复选框,要求用户点击。如果系统不确定用户是否是人类,它将带来额外的挑战,例如识别图像中的物体。
reCAPTCHA v3: 此版本在后台运行,不会用挑战打扰用户。相反,它会根据访问者与网站的互动情况为其分配风险分数。然后,网站所有者可以使用此分数来决定如何处理访问者(例如,阻止、提出挑战等)。
# create task
"""
Create NextCaptcha CAPTCHA solver task.
:param task: task of captcha dict.
:param client_key: the client key form nextcaptcha dashboard.
:param solft_id: Optional. The value of the 'solft_id'.
:param callback_url: Optional. callback when the captcha task finish.
:return: A dictionary containing the solution of the reCAPTCHA.
"""
def send_task(task, client_key, solft_id, callback_url):
HOST = "https://api.nextcaptcha.com"
session = requests.session()
data = {
"clientKey": client_key,
"solftId": solft_id,
"callbackUrl": callback_url,
"task": task,
}
resp = session.post(url=HOST + "/createTask", json=data)
if resp.status_code != 200:
return resp.json()
resp = resp.json()
task_id = resp.get("taskId")
start_time = time.time()
while True:
if time.time() - start_time > TIMEOUT:
return {"errorId": 12, "errorDescription": "Timeout", "status": "failed"}
resp = session.post(url=HOST + "/getTaskResult",
json={"clientKey": client_key, "taskId": task_id})
if resp.status_code != 200:
return resp.json()
status = resp.json().get("status")
if status == READY_STATUS:
return resp.json()
if status == FAILED_STATUS:
return resp.json()
time.sleep(1)
def recaptchav2(self, website_url: str, website_key: str, recaptcha_data_s_value: str = "",
is_invisible: bool = False, api_domain: str = "", page_action: str = "") -> dict:
"""
Solve reCAPTCHA v2 challenge.
:param website_url: The URL of the website where the reCAPTCHA is located.
:param website_key: The sitekey of the reCAPTCHA.
:param recaptcha_data_s_value: Optional. The value of the 'data-s' parameter if present.
:param is_invisible: Optional. Whether the reCAPTCHA is invisible or not.
:param api_domain: Optional. The domain of the reCAPTCHA API if different from the default.
:return: A dictionary containing the solution of the reCAPTCHA.
"""
task = {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": website_url,
"websiteKey": website_key,
"recaptchaDataSValue": recaptcha_data_s_value,
"isInvisible": is_invisible,
"apiDomain": api_domain,
"pageAction": page_action,
}
return send_task(task)
def recaptchav2enterprise(self, website_url: str, website_key: str, enterprise_payload: dict = {},
is_invisible: bool = False, api_domain: str = "", page_action: str = "") -> dict:
"""
Solve reCAPTCHA v2 Enterprise challenge.
:param website_url: The URL of the website where the reCAPTCHA is located.
:param website_key: The sitekey of the reCAPTCHA.
:param enterprise_payload: Optional. Additional enterprise payload parameters.
:param is_invisible: Optional. Whether the reCAPTCHA is invisible or not.
:param api_domain: Optional. The domain of the reCAPTCHA API if different from the default.
:return: A dictionary containing the solution of the reCAPTCHA.
"""
task = {
"type": "RecaptchaV2EnterpriseTaskProxyless",
"websiteURL": website_url,
"websiteKey": website_key,
"enterprisePayload": enterprise_payload,
"isInvisible": is_invisible,
"apiDomain": api_domain,
"pageAction": page_action,
}
return send_task(task)
def recaptchav3(self, website_url: str, website_key: str, page_action: str = "", api_domain: str = "",
proxy_type: str = "", proxy_address: str = "", proxy_port: int = 0, proxy_login: str = "",
proxy_password: str = "") -> dict:
"""
Solve reCAPTCHA v3 challenge.
:param website_url: The URL of the website where the reCAPTCHA is located.
:param website_key: The sitekey of the reCAPTCHA.
:param page_action: Optional. The action parameter to use for the reCAPTCHA.
:param api_domain: Optional. The domain of the reCAPTCHA API if different from the default.
:param proxy_type: Optional. The type of the proxy (HTTP, HTTPS, SOCKS4, SOCKS5).
:param proxy_address: Optional. The address of the proxy.
:param proxy_port: Optional. The port of the proxy.
:param proxy_login: Optional. The login for the proxy.
:param proxy_password: Optional. The password for the proxy.
:return: A dictionary containing the solution of the reCAPTCHA.
"""
task = {
"type": "RecaptchaV3TaskProxyless",
"websiteURL": website_url,
"websiteKey": website_key,
"pageAction": page_action,
"apiDomain": api_domain,
}
if proxy_address:
task["type"] = "RecaptchaV3Task"
task["proxyType"] = proxy_type
task["proxyAddress"] = proxy_address
task["proxyPort"] = proxy_port
task["proxyLogin"] = proxy_login
task["proxyPassword"] = proxy_password
return send_task(task)
def recaptcha_mobile(self, app_key: str, app_package_name: str = "", app_action: str = "") -> dict:
"""
Solve Mobile reCAPTCHA challenge.
:param app_key: The app key of the Mobile reCAPTCHA.
:param app_package_name: Optional. The package name of the mobile app.
:param app_action: Optional. The action parameter to use for the Mobile reCAPTCHA.
:return: A dictionary containing the solution of the Mobile reCAPTCHA.
"""
task = {
"type": "RecaptchaMobileProxyless",
"appKey": app_key,
"appPackageName": app_package_name,
"appAction": app_action,
}
return send_task(task)