+
95
-

chrome如何编写插件将任意图片或选择的文字发送给localhost的http api?

chrome如何编写插件将任意图片或选择的文字发送给localhost的http api?


网友回复

+
11
-

可以通过创建一个 Chrome 插件,利用其强大的 API 来实现这个功能。核心思路是:

添加右键菜单:当用户右键点击图片或选中文字时,在上下文菜单中显示我们的自定义选项。

捕获数据

对于图片,Chrome 的上下文菜单 API 会直接提供图片的 URL (srcUrl)。

对于文字,我们需要向当前页面注入一个脚本来获取用户选中的文本。

发送数据:在后台脚本中,使用 fetch API 将捕获到的数据以 JSON 格式发送到你本地的 HTTP API。

下面是详细的步骤和代码。

第1步:创建 manifest.json

这是插件的配置文件,定义了插件的基本信息和所需的权限。

{
  "manifest_version": 3,
  "name": "Send to Localhost",
  "version": "1.0",
  "description": "Send selected text or images to a local HTTP API.",
  "permissions": [
    "contextMenus",    // 用于创建右键菜单
    "activeTab",       // 用于获取当前活动标签页的权限
    "scripting"        // 用于向页面注入脚本(获取选中文本)
  ],
  "host_permissions": [
    "http://localhost/*", // 关键:允许插件向 localhost 发起请求
    "https://localhost/*"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html",
    "default_icon": "icon.png"
  },
  "icons": {
    "48": "icon.png"
  }
}

权限解释

contextMenus: 创建和管理右键菜单。

activeTab + scripting: 这对组合是 Manifest V3 中向当前页面临时注入脚本的标准方式,用于获取选中的文字。

host_permissions: 这是最重要的权限。它明确允许你的插件向 http://localhost 或 https://localhost 下的任何端口和路径发起网络请求。没有这个,fetch 请求会被浏览器的安全策略阻止。

第2步:创建后台脚本 background.js

这是插件的核心逻辑所在,负责创建菜单、处理点击事件和发送数据。

// 在插件安装时创建右键菜单
chrome.runtime.onInstalled.addListener(() => {
  // 为选中的文字创建菜单项
  chrome.contextMenus.create({
    id: "send-text",
    title: "发送选中的文字到 Localhost",
    contexts: ["selection"] // 只在用户选中文字时显示
  });

  // 为图片创建菜单项
  chrome.contextMenus.create({
    id: "send-image",
    title: "发送图片到 Localhost",
    contexts: ["image"] // 只在用户右键点击图片时显示
  });
});

// 监听右键菜单的点击事件
chrome.contextMenus.onClicked.addListener((info, tab) => {
  if (info.menuItemId === "send-text") {
    // 处理发送文字
    handleSendText(tab.id);
  } else if (info.menuItemId === "send-image") {
    // 处理发送图片
    handleSendImage(info.srcUrl);
  }
});

// 处理发送文字的逻辑
async function handleSendText(tabId) {
  // 向当前标签页注入一个脚本来获取选中的文字
  const results = await chrome.scripting.executeScript({
    target: { tabId: tabId },
    function: ...

点击查看剩余70%

我知道答案,我要回答