refactor(gemini): 移除废弃的 Canvas 和 Fetch 图像提取逻辑
This commit is contained in:
@@ -551,64 +551,66 @@ export function createOps(page) {
|
|||||||
}
|
}
|
||||||
console.log(`[extractImageBase64] 🔍 开始提取, url=${url.slice(0, 120)}...`);
|
console.log(`[extractImageBase64] 🔍 开始提取, url=${url.slice(0, 120)}...`);
|
||||||
|
|
||||||
// ── 阶段 1: Canvas 提取 ──
|
// 无论是fetch还是canvas提取都会失败,这里留作学习,走CDP的url获取兜底
|
||||||
const canvasResult = await op.query((targetUrl) => {
|
|
||||||
const imgs = [...document.querySelectorAll('img.image.loaded')];
|
|
||||||
const img = imgs.find(i => i.src === targetUrl);
|
|
||||||
if (!img) {
|
|
||||||
return { ok: false, error: 'img_not_found_by_url', searched: imgs.length };
|
|
||||||
}
|
|
||||||
const w = img.naturalWidth || img.width;
|
|
||||||
const h = img.naturalHeight || img.height;
|
|
||||||
|
|
||||||
try {
|
// // ── 阶段 1: Canvas 提取 ──
|
||||||
const canvas = document.createElement('canvas');
|
// const canvasResult = await op.query((targetUrl) => {
|
||||||
canvas.width = w;
|
// const imgs = [...document.querySelectorAll('img.image.loaded')];
|
||||||
canvas.height = h;
|
// const img = imgs.find(i => i.src === targetUrl);
|
||||||
canvas.getContext('2d').drawImage(img, 0, 0);
|
// if (!img) {
|
||||||
const dataUrl = canvas.toDataURL('image/png');
|
// return { ok: false, error: 'img_not_found_by_url', searched: imgs.length };
|
||||||
return { ok: true, dataUrl, width: w, height: h, method: 'canvas' };
|
// }
|
||||||
} catch (e) {
|
// const w = img.naturalWidth || img.width;
|
||||||
return { ok: false, needFallback: true, src: img.src, width: w, height: h, canvasError: e.message || String(e) };
|
// const h = img.naturalHeight || img.height;
|
||||||
}
|
|
||||||
}, url);
|
|
||||||
|
|
||||||
if (canvasResult.ok) {
|
// try {
|
||||||
console.log(`[extractImageBase64] ✅ Canvas 提取成功 (${canvasResult.width}x${canvasResult.height})`);
|
// const canvas = document.createElement('canvas');
|
||||||
return canvasResult;
|
// canvas.width = w;
|
||||||
}
|
// canvas.height = h;
|
||||||
|
// canvas.getContext('2d').drawImage(img, 0, 0);
|
||||||
|
// const dataUrl = canvas.toDataURL('image/png');
|
||||||
|
// return { ok: true, dataUrl, width: w, height: h, method: 'canvas' };
|
||||||
|
// } catch (e) {
|
||||||
|
// return { ok: false, needFallback: true, src: img.src, width: w, height: h, canvasError: e.message || String(e) };
|
||||||
|
// }
|
||||||
|
// }, url);
|
||||||
|
|
||||||
if (!canvasResult.needFallback) {
|
// if (canvasResult.ok) {
|
||||||
console.warn(`[extractImageBase64] ❌ 页面中未找到匹配的 img 元素 (已扫描 ${canvasResult.searched || 0} 张)`);
|
// console.log(`[extractImageBase64] ✅ Canvas 提取成功 (${canvasResult.width}x${canvasResult.height})`);
|
||||||
return canvasResult;
|
// return canvasResult;
|
||||||
}
|
// }
|
||||||
|
|
||||||
console.log(`[extractImageBase64] ⚠ Canvas 被污染 (${canvasResult.canvasError}),尝试页面 fetch...`);
|
// if (!canvasResult.needFallback) {
|
||||||
|
// console.warn(`[extractImageBase64] ❌ 页面中未找到匹配的 img 元素 (已扫描 ${canvasResult.searched || 0} 张)`);
|
||||||
|
// return canvasResult;
|
||||||
|
// }
|
||||||
|
|
||||||
// ── 阶段 2: 页面 fetch(可能被 CORS 拦截) ──
|
// console.log(`[extractImageBase64] ⚠ Canvas 被污染 (${canvasResult.canvasError}),尝试页面 fetch...`);
|
||||||
const fetchResult = await page.evaluate(async (src) => {
|
|
||||||
try {
|
|
||||||
const r = await fetch(src);
|
|
||||||
if (!r.ok) return { ok: false, error: `fetch_status_${r.status}` };
|
|
||||||
const blob = await r.blob();
|
|
||||||
const mime = blob.type || 'image/png';
|
|
||||||
return await new Promise((resolve) => {
|
|
||||||
const reader = new FileReader();
|
|
||||||
reader.onloadend = () => resolve({ ok: true, dataUrl: reader.result, mime });
|
|
||||||
reader.onerror = () => resolve({ ok: false, error: 'filereader_error' });
|
|
||||||
reader.readAsDataURL(blob);
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
return { ok: false, error: 'fetch_failed', detail: err.message || String(err) };
|
|
||||||
}
|
|
||||||
}, canvasResult.src);
|
|
||||||
|
|
||||||
if (fetchResult.ok) {
|
// // ── 阶段 2: 页面 fetch(可能被 CORS 拦截) ──
|
||||||
console.log(`[extractImageBase64] ✅ 页面 fetch 提取成功 (${canvasResult.width}x${canvasResult.height})`);
|
// const fetchResult = await page.evaluate(async (src) => {
|
||||||
return { ...fetchResult, width: canvasResult.width, height: canvasResult.height, method: 'fetch' };
|
// try {
|
||||||
}
|
// const r = await fetch(src);
|
||||||
|
// if (!r.ok) return { ok: false, error: `fetch_status_${r.status}` };
|
||||||
|
// const blob = await r.blob();
|
||||||
|
// const mime = blob.type || 'image/png';
|
||||||
|
// return await new Promise((resolve) => {
|
||||||
|
// const reader = new FileReader();
|
||||||
|
// reader.onloadend = () => resolve({ ok: true, dataUrl: reader.result, mime });
|
||||||
|
// reader.onerror = () => resolve({ ok: false, error: 'filereader_error' });
|
||||||
|
// reader.readAsDataURL(blob);
|
||||||
|
// });
|
||||||
|
// } catch (err) {
|
||||||
|
// return { ok: false, error: 'fetch_failed', detail: err.message || String(err) };
|
||||||
|
// }
|
||||||
|
// }, canvasResult.src);
|
||||||
|
|
||||||
console.log(`[extractImageBase64] ⚠ 页面 fetch 失败 (${fetchResult.error}${fetchResult.detail ? ' — ' + fetchResult.detail : ''}),尝试 CDP 缓存读取...`);
|
// if (fetchResult.ok) {
|
||||||
|
// console.log(`[extractImageBase64] ✅ 页面 fetch 提取成功 (${canvasResult.width}x${canvasResult.height})`);
|
||||||
|
// return { ...fetchResult, width: canvasResult.width, height: canvasResult.height, method: 'fetch' };
|
||||||
|
// }
|
||||||
|
|
||||||
|
// console.log(`[extractImageBase64] ⚠ 页面 fetch 失败 (${fetchResult.error}${fetchResult.detail ? ' — ' + fetchResult.detail : ''}),尝试 CDP 缓存读取...`);
|
||||||
|
|
||||||
// ── 阶段 3: CDP Network.getResponseBody(从浏览器内存缓存读取,零网络开销) ──
|
// ── 阶段 3: CDP Network.getResponseBody(从浏览器内存缓存读取,零网络开销) ──
|
||||||
const requestId = getImageRequestId(canvasResult.src);
|
const requestId = getImageRequestId(canvasResult.src);
|
||||||
|
|||||||
Reference in New Issue
Block a user