如何通过PHP获取Google验证码图片内容并转为base64格式
PHP cURL获取Google拦截页验证码图片转base64实现
核心前提:请求验证码图片必须复用触发拦截时的cURL会话与对应Cookie,否则会获取到无效的错误图片资源
实现步骤
- 检测返回的HTML内容是否为验证码拦截页,通过正则匹配验证码图片标签的src属性
- 对匹配到的src路径做HTML实体解码,补全域名前缀得到完整的验证码图片请求地址
- 复用原有cURL句柄(保留会话Cookie、UA等原有请求配置)请求验证码图片的二进制内容
- 校验图片请求成功后,将二进制内容编码为base64,拼接对应data URI头即可直接用于前端展示
完整代码示例
// 假设 $response 是触发验证码拦截时拿到的HTML响应内容 // 假设 $ch 是发起原Google搜索请求使用的cURL句柄(已配置Cookie、UA等参数) if (preg_match('/<img[^>]+src="(\/sorry\/image[^"]+)"/i', $response, $matches)) { // 解码HTML转义字符,处理路径中被转义的&等实体 $imgRelativePath = html_entity_decode($matches[1]); // 拼接对应Google域名,示例中为土耳其域名google.com.tr,根据实际请求域名替换 $captchaImgFullUrl = "https://www.google.com.tr" . $imgRelativePath; // 复用原有cURL配置请求图片 curl_setopt($ch, CURLOPT_URL, $captchaImgFullUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $imgContent = curl_exec($ch); $requestInfo = curl_getinfo($ch); // 校验请求状态,生成可用的base64图片 if ($requestInfo['http_code'] === 200 && $imgContent) { $captchaBase64 = sprintf( 'data:%s;base64,%s', $requestInfo['content_type'], base64_encode($imgContent) ); // $captchaBase64 可直接赋值给<img>标签的src属性展示验证码 } }
注意事项
- 禁止新建独立cURL资源请求验证码图片,Google的验证码资源与会话Cookie强绑定,新会话无法获取对应验证码图
- 不要硬编码验证码图片的URL参数,所有参数以拦截页HTML中输出的src路径为准,参数会动态生成,硬编码会直接失效
- 后续提交验证码校验请求时,同样需要复用该cURL句柄,保持Cookie一致,否则验证码校验会失败
- 若请求时使用了代理、特定UA头,请求图片时也要保留相同配置,避免触发额外拦截
内容的提问来源于stack exchange,提问作者Akın Evrenkaya
相关产品推荐
相关产品推荐

