news 2026/3/10 3:05:58

如何使用Botasaurus和CapSolver在Python中解决CAPTCHA

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何使用Botasaurus和CapSolver在Python中解决CAPTCHA

TLDR:本指南展示了如何将 Botasaurus(一个带有内置反检测功能的 Python 网页抓取框架)与 CapSolver(一个验证码解决 API)结合使用,以在大规模网页抓取过程中自动绕过 reCAPTCHA v2、reCAPTCHA v3 和 Cloudflare Turnstile。核心流程包括设置环境、使用 CapSolver 浏览器扩展识别验证码参数、通过 Python 辅助函数调用 CapSolver API 获取解决方案令牌,最后使用 Botasaurus 将令牌注入网页以提交表单。

如何使用 Botasaurus 和 CapSolver 解决 CAPTCHA(完整指南)

大规模网页抓取时经常会遇到阻止自动化访问的验证码。本指南展示了如何将 Botasaurus(一个强大的网页抓取框架)与 CapSolver 结合,自动解决 reCAPTCHA v2、reCAPTCHA v3 和 Cloudflare Turnstile 验证码。

什么是 Botasaurus?

Botasaurus 是一个 Python 网页抓取框架,通过内置的反检测功能简化浏览器自动化。它提供了一个基于装饰器的 API 来处理浏览器任务。

核心功能:

  • 反检测:内置的隐身功能以避免被识别为机器人
  • 简单 API:基于装饰器的接口,使用@browser
  • JavaScript 执行:在浏览器上下文中运行自定义 JS 代码
  • 元素选择:使用 CSS 选择器轻松操作 DOM

安装:

pipinstallbotasaurus

基本用法:

frombotasaurus.browserimportbrowser,Driver@browser()defscrape_page(driver:Driver,data):driver.get("https://example.com")title=driver.get_text("h1")return{"title":title}# 运行爬虫result=scrape_page()

什么是 CapSolver?

CapSolver 是一个验证码解决服务,提供 API 来解决各种验证码类型,包括 reCAPTCHA 和 Cloudflare Turnstile。

支持的验证码类型:

  • reCAPTCHA v2(复选框和不可见)
  • reCAPTCHA v3(基于分数)
  • reCAPTCHA 企业版
  • Cloudflare Turnstile
  • 更多

获取 API 密钥:

  1. 在 CapSolver 仪表板 注册账户
  2. 向账户充值
  3. 复制你的 API 密钥(以CAP-开头)

项目设置

安装依赖

pipinstallbotasaurus capsolver requests python-dotenv

配置环境

在项目根目录创建一个.env文件:

CAPSOLVER_API_KEY=CAP-YOUR_API_KEY_HERE

配置模块

创建一个共享的配置加载器:

# shared/config.pyimportosfrompathlibimportPathfromdotenvimportload_dotenv# 从项目根目录加载.env文件ROOT_DIR=Path(__file__).parent.parent load_dotenv(ROOT_DIR/".env")classConfig:"""CapSolver 集成的配置类。"""# CapSolver API 密钥CAPSOLVER_API_KEY:str=os.getenv("CAPSOLVER_API_KEY","")# CapSolver API 端点CAPSOLVER_API_URL="https://api.capsolver.com"CREATE_TASK_ENDPOINT=f"{CAPSOLVER_API_URL}/createTask"GET_RESULT_ENDPOINT=f"{CAPSOLVER_API_URL}/getTaskResult"@classmethoddefvalidate(cls)->bool:"""检查配置是否有效。"""ifnotcls.CAPSOLVER_API_KEY:print("错误:未设置 CAPSOLVER_API_KEY!")returnFalsereturnTrue

使用 CapSolver 扩展识别验证码参数

在与 API 集成之前,你需要识别目标验证码的正确参数。CapSolver 浏览器扩展可以自动检测所有必需的参数。

安装

从 Chrome Web Store 安装 CapSolver 扩展。

使用验证码检测器

  1. F12打开开发者工具
  2. 导航到Capsolver 验证码检测器标签页
  3. 在访问目标网站时保持检测器面板打开
  4. 触发页面上的验证码

重要提示:在触发验证码之前不要关闭 CapSolver 面板,否则会清除之前检测到的信息。

检测到的参数

扩展会自动识别所有必需的 reCAPTCHA 参数:

  • 网站 URL
  • 站点密钥
  • pageAction(用于 v3)
  • isInvisible
  • isEnterprise
  • Api 域名

检测器提供格式化的 JSON 输出,方便 API 集成,轻松复制解决任务所需的精确参数。

更多详情请参阅 如何识别验证码参数的完整指南。


使用 CapSolver API 解决 reCAPTCHA v2

reCAPTCHA v2 是经典的“我不是机器人”复选框验证码。它可能会向用户展示图像选择挑战。

查找站点密钥

你可以使用 CapSolver 扩展检测器(如上所述)或手动查找:

在页面 HTML 中查找:

<divclass="g-recaptcha"data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>

或在 JavaScript 中查找:

grecaptcha.render('container',{'sitekey':'6Le-xxxxx...'});

辅助函数

# utils/capsolver_helper.pyimporttimeimportrequestsfromshared.configimportConfigdefsolve_recaptcha_v2(website_url:str,website_key:str,is_invisible:bool=False,timeout:int=120)->dict:""" 使用 CapSolver API 解决 reCAPTCHA v2。 Args: website_url: 包含验证码的页面 URL website_key: reCAPTCHA 站点密钥 is_invisible: 是否为不可见 reCAPTCHA v2 timeout: 等待解决方案的最大时间(秒) Returns: 包含 'gRecaptchaResponse' 令牌的字典 """ifnotConfig.validate():raiseException("配置无效 - 检查你的 API 密钥")# 构建任务负载task={"type":"ReCaptchaV2TaskProxyLess","websiteURL":website_url,"websiteKey":website_key,}ifis_invisible:task["isInvisible"]=Truepayload={"clientKey":Config.CAPSOLVER_API_KEY,"task":task}# 创建任务response=requests.post(Config.CREATE_TASK_ENDPOINT,json=payload)result=response.json()ifresult.get("errorId")andresult.get("errorId")!=0:raiseException(f"创建任务失败:{result.get('errorDescription')}")task_id=result.get("taskId")# 轮询结果start_time=time.time()whiletime.time()-start_time<timeout:time.sleep(2)result_payload={"clientKey":Config.CAPSOLVER_API_KEY,"taskId":task_id}response=requests.post(Config.GET_RESULT_ENDPOINT,json=result_payload)result=response.json()ifresult.get("status")=="ready":returnresult.get("solution",{})elifresult.get("status")=="failed":raiseException(f"任务失败:{result.get('errorDescription')}")raiseException(f"超时{timeout}秒后")

完整的 reCAPTCHA v2 示例

frombotasaurus.browserimportbrowser,Driverfromshared.configimportConfigfromutils.capsolver_helperimportsolve_recaptcha_v2 DEMO_URL="https://www.google.com/recaptcha/api2/demo"DEMO_SITEKEY="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"@browser(headless=False)defsolve_recaptcha_v2_with_api(driver:Driver,data:dict):"""使用 CapSolver API 解决 reCAPTCHA v2 并注入令牌。"""url=data.get("url",DEMO_URL)site_key=data.get("site_key",DEMO_SITEKEY)# 步骤 1:加载页面driver.get(url)driver.sleep(2)# 步骤 2:从页面中提取站点密钥(可选)extracted_key=driver.run_js(""" const recaptchaDiv = document.querySelector('.g-recaptcha'); return recaptchaDiv ? recaptchaDiv.getAttribute('data-sitekey') : null; """)ifextracted_key:site_key=extracted_key# 步骤 3:通过 CapSolver API 解决验证码solution=solve_recaptcha_v2(website_url=url,website_key=site_key)token=solution.get("gRecaptchaResponse")# 步骤 4:将令牌注入页面driver.run_js(f""" // 设置隐藏文本区域的值 const responseField = document.querySelector('[name="g-recaptcha-response"]'); if (responseField) {{ responseField.value = "{token}"; }} // 如果可用,触发回调 if (typeof ___grecaptcha_cfg !== 'undefined') {{ try {{ const clients = ___grecaptcha_cfg.clients; for (const key in clients) {{ const client = clients[key]; if (client && client.callback) {{ client.callback("{token}"); }} }} }} catch (e) {{}} }} """)# 步骤 5:提交表单submit_button=driver.select('input[type="submit"]')ifsubmit_button:submit_button.click()driver.sleep(2)return{"success":True,"token_length":len(token)}# 运行演示result=solve_recaptcha_v2_with_api(data={"url":DEMO_URL,"site_key":DEMO_SITEKEY})

使用 CapSolver API 解决 reCAPTCHA v3

reCAPTCHA v3 是不可见的,并通过分析用户行为生成 0.0 到 1.0 之间的分数。

与 v2 的关键区别:reCAPTCHA v3 需要pageAction参数。

查找 pageAction

查找 pageAction 最简单的方法是使用 CapSolver 扩展检测器。或者在页面 JavaScript 中查找:

grecaptcha.execute('siteKey',{action:'login'})// 'login' 是你的 pageAction

辅助函数

defsolve_recaptcha_v3(website_url:str,website_key:str,page_action:str,timeout:int=120)->dict:""" 使用 CapSolver API 解决 reCAPTCHA v3。 Args: website_url: 包含验证码的页面 URL website_key: reCAPTCHA 站点密钥 page_action: 动作参数(v3 必填) timeout: 等待解决方案的最大时间(秒) Returns: 包含 'gRecaptchaResponse' 令牌的字典 """ifnotConfig.validate():raiseException("配置无效 - 检查你的 API 密钥")ifnotpage_action:raiseException("pageAction 是 reCAPTCHA v3 的必需参数")# 构建任务负载task={"type":"ReCaptchaV3TaskProxyLess","websiteURL":website_url,"websiteKey":website_key,"pageAction":page_action,# v3 必填}payload={"clientKey":Config.CAPSOLVER_API_KEY,"task":task}# 创建任务response=requests.post(Config.CREATE_TASK_ENDPOINT,json=payload)result=response.json()ifresult.get("errorId")andresult.get("errorId")!=0:raiseException(f"创建任务失败:{result.get('errorDescription')}")task_id=result.get("taskId")# 轮询结果start_time=time.time()whiletime.time()-start_time<timeout:time.sleep(2)result_payload={"clientKey":Config.CAPSOLVER_API_KEY,"taskId":task_id}response=requests.post(Config.GET_RESULT_ENDPOINT,json=result_payload)result=response.json()ifresult.get("status")=="ready":returnresult.get("solution",{})elifresult.get("status")=="failed":raiseException(f"任务失败:{result.get('errorDescription')}")raiseException(f"超时{timeout}秒后")

完整的 reCAPTCHA v3 示例

frombotasaurus.browserimportbrowser,Driverfromshared.configimportConfigfromutils.capsolver_helperimportsolve_recaptcha_v3 DEMO_URL="https://recaptcha-demo.appspot.com/recaptcha-v3-request-scores.php"DEMO_SITEKEY="6LdyC2cUAAAAACGuDKpXeDorzUDWXmdqeg-xy696"PAGE_ACTION="examples/v3scores"@browser(headless=False)defsolve_recaptcha_v3_with_api(driver:Driver,data:dict):"""使用 CapSolver API 解决 reCAPTCHA v3 并注入令牌。"""url=data.get("url",DEMO_URL)site_key=data.get("site_key",DEMO_SITEKEY)page_action=data.get("page_action",PAGE_ACTION)# 步骤 1:加载页面driver.get(url)driver.sleep(2)# 步骤 2:通过 CapSolver API 解决验证码solution=solve_recaptcha_v3(website_url=url,website_key=site_key,page_action=page_action)token=solution.get("gRecaptchaResponse")# 步骤 3:将令牌注入页面driver.run_js(f""" const token = "{token}"; // 如果存在,设置隐藏字段 const responseField = document.querySelector('[name="g-recaptcha-response"]'); if (responseField) {{ responseField.value = token; }} // 如果表单存在但字段不存在,则创建隐藏字段 const forms = document.querySelectorAll('form'); forms.forEach(form => {{ let field = form.querySelector('[name="g-recaptcha-response"]'); if (!field) {{ field = document.createElement('input'); field.type = 'hidden'; field.name = 'g-recaptcha-response'; form.appendChild(field); }} field.value = token; }}); """)# 步骤 4:提交或验证buttons=driver.select_all("button")forbuttoninbuttons:if"verify"inbutton.text.lower()or"submit"inbutton.text.lower():button.click()driver.sleep(2)breakreturn{"success":True,"token_length":len(token)}# 运行演示result=solve_recaptcha_v3_with_api(data={"url":DEMO_URL,"site_key":DEMO_SITEKEY,"page_action":PAGE_ACTION})

使用 CapSolver API 解决 Cloudflare Turnstile

Cloudflare Turnstile 是一种注重隐私的验证码替代方案,旨在比传统验证码更不侵入用户。

与 reCAPTCHA 的关键区别:

  • 任务类型是AntiTurnstileTaskProxyLess
  • 响应字段是token(不是gRecaptchaResponse
  • 站点密钥通常以0x4开头

查找站点密钥

在页面 HTML 中查找:

<divclass="cf-turnstile"data-sitekey="0x4AAAAAAABS7vwvV6VFfMcD"></div>

辅助函数

defsolve_turnstile(website_url:str,website_key:str,action:str=None,cdata:str=None,timeout:int=120)->dict:"""使用 CapSolver API 解决 Cloudflare Turnstile 验证码。"""使用 CapSolver API 解决 Cloudflare Turnstile。 参数:website_url:包含 Turnstile 的页面的 URL website_key:Turnstile 站点密钥(以0x4开头) action:可选的 data-action 属性中的 action cdata:可选的 data-cdata 属性中的 cdata timeout:等待解决方案的最大时间(秒) 返回:包含'token'字段的字典"""ifnotConfig.validate():raiseException("配置无效 - 检查您的 API 密钥")# 构建任务负载task={"type":"AntiTurnstileTaskProxyLess","websiteURL":website_url,"websiteKey":website_key,}# 添加可选的元数据metadata={}ifaction:metadata["action"]=actionifcdata:metadata["cdata"]=cdataifmetadata:task["metadata"]=metadata payload={"clientKey":Config.CAPSOLVER_API_KEY,"task":task}# 创建任务response=requests.post(Config.CREATE_TASK_ENDPOINT,json=payload)result=response.json()ifresult.get("errorId")andresult.get("errorId")!=0:raiseException(f"创建任务失败:{result.get('errorDescription')}")task_id=result.get("taskId")# 轮询结果start_time=time.time()whiletime.time()-start_time<timeout:time.sleep(2)result_payload={"clientKey":Config.CAPSOLVER_API_KEY,"taskId":task_id}response=requests.post(Config.GET_RESULT_ENDPOINT,json=result_payload)result=response.json()ifresult.get("status")=="ready":returnresult.get("solution",{})elifresult.get("status")=="failed":raiseException(f"任务失败:{result.get('errorDescription')}")raiseException(f"超时,等待了{timeout}秒")

完整的 Turnstile 示例

frombotasaurus.browserimportbrowser,Driverfromshared.configimportConfigfromutils.capsolver_helperimportsolve_turnstile DEMO_URL="https://peet.ws/turnstile-test/non-interactive.html"DEMO_SITEKEY="0x4AAAAAAABS7vwvV6VFfMcD"@browser(headless=False)defsolve_turnstile_with_api(driver:Driver,data:dict):"""使用 CapSolver API 解决 Cloudflare Turnstile 并注入令牌。"""url=data.get("url",DEMO_URL)site_key=data.get("site_key",DEMO_SITEKEY)# 步骤 1: 加载页面driver.get(url)driver.sleep(3)# 步骤 2: 从页面中提取站点密钥(可选)extracted_params=driver.run_js(""" const turnstileDiv = document.querySelector('.cf-turnstile, [data-sitekey]'); if (turnstileDiv) { const key = turnstileDiv.getAttribute('data-sitekey'); if (key && key.startsWith('0x')) { return { sitekey: key, action: turnstileDiv.getAttribute('data-action') }; } } return null; """)ifextracted_paramsandextracted_params.get("sitekey"):site_key=extracted_params["sitekey"]# 步骤 3: 通过 CapSolver API 解决 Turnstilesolution=solve_turnstile(website_url=url,website_key=site_key,action=extracted_params.get("action")ifextracted_paramselseNone)token=solution.get("token")# 步骤 4: 将令牌注入页面driver.run_js(f""" const token = "{token}"; // 找到并填写 cf-turnstile-response 字段 const responseFields = [ document.querySelector('[name="cf-turnstile-response"]'), document.querySelector('[name="cf_turnstile_response"]'), document.querySelector('input[name*="turnstile"]') ]; for (const field of responseFields) {{ if (field) {{ field.value = token; break; }} }} // 如果表单存在但字段不存在,则创建隐藏字段 const forms = document.querySelectorAll('form'); forms.forEach(form => {{ let field = form.querySelector('[name="cf-turnstile-response"]'); if (!field) {{ field = document.createElement('input'); field.type = 'hidden'; field.name = 'cf-turnstile-response'; form.appendChild(field); }} field.value = token; }}); """)# 步骤 5: 提交表单submit_btn=driver.select('button[type="submit"], input[type="submit"]')ifsubmit_btn:submit_btn.click()driver.sleep(2)return{"success":True,"token_length":len(token)}# 运行示例result=solve_turnstile_with_api(data={"url":DEMO_URL,"site_key":DEMO_SITEKEY})

任务类型参考

验证码类型任务类型响应字段必需参数
reCAPTCHA v2ReCaptchaV2TaskProxyLessgRecaptchaResponsewebsiteURL,websiteKey
reCAPTCHA v2 企业版ReCaptchaV2EnterpriseTaskProxyLessgRecaptchaResponsewebsiteURL,websiteKey
reCAPTCHA v3ReCaptchaV3TaskProxyLessgRecaptchaResponsewebsiteURL,websiteKey,pageAction
reCAPTCHA v3 企业版ReCaptchaV3EnterpriseTaskProxyLessgRecaptchaResponsewebsiteURL,websiteKey,pageAction
Cloudflare TurnstileAntiTurnstileTaskProxyLesstokenwebsiteURL,websiteKey

对于阻止数据中心 IP 的网站,请使用代理变体(例如ReCaptchaV2Task)并提供您自己的住宅代理。


最佳实践

1. 令牌过期

验证码令牌会很快过期(通常在 2 分钟内)。收到令牌后应立即使用:

# 获取令牌solution=solve_recaptcha_v2(url,site_key)token=solution.get("gRecaptchaResponse")# 立即使用 - 不要保存以备后用driver.run_js(f'document.querySelector("[name=g-recaptcha-response]").value = "{token}"')driver.select('button[type="submit"]').click()

2. 错误处理

始终实现适当的 API 失败处理逻辑:

try:solution=solve_recaptcha_v2(url,site_key)exceptExceptionase:print(f"验证码解决失败:{e}")# 实现重试逻辑或备用方案

3. 限速

在请求之间添加延迟以避免触发反机器人措施:

driver.sleep(2)# 页面加载后等待# ... 解决验证码 ...driver.sleep(1)# 表单提交前等待

4. 配置验证

在发出请求前始终验证您的 API 密钥:

ifnotConfig.validate():raiseException("请在 .env 文件中配置您的 API 密钥")

结论

将 Botasaurus 与 CapSolver 结合使用,为网络爬虫项目中的验证码提供了一个强大的解决方案。基于 API 的方法让您完全控制解决过程,并在不同验证码类型中可靠运行。

立即提升您的自动化预算!
在为 CapSolver 账户充值时使用优惠码CAPN,每次充值可获得额外5% 奖励—— 没有上限。
现在在您的 CapSolver 仪表板 兑换

关键要点

  • Botasaurus 提供了带有内置反检测功能的浏览器自动化
  • CapSolver API 提供了一种程序化解决多种验证码类型的方法
  • reCAPTCHA v2 需要websiteURLwebsiteKey参数
  • reCAPTCHA v3 额外需要pageAction参数
  • Cloudflare Turnstile 返回token字段而不是gRecaptchaResponse
  • 令牌有效期很短(约 2 分钟),因此在收到后应立即使用

常见问题(FAQ)

如何在 Python 网络爬虫中自动解决 reCAPTCHA 和 Cloudflare Turnstile?

最有效的方法是使用像 Botasaurus 这样的强大浏览器自动化框架,它处理反检测,同时集成像 CapSolver 这样的专用验证码解决 API 来程序化获取所需的解决方案令牌。

使用 Botasaurus 进行反检测网络爬虫有哪些优势?

Botasaurus 通过简洁的基于装饰器的 API 简化了浏览器自动化,同时提供了必要的内置隐身功能,以最大限度地降低被目标网站检测和阻止的风险。

使用 CapSolver API 解决 reCAPTCHA v2 和 v3 有什么区别?

虽然两者都需要websiteURLwebsiteKey,但解决 reCAPTCHA v3(不可见的基于评分的版本)还需要在发送到 CapSolver API 的任务负载中包含一个pageAction参数。

CapSolver 返回验证码令牌后会发生什么?

一旦收到令牌(例如gRecaptchaResponsetoken),必须立即使用 JavaScript 执行命令将其注入目标网页的隐藏表单字段中,然后才能成功提交到服务器。

CapSolver 令牌在过期前能维持多久?

CapSolver 提供的 reCAPTCHA 和 Turnstile 验证码令牌的有效期非常短,通常在约2 分钟内过期,因此需要立即使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 18:38:53

Qwen3-8B+PyTorch:实现快速本地推理的最优组合

Qwen3-8B PyTorch&#xff1a;如何在消费级设备上实现高效本地推理 在生成式AI迅猛发展的今天&#xff0c;越来越多开发者不再满足于调用云端API来“试玩”大模型。他们更关心一个问题&#xff1a;能不能把真正强大的语言模型&#xff0c;跑在自己的电脑上&#xff1f; 这个问…

作者头像 李华
网站建设 2026/3/8 17:13:23

git 下载大模型权重失败?教你正确获取Qwen3-32B文件

git 下载大模型权重失败&#xff1f;教你正确获取Qwen3-32B文件 在部署开源大模型时&#xff0c;你是否曾经历过这样的场景&#xff1a;满怀期待地执行 git clone https://github.com/Qwen/Qwen3-32B.git&#xff0c;结果几分钟后终端突然报错——“fatal: the remote end hun…

作者头像 李华
网站建设 2026/3/5 11:16:27

雷科电力-REKE-30kVA-10kV-5kV工频耐压试验装置

一、概述&#xff1a;雷科电力生产的REKE-30kVA/10kV/5kV智能工频耐压试验系统&#xff0c;该控制系统具有操作便捷&#xff0c;性能优使用安全可靠、外形美观、耐用、移动方便等特点。是供电企业、大型电力企业、冶金、发电厂、铁路等需要电力维修部门的常用的设备。本产品采用…

作者头像 李华
网站建设 2026/3/5 11:00:46

VPS和轻量云服务器哪个更适合手游CPS?

对于手游CPS&#xff08;Cost Per Sale&#xff0c;按销售计费&#xff09;推广业务而言&#xff0c;轻量云服务器&#xff08;Lightweight Cloud Server&#xff09;通常是比传统VPS更优的选择。以下是基于手游CPS业务场景&#xff08;如搭建落地页、跑量测试、挂脚本等&#…

作者头像 李华
网站建设 2026/3/8 21:11:12

Mem Reduct官网下载安装保姆级教程(附最新版安装包,非常详细)

Mem Reduct 是一款只有 300 KB 左右的绿色内存优化软件&#xff0c;完全免费&#xff0c;功能强大&#xff0c;操作简单易用&#xff0c;拥有十分出众的内存清理功能。 Mem Reduct 把复杂的技术藏在极简界面里&#xff0c;双击即可清理内存&#xff0c;内存占用率瞬间掉下去&a…

作者头像 李华
网站建设 2026/3/8 15:22:54

Day37 深入理解SHAP图

SHAP值的解读 对于信贷问题&#xff0c;我们除了希望知道是否存在风险&#xff0c;还希望知道每个特征贡献了多少&#xff0c;比如年收入0.15&#xff0c;收入高&#xff0c;加分;负债率-0.30负债太高&#xff0c;减分;工作年限0.05工作稳定&#xff0c;小加分;信用评分-0.25 …

作者头像 李华