谷歌Google、紫鸟浏览器插件开发

devtools/2025/1/12 16:27:55/

对于跨境电商行业的IT部门来说,经常需要获取各种店铺相关数据,但是仅靠官方提供的接口来获取数据远远不够,这个时候我们就需要插件或者RPA的方式来获取数据。

以下是关于自研紫鸟插件的简单demo,紫鸟浏览器使用的是火狐和谷歌的插件,下面以谷歌插件作为演示。

  1. 创建插件应用
    首先要进入开发者控制台,有些权限需要找企业管理员给你授权,然后创建插件应用,内部使用,一般自研应用就够了,也不需要审核。
    在这里插入图片描述
  2. 开通debug调试权限
    要开发插件,调试控制台必不可少。要开通调试权限也需要企业管理员才可针对个人开通。
    官方图片:官方图片
  3. 开发插件
    • 首先是插件开发的目录结构:
      在这里插入图片描述
      后台脚本:可直接与你后端服务做交互,否则在其他的目录文件中会出现同源策略问它;
      嵌入页:这个目录就是直接与目标网站做交互的脚本,调用网站的接口、下载、获取网页内容等,也可以自己写个html嵌入到网站中;
      插件页面:这就是点击插件时展示的页面,可以用来做一些插件登陆,配置等;
      配置文件:这里面就是整个工程的一些配置,插件的名称、权限、脚本等。

    • 配置文件manifest.json

      	{"manifest_version": 3,"name": "我的插件","version": "1.0.0","description": "插件开发学习测试","action": {"default_title": "点击插件打开的页面","default_popup": "popup/index.html"},"background": {"service_worker": "background/service_worker.js","type": "module"},"permissions": ["notifications","tabs"],"content_scripts": [{"matches": ["https://lkcoffee.com/"],"css": ["content/index.css"],"js": ["content/index.js"]}]
      }
      
    • background

      // 定时
      setInterval(() => {// google APIchrome.notifications.create({type: "basic",title: "消息通知标题",message: "消息通知",// iconUrl: "../icons/icon.png"},(notificationId) => {console.log('消息通知ID-->', notificationId)});}, 3000)// 监听消息chrome.runtime.onMessage.addListener(async (message, sender, sendResponse) => {if (message.action === 'fromPopup') {chrome.notifications.create({type: "basic",title: "Notifications Title",message: "Notifications message to display",iconUrl: "../icons/icon.png"},(notificationId) => {console.log('插件popup发来的消息')});}
      
    • centent

      console.log('this is content js')
      console.log('document', document)
      console.log('location', location)
      console.log('window', window)//创建页面函数
      function createPage () {const page = "<div id='cj_move_page'>"+"<h3 id='cj_move_h3'>my Plugin</h3>"+"<button id='cj_but1'>消息通知</button>"+"<button id='cj_but2'>fetch http 请求</button>"+"</div>"document.body.insertAdjacentHTML('beforeend',page)document.getElementById('cj_but1').onclick = () => {console.log("消息通知按钮触发")chrome.runtime.sendMessage({action: "fromContent"});}document.getElementById('cj_but2').onclick = async() => {console.log("fetch http 请求 按钮触发")const response = await fetch("https://movie.douban.com/j/tv/recommend_groups")if (!response.ok) {throw new Error('Network response was not ok')}const allData = await response.json()console.log('fetch http 请求返回值', allData)}//拖拽drag(cj_move_h3)
      }
      createPage()//拖拽
      function drag(ele) {let oldX, oldY, newX, newYele.onmousedown = function (e) {if (!cj_move_page.style.right && !cj_move_page.style.bottom) {cj_move_page.style.right = 0cj_move_page.style.bottom = 0}oldX = e.clientXoldY = e.clientYdocument.onmousemove = function (e) {newX = e.clientXnewY = e.clientYcj_move_page.style.right = parseInt(cj_move_page.style.right) - newX + oldX + 'px'cj_move_page.style.bottom = parseInt(cj_move_page.style.bottom) - newY + oldY + 'px'oldX = newXoldY = newY}document.onmouseup = function () {document.onmousemove = nulldocument.onmouseup = null}}
      }// 监听插件popup发来的消息
      chrome.runtime.onMessage.addListener((e) => {console.log('content:', 'popup发来的消息')
      })
      
    • popup
      html

      	<!-- 插件的UI界面 --><!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./index.css">
      </head>
      <body><div class="plugin_search"><div class="plugin_search_bar"><input id="plugin_search_inp" /><input id="plugin_search_but" type="button" value="翻译" /></div><div class="plugin_span"><span>翻译此页面</span></div></div><div class="plugin_footer"><span>© 2015 Google -</span><a target="_blank" href="https://google.com/">扩展程序选项</a><a target="_blank" href="https://translate.google.com/?source=gtx">Google 翻译</a></div>
      </body>
      <script src="./index.js"></script>
      </html>
      

      js

      const plugin_search_but = document.getElementById('plugin_search_but')
      const plugin_search_inp = document.getElementById('plugin_search_inp')
      plugin_search_but.onclick = async function () {// alert('plugin_search_inp的值为:' + plugin_search_inp.value.trim())console.log('plugin_search_inp的值为:' + plugin_search_inp.value.trim())// 向 Service Worker 发送消息chrome.runtime.sendMessage({action: 'fromPopup',message: 'Hello from Popup!'});// 向嵌入页面content发送消息const [tab] = await chrome.tabs.query({url: ["https://lkcoffee.com/*"],active: true,currentWindow: true});console.log('tab', tab)if (tab) {// 使用 chrome.tabs.sendMessage 发送消息chrome.tabs.sendMessage(tab.id, {action: 'fromPopup2Content'})}
      }
      
  • 调试
    将整个文件夹上传,在目标网页中刷新就可以看到我们的插件了在这里插入图片描述

  • 打包
    点上面的【打包扩展程序】
    第一打包是不需要密钥文件的,第一次打包后会生成一个密钥文件,后续的打包都需要这个密钥文件,否则生成的就是一个新的插件,无法按版本升级的方式发布。在这里插入图片描述

  • 上线
    将打好的包上传,按要求填写一些信息,完成!
    在这里插入图片描述


http://www.ppmy.cn/devtools/149531.html

相关文章

【人工智能】自然语言生成的前沿探索:利用GPT-2和BERT实现自动文本生成与完形填空

自然语言生成&#xff08;Natural Language Generation, NLG&#xff09;是人工智能领域的重要研究方向&#xff0c;旨在通过计算机系统自动生成连贯、符合语法和语义的自然语言文本。近年来&#xff0c;预训练语言模型如GPT-2和BERT在NLG任务中取得了显著的成果。本文深入探讨…

Go 中的单引号 (‘)、双引号 (“) 和反引号 (`)

在 Go 中&#xff0c;单引号 ()、双引号 (") 和反引号 () 都有不同的用途和含义&#xff0c;具体如下&#xff1a; 1. 单引号 () 单引号用于表示 字符字面量&#xff08;单个字符&#xff09;。在 Go 中&#xff0c;字符是一个单独的 Unicode 字符&#xff0c;并且它的类…

【Spring Boot 应用开发】-04 自动配置-数据源

深入讲解 Spring Boot 自动配置中的数据源配置 为了更好地理解 Spring Boot 中的自动配置机制&#xff0c;我们以数据源配置机制为例&#xff0c;按照以下顺序进行讲解&#xff1a; 不使用任何框架来连接数据源的方式使用 Spring MVC 连接数据源的方式使用 Spring Boot 自动配…

深度求索的新突破——DeepSeek-V3

在人工智能领域不断发展的浪潮中&#xff0c;DeepSeek-V3的出现犹如一颗璀璨的新星&#xff0c;引起了广泛的关注和热议 DeepSeek-V3是由杭州深度求索人工智能基础技术研究有限公司于2024年12月26日发布的混合专家&#xff08;MoE&#xff09;语言模型 官网&#xff1a;https…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

vue常用功能收集

文章目录 vue如何实现输入条件后点击enter进行查询vue项目启动修改后报错vue禁止iframe里面的右键启动 vue如何实现输入条件后点击enter进行查询 在Vue中&#xff0c;您可以通过监听键盘事件来实现在输入条件后点击Enter进行查询的功能。以下是一个简单的示例&#xff1a; &l…

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

C++ STL 中的 `unordered_map` 和 `unordered_set` 总结

1. unordered_map unordered_map 是一个基于哈希表实现的容器&#xff0c;存储键值对&#xff08;key-value&#xff09;&#xff0c;每个键必须唯一&#xff0c;可以快速插入、删除、查找。 基本特性 存储结构&#xff1a;键值对 (key-value)。键唯一性&#xff1a;每个键在…