lencx / Noi

🚀 Power Your World with AI - Explore, Extend, Empower.
https://noi.nofwl.com
6.66k stars 488 forks source link

[求助]NoiAskCustom在部分网页不能成功加载到全局作用域 #250

Closed ZhenhongDu closed 1 month ago

ZhenhongDu commented 1 month ago

您好,

我在测试定制的noiask的脚本时,发现有的脚本没有成功加载到全局作用域。这种情况有解决思路吗;

代码应该是可以正常工作的,当我右击选择检查元素后,将所有的代码粘贴到console后,便可以在noi的输入框中实现输入和网页同步。再次刷新后,再次无法在noi中实现同步输入。

右击检查元素后,在console中输入了以下代码,得到了以下结果:

NextChatAsk.sync("12123") 成功运行

LobeHubChatAsk.sync("12123") VM408:1 Uncaught ReferenceError: LobeHubChatAsk is not defined at :1:1

ZhenhongDu commented 1 month ago
class LobeHubChatAsk extends NoiAskCustom {
  static name = 'LobeHubChat';
  static url = 'https://chat-preview.lobehub.com';

  // 模拟用户输入
  static sync(message) {
    const inputElement = document.querySelector('textarea.ant-input[placeholder="输入聊天内容..."]');
    if (inputElement) {
      // 使用 setRangeText 模拟用户输入
      inputElement.focus();
      inputElement.setRangeText(message, 0, inputElement.value.length, "end");

      // 触发输入事件
      inputElement.dispatchEvent(new Event('input', { bubbles: true }));
      inputElement.dispatchEvent(new Event('change', { bubbles: true }));

      console.log('Message has been set to the input element:', message);
    } else {
      console.error('Input element not found');
    }
  }

  // 模拟按下 Enter 键
  static submit() {
    const inputElement = document.querySelector('textarea.ant-input[placeholder="输入聊天内容..."]');
    if (inputElement) {
      // 模拟按下 "Enter" 键
      const enterKeyEvent = new KeyboardEvent('keydown', {
        bubbles: true,
        cancelable: true,
        key: 'Enter',
        code: 'Enter',
        keyCode: 13,  // Enter 键的键码是 13
      });
      inputElement.dispatchEvent(enterKeyEvent);

      console.log('Enter key pressed.');
    } else {
      console.error('Input element not found');
    }
  }
}

// Register your AI Chat class within the NoiAsk global namespace for accessibility.
window.NoiAsk = {
  ...window.NoiAsk || {},
  // TODO: Add your AI Chat class here
  LobeHubChatAsk,
};
lencx commented 1 month ago

noi-ask/main.js 同级的还有个 manifest.json 文件,它是用来配置插件加载规则的,你需要在 content_scripts.matches 中添加一下 url 匹配规则(noi-ask-custom 类似)。

ZhenhongDu commented 1 month ago

image @lencx ,大佬已经按照您说的设置了manifest.json文件。麻烦您看一下。设置了.json不需要在console里重新粘贴所有的js代码了,运行以上代码能实现功能。 但不知道为什么,在noi的对话框中,并不能实现同步 image

{
  "manifest_version": 3,
  "name": "@noi/ask-custom",
  "version": "0.1.0",
  "homepage": "https://github.com/lencx/Noi/tree/main/extensions/noi-ask-custom",
  "description": "The best assistant for batch asking and quick typing of prompts.",
  "content_scripts": [
    {
      "matches": [
        "https://app.nextchat.dev/*",
        "https://demo.fuclaude.com/*",
        "https://metaso.cn/*",
        "https://chat-preview.lobehub.com/*"
      ],
      "js": ["main.js"],
      "run_at": "document_end",
      "world": "MAIN"
    }
  ]
}
lencx commented 1 month ago

你把这段代码换成 document.querySelector('textarea.ant-input'),我不太确定是不是你的选择器没找到元素。我这边用你发的方法是可以的。

// const inputElement = document.querySelector('textarea.ant-input[placeholder="输入聊天内容..."]');
const inputElement = document.querySelector('textarea.ant-input');

Screen Recording 2024-10-28 at 00 44 08

另外,你可以自己调试一下代码,在 Noi 里打开控制台,输入的时候,看有没有报错信息(sync 方法会在输入时持续触发)。

ZhenhongDu commented 1 month ago

谢谢大佬,排查过元素选择器的错误。也修改了,但似乎还是没有起作用 img

ZhenhongDu commented 1 month ago

在 Noi 里打开控制台,输入的时候,console完全没有响应 img

ZhenhongDu commented 1 month ago

在我的自定义的别的网站好像完全没有这个问题,主要是大佬你的电脑可以运行就很邪门了,不过我的是windows系统的 img

lencx commented 1 month ago
  1. 在 sync 方法的开始部分打个 console.log,看有没有执行。
  2. 你的侧栏链接设置的是什么?
ZhenhongDu commented 1 month ago

在sync方法开始加了一个log,输入的时候没有被执行 image image 侧栏设置的是: https://chat-preview.lobehub.com

json文件里 image

ZhenhongDu commented 1 month ago

大佬我刚才在打开NOI后,用noi ask仍然不行;但是我打开元素检查之后,先在lobechat里面输入,然后console里开始弹出log的信息,再到noi ask里输入突然就可以了;我也不知道为什么

ZhenhongDu commented 1 month ago

总之非常感谢大佬的帮助了