使用2Captcha Python API识别验证码遇下载失败问题求助
解决验证码图片下载失败问题
问题根源
直接请求验证码图片URL时,服务器会验证请求的会话合法性——浏览器访问验证码展示页面时会生成会话Cookie,而你的代码没有携带这些Cookie,导致服务器返回的不是有效图片数据(可能是错误页面或空内容),所以PIL无法识别。
解决方案
使用requests.Session()维持会话,先访问验证码展示页面获取会话Cookie,再请求图片URL:
步骤1:获取会话并下载验证码图片
import requests from PIL import Image from io import BytesIO # 初始化会话 session = requests.Session() # 先访问验证码展示页面,获取会话Cookie captcha_page_url = 'https://v2.gcchmc.org/book-appointment/' session.get(captcha_page_url) # 再请求验证码图片 captcha_img_url = 'https://v2.gcchmc.org/captcha/image/aa699f305917812978c911e87ab126a782f726e7/' response = session.get(captcha_img_url) # 验证响应是否为图片 if response.headers.get('Content-Type').startswith('image/'): img = Image.open(BytesIO(response.content)) img.save('output.png') print("图片下载成功") else: print(f"返回内容不是图片,Content-Type: {response.headers.get('Content-Type')}") print("响应内容:", response.text[:500]) # 打印前500字符排查问题
步骤2:将本地图片传给2Captcha识别
修改2Captcha代码,使用本地图片路径代替URL:
import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) from twocaptcha import TwoCaptcha solver = TwoCaptcha(apikey) try: # 传入本地图片路径 result = solver.normal('output.png') except Exception as e: sys.exit(e) else: sys.exit('solved: ' + str(result))
额外说明
- 验证码URL中的哈希值(
aa699f305917812978c911e87ab126a782f726e7)和会话绑定,每次会话会生成新的哈希值,实际使用时需要从页面中动态提取该URL,不要硬编码。 - 如果仍失败,可添加
User-Agent请求头模拟浏览器:headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } session.get(captcha_page_url, headers=headers) response = session.get(captcha_img_url, headers=headers)
内容的提问来源于stack exchange,提问作者farhan jatt
相关产品推荐
相关产品推荐

