@@ -825,64 +825,73 @@ async def _paste_images_via_event(self, images: List[Dict[str, str]], target_loc
825825
826826 try :
827827 await target_locator .focus ()
828+ await target_locator .click ()
828829 except Exception :
829830 pass
830831
831832 script = """
832- async (target, images) => {
833+ async (images) => {
833834 try {
834- if (!target) {
835- return { success: false, error: "目标元素未找到" };
836- }
837-
838- let successCount = 0;
835+ const dataTransfer = new DataTransfer();
839836
840- target.focus();
841-
842- for (const img of images) {
837+ for (let i = 0; i < images.length; i++) {
838+ const img = images[i];
843839 try {
844- const dataTransfer = new DataTransfer();
845- const res = await fetch(`data:${img.mime};base64,${img.data}`);
846- const blob = await res.blob();
847- const ext = img.mime.split('/')[1] || 'png';
848- const filename = `image_${Date.now()}_${Math.random().toString(36).slice(2)}_${successCount}.${ext}`;
849- const file = new File([blob], filename, { type: img.mime });
850- dataTransfer.items.add(file);
851-
852- const pasteEvent = new ClipboardEvent('paste', {
853- bubbles: true,
854- cancelable: true,
855- clipboardData: dataTransfer
856- });
857-
858- target.dispatchEvent(pasteEvent);
859- successCount++;
840+ const byteCharacters = atob(img.data);
841+ const byteNumbers = new Array(byteCharacters.length);
842+ for (let j = 0; j < byteCharacters.length; j++) {
843+ byteNumbers[j] = byteCharacters.charCodeAt(j);
844+ }
845+ const byteArray = new Uint8Array(byteNumbers);
846+ const blob = new Blob([byteArray], { type: img.mime });
860847
861- await new Promise(r => setTimeout(r, 50));
848+ const ext = img.mime.split('/')[1] || 'png';
849+ const filename = `pasted_image_${i + 1}.${ext}`;
850+ const file = new File([blob], filename, { type: img.mime, lastModified: Date.now() });
862851
852+ dataTransfer.items.add(file);
863853 } catch (err) {
864- console.error(`[AI Studio Enhancements] 处理单张图片数据失败 :`, err);
854+ console.error(`[Paste] 处理图片 ${i + 1} 失败 :`, err);
865855 }
866856 }
867-
868- if (successCount === 0) {
869- return { success: false, error: "没有图片被成功处理" };
857+
858+ if (dataTransfer.files.length === 0) {
859+ return { success: false, error: "没有文件被添加到 DataTransfer" };
860+ }
861+
862+ const pasteEvent = new ClipboardEvent('paste', {
863+ bubbles: true,
864+ cancelable: true,
865+ });
866+
867+ Object.defineProperty(pasteEvent, 'clipboardData', {
868+ value: dataTransfer,
869+ writable: false,
870+ configurable: true
871+ });
872+
873+ const textarea = document.querySelector('ms-prompt-box textarea');
874+ if (textarea) {
875+ textarea.focus();
876+ textarea.dispatchEvent(pasteEvent);
870877 }
871878
872- console.log(`[AI Studio Enhancements] 已逐个触发粘贴事件,共 ${successCount} 个文件。`);
873- return { success: true, count: successCount };
879+ document.dispatchEvent(pasteEvent);
880+
881+ console.log(`[Paste] 已触发粘贴事件,包含 ${dataTransfer.files.length} 个文件`);
882+ return { success: true, count: dataTransfer.files.length };
874883 } catch (err) {
875- console.error('[AI Studio Enhancements] 模拟粘贴事件循环失败 :', err);
884+ console.error('[Paste] 模拟粘贴失败 :', err);
876885 return { success: false, error: err.message };
877886 }
878887 }
879888 """
880- result = await target_locator .evaluate (script , images )
889+ result = await self . page .evaluate (script , images )
881890 if not result or not result .get ('success' ):
882891 error_message = result .get ('error' , '未知错误' )
883892 self .logger .error (f"[{ self .req_id } ] 虚拟粘贴图片失败: { error_message } " )
884893 else :
885- self .logger .info (f"[{ self .req_id } ] 虚拟粘贴事件已触发。 " )
894+ self .logger .info (f"[{ self .req_id } ] ✅ 虚拟粘贴事件已触发 ( { result . get ( 'count' , 0 ) } 个文件) " )
886895
887896
888897 async def submit_prompt (self , prompt : str , image_list : List , check_client_disconnected : Callable ):
0 commit comments