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
相关产品推荐
相关产品推荐

