You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展中Google Lens图片上传接口调用失败求助

解决Chrome扩展后台调用Google Lens上传接口失败的问题

Google Lens的https://lens.google.com/v3/upload接口比旧的图片搜索接口有更严格的请求验证机制,直接复用旧接口的调用方式会被拦截,以下是可行的解决思路和代码示例:

核心问题分析

Google Lens接口要求请求必须携带完整的浏览器会话信息(Cookie、特定请求头),且表单字段、参数格式和旧接口完全不同,后台脚本默认的请求上下文不符合要求。

具体解决步骤

1. 配置扩展必要权限

在manifest.json中添加以下权限,确保能获取Lens的Cookie并发起跨域请求:

{
  "host_permissions": ["https://lens.google.com/*"],
  "permissions": ["cookies"]
}

2. 获取Lens会话Cookie并构造完整请求

后台脚本需要先获取lens.google.com的会话Cookie(如NID、SID),再构造符合要求的请求头和表单:

fetch("data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7")
  .then(response => response.blob())
  .then(blob => {
    // 获取Lens的会话Cookie
    chrome.cookies.getAll({ domain: "lens.google.com" }, cookies => {
      const cookieHeader = cookies.map(c => `${c.name}=${c.value}`).join("; ");
      const form = new FormData();
      
      // Lens接口使用file作为图片字段名,而非encoded_image
      form.append("file", blob, "image.gif");
      // 添加必要的参数
      form.append("hl", "zh-CN");
      form.append("source", "upload");

      fetch("https://lens.google.com/v3/upload", {
        method: "POST",
        headers: {
          "Cookie": cookieHeader,
          "Origin": "https://lens.google.com",
          "Referer": "https://lens.google.com/",
          "User-Agent": navigator.userAgent // 确保和浏览器一致
        },
        body: form
      })
      .then(response => {
        if (response.ok) {
          // Lens接口返回JSON数据,而非跳转URL
          response.json().then(data => {
            console.log("Lens结果数据:", data);
            // 可从data中提取结果页面URL,比如data.urls.result
          });
        } else {
          console.error("请求失败:", response.status);
        }
      })
      .catch(error => console.error("请求错误:", error));
    });
  })
  .catch(error => console.error("图片转换错误:", error));

3. 备选方案:由前台页面发起请求

如果后台脚本获取Cookie仍有问题,可通过chrome.runtime.sendMessage让content script或popup发起请求——前台页面的请求上下文完全匹配浏览器会话,更容易通过验证:

后台脚本触发请求:

// 后台脚本
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
  chrome.tabs.sendMessage(tabs[0].id, { 
    action: "uploadToLens", 
    imageData: "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7" 
  }, response => {
    console.log("Lens返回结果:", response);
  });
});

前台content script处理请求:

// content script
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.action === "uploadToLens") {
    fetch(request.imageData)
      .then(res => res.blob())
      .then(blob => {
        const form = new FormData();
        form.append("file", blob, "image.gif");
        form.append("hl", "zh-CN");
        form.append("source", "upload");

        fetch("https://lens.google.com/v3/upload", {
          method: "POST",
          credentials: "include", // 自动携带当前会话Cookie
          body: form
        })
        .then(res => res.json())
        .then(data => sendResponse(data))
        .catch(err => sendResponse({ error: err.message }));
      });
    return true; // 保持消息通道等待异步响应
  }
});

注意事项

  • Google Lens的接口参数和验证规则随时可能变更,上述代码需根据实际抓包结果调整
  • 必须确保用户当前已登录Google账号,未登录状态下接口可能返回403错误
  • 避免频繁发起请求,防止触发Google的反爬虫机制

内容的提问来源于stack exchange,提问作者Escape75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:16:07