事情是这样的呢

创新互联网站建设提供从项目策划、软件开发,软件安全维护、网站优化(SEO)、网站分析、效果评估等整套的建站服务,主营业务为成都网站制作、成都网站建设、外贸营销网站建设,成都app软件开发公司以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。创新互联深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
友人 A: 能不能帮我整一个 chrome 插件?
我: 啥插件?
友人 A: 通过后端服务或者 python 脚本通信 chrome 插件能够操作浏览器
我: 你小子是想爬数据吧?直接用现成的 python 框架或者 谷歌的 puppeteer 就能操控浏览器吧
友人 A: 你说的路子我早就试过了,对于反爬检测高的网站一下就能检测你的无头浏览器的相应特征,所以就用平时用的浏览器就能以真乱真
我: 老是整这些花里胡哨的,有啥用呀
友人 A: 10 斤小龙虾!
我:成交!!!
根据朋友以上的要求,我们可以简单的得出一下的通信流程:
具体有疑问没关系,我们只要知道大体的流程是这样通信的即可
github 地址 每个 commit 对应相应的步骤
我们首先来创建一个啥功能都没有的 chrome 插件
目录如下所示
manifest.json
- // manifest.json
 - {
 - "manifest_version": 2, // 配置文件的版本
 - "name": "SocketEXController", // 插件的名称
 - "version": "1.0.0", // 插件的版本
 - "description": "Chrome SocketEXController",// 插件描述
 - "author": "wjryours", // 作者
 - "icons": {
 - "48": "icon.png",// 对应尺寸的图标路径 我这边全部用一个了
 - "128": "icon.png"
 - },
 - "browser_action": {
 - "default_icon": "icon.png", // 图标
 - "default_popup": "popup.html" // 点击右上角的图标的 popup 浮层 html 文件
 - },
 - "background": {
 - // 会一直常驻的后台 JS 或后台页面
 - // 2 种指定方式,如果指定 JS,那么会自动生成一个背景页
 - "page": "background.html"
 - },
 - "content_scripts": [
 - {
 - // 允许哪些域名下加载 注入的 JS
 - // "matches": ["http://*/*", "https://*/*"],
 - // "
 " 表示匹配所有地址 - "matches": [
 - "
 " - ],
 - "js": [
 - "content-script.js"
 - ],
 - "run_at": "document_start"
 - }
 - ],
 - "permissions": [
 - "contextMenus", // 右键菜单
 - "tabs", // 标签
 - "notifications", // 通知
 - "webRequest", // web 请求
 - "webRequestBlocking", // 阻塞式 web 请求
 - "storage", // 插件本地存储
 - "http://*/*", // 可以通过 executeScript 或者 insertCSS 访问的网站
 - "https://*/*" // 可以通过 executeScript 或者 insertCSS 访问的网站
 - ],
 - }
 
js
- // background.js
 - console.log('background.js')
 
- // popup.js
 - console.log('popup.js')
 
- // content-script.js
 - console.log('content-script.js loaded')
 
html
SocketController Popup - popup
 
SocketController - bg-container
 
然后在 chrome 的扩展程序页加载我们的文件目录 即可
然后我们启用插件 随手打开一个页面就发现我们的插件已经生效了
正如上面的通信流程所示,我们还需要在本地创建一个可用的 websocket 来发送信息给 chrome 插件
为了方便起见,我这边就用 node 的 express 以及 socket.io 这个库来启用
目录结构和代码都很简单
- // index.js 用来创建 node 服务
 - const express = require('express')
 - const app = express()
 - const http = require('http')
 - const server = http.createServer(app)
 - const { Server } = require("socket.io")
 - const io = new Server(server)
 - app.get('/', (req, res) => {
 - res.sendFile(__dirname + '/index.html')
 - })
 - io.on('connection', (socket) => {
 - console.log('a user connected')
 - socket.on('disconnect', () => {
 - console.log('user disconnected');
 - });
 - socket.on('webviewEvent', (msg) => {
 - console.log('webviewEvent: ' + msg);
 - io.emit('webviewEvent', msg);
 - // socket.broadcast.emit('chat message', msg);
 - });
 - socket.on('webviewEventCallback', (msg) => {
 - console.log('webviewEventCallback: ' + msg);
 - io.emit('webviewEventCallback', msg);
 - });
 - })
 - server.listen(9527, () => {
 - console.log('listening on 9527')
 - })
 
Socket.IO Page