事情是这样的呢
创新互联网站建设提供从项目策划、软件开发,软件安全维护、网站优化(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