具体如何编写Chrome扩展,可以查看Google提供的API文档。本次我打算编写一个简易版本,右键提供一个上下文菜单,复制文本。一些文本屏蔽的内容较少,也有方法查看。如下图所示。

准备图标

新建文件夹CopyText,这将是我们的插件目录。
前往iconfont选择一个合适的图标,尺寸准备16,32,48,64,128

想要获得代码提示,需要在WebStorm中导入库。

点击download,找到chrome

现在,你就可以获得代码提示功能。

编写清单文件(manifest.json)

{"name": "Copy Text","version": "0.1","manifest_version": 3,"background": {"service_worker": "background.js"},"icons": {"16": "icons/copy16.png","32": "icons/copy32.png","48": "icons/copy48.png","64": "icons/copy64.png","128": "icons/copy128.png"}
}

manifest_version非常重要,只能写成数字3,manifest_version2在未来会被废弃。
打开开发者模式并且加载文件夹

编写后台脚本

MV3的后台脚本使用了service worker
我们将要使用到contextMenus,因此需要在manifest.json中声明权限。

查看API文档使用即可。
我尝试了解除阻止右键菜单事件,发现不好处理。因为Event.addEventListener触发事件为匿名函数就不好处理。
为了,我们采取捕获网络请求的方式。Chrome提供了webRequest用于捕获请求,同时完成剪切操作需要scriptingtabs
为此声明权限:

在Chrome中捕获请求

这就是我们要捕获的请求;

async function getPageUrl() {let pagesRequest = []chrome.webRequest.onHeadersReceived.addListener(details => {// console.log(details.url)if (details.url.indexOf('0.json') !== -1) {pagesRequest.push(details.url)}}, {urls: ["https://*.bdimg.com/*"]})return pagesRequest
}

拿到url后排序

urls.sort((u1, u2) => {let q1 = getQuery(u1);let q2 = getQuery(u2);let s1 = q1['x-bce-range'].split('-')[0];let s2 = q2['x-bce-range'].split('-')[0];return s2 - s1})function getQuery(u) {const url = decodeURI(u); // 获取url中"?"符后的字串(包括问号)let query = {};if (url.indexOf("?") !== -1) {const str = url.substr(1);const pairs = str.split("&");for (let i = 0; i < pairs.length; i++) {const pair = pairs[i].split("=");query[pair[0]] = pair[1];}}return query;  // 返回对象
}

将他们拼接成文本


async function collectParagraph(...urls) {let article = ""for (let url of urls) {console.log('当前url:', url);let response = await fetch(url, {"headers": {"accept": "*/*","accept-language": "zh-CN,zh;q=0.9","sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"98\", \"Google Chrome\";v=\"98\"","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "\"Windows\"","sec-fetch-dest": "script","sec-fetch-mode": "no-cors","sec-fetch-site": "cross-site"},"referrer": "https://wenku.baidu.com/","referrerPolicy": "strict-origin-when-cross-origin","body": null,"method": "GET","mode": "cors","credentials": "omit"});let result = await response.text()let content = JSON.parse(result.substring(8, result.length - 1));for (let para of content.body) {// console.log(para.c)article += para.c;if (para.ps != null)for (let i = 0; i < para.ps["_enter"]; i++) {article += '\n';}}}return article;
}

复制到剪切板

async function copyText(text) {let currentTab = await getCurrentTab();await chrome.scripting.executeScript({target: {tabId: currentTab.id},func: (text) => {navigator.clipboard.writeText(text).then(function () {console.log("success")}, function () {console.log("failed")});},args: [text]})
}

主函数执行整个过程

(async () => {chrome.runtime.onInstalled.addListener(() => {chrome.contextMenus.create({contexts: ['selection', 'page'],title: "复制文本",id: "copyMenu",})})let urls = await getPageUrl();urls.sort((u1, u2) => {let q1 = getQuery(u1);let q2 = getQuery(u2);let s1 = q1['x-bce-range'].split('-')[0];let s2 = q2['x-bce-range'].split('-')[0];return s2 - s1})async function handleContextMenus(info) {let article = ""if (info.menuItemId === 'copyMenu' && info.selectionText !== undefined) {await copyText(info.selectionText)} else if (info.menuItemId === 'copyMenu' && info.pageUrl.indexOf('https://wenku.baidu.com') !== -1) {article += await collectParagraph(...urls)await copyText(article)}}chrome.contextMenus.onClicked.addListener((async info => {await handleContextMenus(info);}))})();

最后清单文件是:

{"name": "Copy Text","version": "0.1","manifest_version": 3,"author": "叶秋明","description": "复制文本和获取百度文库的内容","background": {"service_worker": "background.js"},"icons": {"16": "icons/copy16.png","32": "icons/copy32.png","48": "icons/copy48.png","64": "icons/copy64.png","128": "icons/copy128.png"},"permissions": ["contextMenus","tabs","scripting","webRequest"],"host_permissions": ["https://wenku.baidu.com/*","https://*.bdimg.com/*","<all_urls>"]
}

创建一个可以复制百度文库的Chrome插件相关推荐

  1. 【Chrome Extensions】实现一个可以下载图片的Chrome插件

    网上有许多的工具可以做这件事,但我还是自己用Chrome Extensions的方式倒腾倒腾. 在google上搜索了一下 Chrome Extensions Tutorial之后,大概了解他的实现框 ...

  2. 七只熊文库系统,创建自己的百度文库

    CMS开源下载:https://gitee.com/mirweiye/wenkucms 七只熊文库CMS ## 介绍 七只熊是类似百度文库,能够实现文档分享.售卖的文库CMS系统.用户上传源文档后,七 ...

  3. 安利一个小巧的事件提醒Chrome 插件:talking clock

    感觉自己有点网瘾:虽然不打游戏.不追剧,但喜欢用浏览器上网闲逛,有时一逛就是一两个小时,甚至半天,啥事也没干,很苦恼.也想过不少方法,比如定时断网(可行性不强,尤其疫情期间,啥事都网络化了).开热点用 ...

  4. 想创建一个人名百度百科词条,但已经有相同重复的词条怎么办

    不少人想给自己创建百度百科,做一个人物百科词条,但是发现网上已经有很多相同重复的词条了,不知道自己还是否能创建百科,具体得怎么操作,下面洛希爱做百科网为大家讲讲. 首先需要明确2个问题,一是要创建的百 ...

  5. 一、如何创建一个状态栏扩展(火狐插件扩展开发教程)

    因为项目的需要,一些功能需要在火狐上面实现,一点也不了解火狐插件的开发,网上的中文资料也少得可怜, 没办法,只好自己研究一下英文文档,慢慢开发了,在这里备份一下. 学编程,当然是从Hellow,wor ...

  6. 如何创建一个基本JQuery的插件

    如何创建一个基本的插件 有时您希望在整个代码中提供一些功能.例如,也许你想要一个单一的方法,你可以调用一个jQuery选择,对选择执行一系列的操作.在这种情况下,您可能需要编写一个插件. 链接jQue ...

  7. 品牌如何给自己创建一个百度百科词条,在百科上传企业资料方法

    对于企业来说,很多人都想给自己企业或者品牌上传正面简介内容到百度百科平台,但创建一个品牌百度百科词条似乎并不是那么简答,很多自己尝试创建品牌百度百科词条的朋友最终都失败了,下面洛希爱做百科网教教大家如 ...

  8. 如何复制百度文库中的文章

    很多人经常会上百度搜索资料,结果发现在百度文库那边可以找到,兴奋了半天却发现下载时要币的,或者登陆上去麻烦.针对这种情况,今天我给大家带来一个破解百度文库下载的方法,其实非常简单,而且不用下载任何软件 ...

  9. 测试http请求的Chrome插件:Postman插件的查找安装模拟测试 - 讲解篇

    一个测试http请求的Chrome插件:Postman 本文简述一下这个Chrome插件:Postman插件的查找.下载.安装. 这里需要合法的VPN服务商,具体原因你懂的. Chrome资源查找下载 ...

  10. 卖了个 Chrome 插件,赚了几千美金,但是很后悔!

    今天,小编分享一位国外的老哥,花了一个小时,开发的Chrome插件,卖了几千美金,被新雇主拿去做成了"木马",往用户浏览的网页里狂插入 affiliate 链接. 故事是这样开始的 ...

最新文章

  1. 在winform程序里实现最小化隐藏到windows右下角
  2. Lua Behavior Tree For Unity3D(Lua描述行为树For Unity3D)
  3. dns网络服务的搭建和配置
  4. SAP Spartacus 中,Angular <ng-container>使用的一个例子
  5. 烂泥:【解决】word复制windows live writer没有图片
  6. Python Set:一文彻底粉碎集合类型
  7. 培训学web前端前景如何?
  8. Android ViewPropertyAnimator:让动画变得简单起来!
  9. 2级c语言题库及答案,计算机二级C语言上机题库含答案解析
  10. 增强学习 | AlphaGo背后的秘密
  11. linux网页防篡改软件,蓝盾网页防篡改系统
  12. 一文读懂5G专网发展现状与挑战
  13. Android 7 soter,开通微信人脸支付 OPPO Find X 成首发安卓手机
  14. C# winform国际版,中英文转换
  15. 明哥手把手《闲鱼快速入门指南》电子书!!
  16. 【2019.05】腾讯防水墙滑动验证码破解 python + selenium + OpenCV
  17. 不是因为寂寞才想你计算机谱子,不是因为寂寞才想你曲谱
  18. CSS网页布局中易犯的30个小错误
  19. js将秒转为天时分秒格式
  20. 二次型如何快速转化为矩阵?

热门文章

  1. 【干货】最新app源码下载:200款优秀Android项目源码
  2. IDEA与SVN集成
  3. MySQL驱动jar包的下载--保姆教程
  4. c语言 16进制编辑器,十六进制编辑器(010 Editor)
  5. 【Python】使用Labelme标注自己的数据集并由json生成Ground Truth
  6. 【软考系统架构设计师】2010年下系统架构师综合知识历年真题
  7. Python黑帽子--黑客与渗透测试编程之道
  8. AD16操作技巧笔记
  9. java数组大小界限,Java数组索引超出界限
  10. sql server 2008完全卸载工具