一 需求

由于很喜欢看漫画,很多学习版的漫画(大家懂的)分布在各个平台。来回切换太费劲了,就想着用一个后台记录所有追的连载漫画。

记录后台+站点不必多说。提供添加漫画链接功能即可。但每次都要找到对应漫画,再后再获取指定信息,例如:封面,链接,名称。在手动切换管理系统逐条添加,过于繁琐。(主要是懒)

二 功能分解

2.1 管理站点

一般的BS项目,管理漫画链接的信息即可。信息包括:封面,链接,名称。

利用之前制作的代码生成工具,很简单完成。不再过多描述。如图:

2.2 浏览器插件

在浏览漫画的时候遇到喜欢的,鼠标右键直接添加到自己的管理系统。

1) 鼠标右键菜单添加一个快捷功能

2)此功能收集漫画的封面,链接,名称信息。然后提交给管理站点的API进行保存。

3)在管理站点显示页面显示。

主要针对Chrome浏览器(别的浏览器很少用,以后再说)

三 技术实现

查询了大量资料发现chrome的插件,就是一个配置文件和如果html以及js即可。简单方便,就他了。

第一版简单一点,login.html back.html留着以后扩展功能的时候用。

编辑

js文件夹里的脚本文件才是主角

编辑

3.1 manifest.json

此配置文件相当于插件的配置。如图:

{"manifest_version": 2,"name": "daily_site","version": "1.0.0","description": "漫画url记录","background":{"scripts": ["js/jquery.js","js/background.js"]},"browser_action": {"default_icon": "img/icon.png","default_popup": "login.html"},"content_scripts": [{"matches": ["http://152.136.254.108/*","https://www.g-lens.com/*","https://www.1kkk.com/*"],"js":["js/jquery.js","js/myscript.js"]}],"permissions": ["contextMenus","webRequest","tabs","*://*/*","http://*/*","https://*/*"]
}

配置项说明,网上可以查到。

就说遇到的问题让人印象深刻的吧。

background 配置,里面的js脚本,会在插件加载完成后一直运行。就像名字一样是背景程序。

content_scripts 是页面程序,插件加载后插入到页面的脚本。

matches 是配置指定的站点,才会起作用,如果任何站点都会执行插件,也可能对用户造成困扰。

run_at 是运行的时机,或者是说浏览器在某个特特定过程才会执行此脚本。

permission 是插件所需的权限。需要啥权限添加啥权限,具体内容百度吧。

3.2 content_script

content_script是会注入到Web页面的JS文件,可以是多个,也可以对注入条件进行设置,也就是满足什么条件,才会将这些js文件注入到当前web页面中。

可以把这些注入的js 文件和网页的个文件看成一个整体,相当于在你网页中,写入了这些js 代码。这样就可以对原来的web页面进行操作了。

例如myscript.js 如图:

function getGo(){var arr = [];var title = $("p.j-comic-title").html();var img = $("img.lazy").attr("src");arr.push(document.location.href);arr.push(title);arr.push(img);  return arr;
}
function get1kkk(){var arr = [];var title = $("div.banner_detail_form div.info p.title").contents().filter(function (index, content) {return content.nodeType === 3;}).text();var img = $("div.banner_detail_form div.cover img").attr("src");arr.push(document.location.href);arr.push(title);arr.push(img);  return arr;
}
function importManhuaSite(){var arr = [];var currentURL=document.location.href;if(currentURL.indexOf("https://www.g-lens.com/")==0){arr = getGo();}else if(currentURL.indexOf("https://www.1kkk.com/")==0){arr = get1kkk();}console.log(arr);if(arr!=null && arr[0]!="" && arr[1]!="" && arr[2]!=""){chrome.runtime.sendMessage({url: arr[0],title:arr[1],ico:arr[2]}, res => {// 答复console.log(request.info)})}
}
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if(request=="getdata"){importManhuaSite(); }//console.log(request.info)// 这里是返回给bg的内容//sendResponse('get the message')
})

getGo(),get1kkk()解析漫画网站页面,提取漫画封面,名称,链接的过程,没啥好说的。

chrome.runtime.onMessage.addListener 注册一个监听。这个监听就主要了,这是背景程序background.js发送消息给content_scripts时候所需要的。这是关键,两个脚本指教的通讯需要靠这种方式,请做笔记(反正我做了)。

importManhuaSite() 调用2个解析过程,完成提取之后,需要把提取内容发送给background.js进而提交给站点进行保存。其中包含chrome.runtime.sendMessage 是Content_script发送消息给background的过程,也要做笔记。

3.3 background

即插件运行的环境。可以是html+js, 也可以是单纯的js。插件启动后就常驻后台,只有一个。这类脚本是运行在浏览器后台的,注意它是与当前浏览页面无关的。例如:background.js

function importMyManhua(info, tab) {chrome.tabs.sendMessage(tab.id, "getdata", res => {console.log('bg=>content')console.log(res)})
}
chrome.contextMenus.create({"title": "收藏到我的漫画站点","contexts":["page"],"onclick":importMyManhua});
chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {const url = req.url;const title = req.title;const ico = req.ico;//console.log(res)$.ajax({url: "https://localhost:44335/API/manhua.ashx",type: "GET",data: {act:'Insert',addby:1,url: url,name: title,ico: ico},dataType: 'json',success: function (data) {if(data!=null && data!=undefined){sendResponse(data);}}});
})

chrome.contextMenus.create 是添加鼠标右键菜单的功能。固定写法。点击事件绑定的是importMyManhua

importMyManhua 给content_Script发送一个消息,消息内容为getdata。

chrome.runtime.onMessage.addListener 是background注册的监听事件。主要是为了接受content_script发过来的信息,也就是前段提取的漫画名称,封面, 链接信息。然后ajax提交给站点进行保存到数据库。

3.4 popup

在用户点击扩展程序图标时(下图中的下载图标),都可以设置弹出一个popup页面。而这个页面中自然是可以包含运行的js脚本的(比如就叫popup.js)。它会在每次点击插件图标——popup页面弹出时,重新载入。

没用到,但学学也无妨。

四 遇到问题

1) 执行Jquery

【解决】在配置manifest.json的时候,content_scripts节点配置对应的js脚本的时候,需要加入jquery.js的引用。

background节点配置也是一样。如图:

2)调用方式

开始的时候本以为可以在content_scripts中完成所有的事情,实际开发过程中发现各种问题。如下:

1)content_scripts中无法执行ajax。

2) content_scripts 也无法只用chrome.contextMenus.create 必须在background中执行。

3) background中无法获取页面dom。

本打算对付过去,看来不行了,只能看具体的实现机制了。

鉴于各种限制,只能是由content_script完成页面dom获取,background完成数据提交到后台网站。下面是background,content_script,popup之间的逻辑关系。任何两者之间通讯都是采用sendmessage和Listener方式。代码里有例子。

下图为content_script background popup关系示意图。

3)部分网站可用

未解决

五 参考资料

Chrome浏览器插件(扩展)开发全攻略

Chrome插件中 popup,background,contantscript消息传递机制

chrome插件开--开发心得相关推荐

  1. chrome插件开发之:一键购物助手功能开发总结

    从10.1开始有开发自动购物这个想法,一直到今天,就是10.9,总算把这个功能给完美整出来了. 回顾这9天的开发路程,确实不是很好走.发现了很多问题,也解决了很多问题.现在分享一下开发的经验. 开发经 ...

  2. 谷歌浏览器Chrome插件扩展开发教程

    下文是我看到的一篇很好的Chrome扩展开发攻略,感觉很有价值,内容详尽,排版精美,遂转载. 原文由小茗同学发表于小茗同学的博客园:[干货]Chrome插件(扩展)开发全攻略 1. 写在前面 我花了将 ...

  3. 【干货】Chrome插件(扩展)开发全攻略-转载

    [干货]Chrome插件(扩展)开发全攻略 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这 ...

  4. 新手入门Chrome插件(扩展)开发全攻略

    [干货]Chrome插件(扩展)开发全攻略 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这 ...

  5. 【转】Chrome插件(扩展)开发全攻略

    [干货]Chrome插件(扩展)开发全攻略 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这 ...

  6. 【干货】Chrome插件(扩展)开发全攻略(转载)

    转载来源:https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html [干货]Chrome插件(扩展)开发全攻略 写在前面 我花了将近 ...

  7. 最实用的chrome插件——CSDN开发助手

    最实用的chrome插件--CSDN开发助手 CSDN开发助手 缺点及建议 亮点 总结 CSDN开发助手 号称最实用的chrome插件--CSDN开发者助手,今天让我们来看看是否名副其实!我这人就喜欢 ...

  8. 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)转

    [干货]Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔) 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所 ...

  9. Chrome插件(扩展)开发全攻略(干货)

    转载自:https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html 写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下 ...

最新文章

  1. IE相关的一些BUG汇总
  2. Python学习笔记(随笔)
  3. 笑傲江湖ol更新服务器正在维护,笑傲江湖ol4月22日更新内容 调整死亡复活设置...
  4. -bash: fg: no job control -bash: /usr/java/jdk1.8.0_221-amd64/jre/bin: Is a directory
  5. iOS开发UI基础—手写控件,frame,center和bounds属性
  6. unity Android 指南针,Unity之一天一个技术点(十二)---指南针的实现
  7. 树莓派AI视觉云台——7、树莓派系统备份
  8. UIAlertView UIActionSheet随笔笔记
  9. opencv:畸变矫正:透视变换算法的思想与实现
  10. 2021新茶饮研究报告
  11. 游戏引擎中的通用编程技术
  12. operator() error
  13. java 获取xml 版本号_java解析xml获取对应值
  14. GLIBCXX_3.4.21 not found(转载)
  15. 【搞船日记】【Shapr3D的STL格式转Gcode】
  16. 深信服AC1100上网行为管理
  17. 什么是项目沟通管理?
  18. Openstack 经典面试问题和解答
  19. 2020年的云计算概念和趋势
  20. plot画图颜色设置

热门文章

  1. 计算机相关的开发岗位
  2. 微信小程序-模板的定义和使用
  3. js .style javaScript控制css属性
  4. 2019寒假作业2 编辑总结
  5. replace()和re.s()用法
  6. Escape character is ‘^]’什么意思?怎么使用telnet
  7. Ural1136-Parliament
  8. Python判断能否组成三角形
  9. 那些年,关于 Java 的那些事儿
  10. 一名米粉述说:当年雷军是如何带领小米发展的