如何用 Python 识别 reCAPTCHA v3 并设置 action

reCAPTCHA v3 从不显示挑战。它在后台运行,并给网站一个 token,随后由网站在服务器端进行验证。从代码角度看,这意味着没有任何需要点击或查看的东西,因此整个任务就是生成一个网站会接受的 token。在 Python 中,这与你用于 v2 的 recaptcha 方法相同,只是多了一个版本标志。
让人栽跟头的地方在于 action。
设置
# 需要 Python 3.10 或更高版本。 pip install capskip
from capskip import CapSkip
solver = CapSkip(
host="127.0.0.1",
port=8080,
recaptchaTimeout=300, # seconds, shared with Turnstile and GeeTest
)CapSkip 在你自己的机器上运行,因此在这一切生效之前,必须先打开桌面应用。
基本调用
result = solver.recaptcha(
sitekey="6Lc...YOUR_SITEKEY",
url="https://example.com/checkout",
version="v3",
action="submit",
)
print(result["code"]) # the v3 token与 v2 有两点不同。 version="v3" 是必需的,而 action 应与页面传给 grecaptcha.execute。如果省略,默认值为 verify.
为什么 action 很重要
v3 的 action 是网站为每个受保护交互附加的标签,这样登录和结账就能被分别评分。网站自己的后端通常会检查返回 token 上的 action 是否与该端点所预期的 action 一致。
如果发送了错误的值,token 在技术上有效,但会被标记为另一个交互,许多后端会直接拒绝。请从页面读取真实值,而不要猜测:
import re
import requests
html = requests.get("https://example.com/checkout").text
# Sites usually call execute() with the action as a literal string.
match = re.search(r"execute\([^,]+,\s*\{\s*action:\s*['\"]([^'\"]+)", html)
action = match.group(1) if match else "verify"
result = solver.recaptcha(
sitekey=sitekey, url=page_url, version="v3", action=action,
)常见的值有 login, submit, homepage 和 checkout,但它们只是网站构建者随意选定的字符串。
Enterprise v3
Enterprise 是一个正交的标志,而不是一款独立产品,因此它是叠加使用的:
result = solver.recaptcha(
sitekey=sitekey,
url=page_url,
version="v3",
enterprise=1,
action="submit",
)你可以通过页面加载的脚本来区分 Enterprise 和标准版。Enterprise 加载的是 enterprise.js,而标准版加载的是 api.js。猜错会导致识别失败,而不会返回错误的 token,因此验证起来成本很低。
提交 token
import requests
response = requests.post(
"https://example.com/checkout",
data={
"g-recaptcha-response": result["code"],
"order_id": "...",
},
)有些 v3 集成使用不同的字段名,或将 token 以 JSON 形式发送,因为没有标准的表单小组件来约束它们。在做出假定之前,请先查看页面自身的 JavaScript 的行为。 g-recaptcha-response.
批量识别
Python 是唯一一个 AsyncCapSkip 是一个真正的异步客户端,而不是别名,因此它能真正实现并行处理:
import asyncio
from capskip import AsyncCapSkip
async def main():
solver = AsyncCapSkip()
tokens = await asyncio.gather(*[
solver.recaptcha(sitekey=sitekey, url=u, version="v3", action="submit")
for u in urls
])
return [t["code"] for t in tokens]
asyncio.run(main())错误
from capskip import (
ValidationException, NetworkException, ApiException, TimeoutException,
)
try:
result = solver.recaptcha(sitekey=sitekey, url=page_url, version="v3")
except ValidationException:
pass # missing sitekey or url
except NetworkException:
pass # CapSkip is not running
except ApiException:
pass # rejected sitekey or pageurl
except TimeoutException:
pass # exceeded recaptchaTimeout常见问题
如果我省略 action 会怎样?
它默认为 verify。在从不检查 action 的网站上,这可行;在检查 action 的网站上则会失败。由于从页面读取真实值只需几行代码,因此值得这么做,而不是依赖默认值。
我能在提交前查看分数吗?
不能。分数保存在 Google 手中,只有当网站所有者的后端验证 token 时才会向其披露。在客户端你只会得到一个 token,别无其他,因此在提交前无法查看或按分数筛选。
v3 token 的有效期是多久?
大约两分钟,一次性使用,与 v2 相同。请在需要它的请求之前立即识别,而不要预先建立 token 池。
小结
传入 version="v3",将 action 设置为页面实际使用的值,添加 enterprise=1 (当页面加载时) enterprise.js,并尽快提交 token,因为它大约两分钟后就会过期。
其他语言在 reCAPTCHA v3 识别工具 页面介绍,Enterprise 的具体内容在 Enterprise 识别工具 页面介绍,更广泛的 Python 接口在 Python 验证码识别 页面介绍。你可以在我们的 v3 演示上观看真实 v3 token 的生成过程,而 CapSkip 本身是一款 无限量验证码识别工具 ,在本地运行。
