共计 2410 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
在自动化访问 ChatGPT 的过程中,开发者常遇到几个核心问题。这些问题不仅影响脚本的稳定性,还可能触发平台的反爬机制,导致访问受限。

- 验证码拦截 :ChatGPT 会针对异常访问行为弹出 reCAPTCHA 等验证码,传统自动化工具难以处理
- 动态元素加载 :页面采用 React 等前端框架,元素加载时机不固定
- 会话管理复杂 :登录状态保持困难,频繁重新登录易被风控
- 反爬策略严格 :请求频率、鼠标轨迹等行为检测机制完善
技术选型对比
| 工具 | 优点 | 缺点 | ChatGPT 适用性 |
|---|---|---|---|
| Selenium | 生态成熟,多语言支持 | 执行速度较慢 | ★★★★☆ |
| Playwright | 跨浏览器支持好,速度快 | 新工具社区资源较少 | ★★★★☆ |
| Puppeteer | 对 Chromium 优化最好 | 仅限 JavaScript 生态 | ★★★☆☆ |
核心实现细节
验证码处理方案
- 人工干预法 :设置足够长的超时时间,手动处理首次验证
- cookies 复用 :保存已登录的 cookies 避免重复验证
- 第三方服务 :集成 2captcha 等验证码识别 API(需注意合规性)
动态元素等待策略
# 显式等待最佳实践
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 30)
textarea = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "textarea#prompt-textarea"))
)
会话管理技巧
- 使用 profile 目录保持登录状态
- 定期刷新 cookies 防止过期
- 多账号轮换降低单个账号风险
完整代码示例
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
# 配置 Chrome 选项
chrome_options = Options()
chrome_options.add_argument("--user-data-dir=./chrome_profile")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 初始化驱动
service = Service(executable_path="./chromedriver")
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
# 访问 ChatGPT
driver.get("https://chat.openai.com")
# 等待页面加载
time.sleep(5) # 初始加载等待
# 检测是否出现验证码
if "verify" in driver.current_url:
print("请手动完成验证码验证")
while "verify" in driver.current_url:
time.sleep(1)
# 定位输入框
prompt_area = driver.find_element(By.CSS_SELECTOR, "textarea#prompt-textarea")
prompt_area.send_keys("Hello ChatGPT")
# 提交问题
submit_btn = driver.find_element(By.CSS_SELECTOR, "button[data-testid='send-button']"
)
submit_btn.click()
# 等待响应
response_locator = (By.CSS_SELECTOR, "div[class*='markdown']")
WebDriverWait(driver, 60).until(EC.presence_of_element_located(response_locator)
)
# 获取响应内容
responses = driver.find_elements(*response_locator)
print(responses[-1].text)
finally:
driver.quit()
性能与安全性考量
优化建议
- 资源加载控制 :
chrome_options.add_argument("--blink-settings=imagesEnabled=false") chrome_options.add_argument("--disable-extensions") - 请求间隔 :设置 3 - 5 秒的随机延迟避免高频请求
- 行为模拟 :
from selenium.webdriver.common.action_chains import ActionChains actions = ActionChains(driver) actions.move_to_element(element).pause(1).click().perform()
反爬规避
- 定期更换 User-Agent
- 使用住宅代理 IP
- 避免固定操作模式
生产环境避坑指南
- 验证码频繁出现
-
解决方案:降低操作频率,使用真实用户行为模式
-
会话突然终止
-
解决方案:实现自动重连机制,监控网络状态
-
元素定位失败
-
解决方案:使用多种定位策略组合,如 XPath 和 CSS 选择器备用
-
性能下降
- 解决方案:定期清理缓存,使用无头模式减少资源消耗
扩展方向
可以尝试实现以下高级功能:
- 多账号自动切换系统
- 对话上下文保持
- 自动解析响应内容
- 异常自动恢复机制
期待大家在评论区分享自己的实现经验和优化方案。
正文完
