日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
15分鐘手摸手教你寫個可以操控Chrome的插件

故事背景

事情是這樣的呢

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評估等整套的建站服務(wù),主營業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè),成都app軟件開發(fā)公司以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。創(chuàng)新互聯(lián)深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

友人 A: 能不能幫我整一個 chrome 插件?

我: 啥插件?

友人 A: 通過后端服務(wù)或者 python 腳本通信 chrome 插件能夠操作瀏覽器

我: 你小子是想爬數(shù)據(jù)吧?直接用現(xiàn)成的 python 框架或者 谷歌的 puppeteer 就能操控瀏覽器吧

友人 A: 你說的路子我早就試過了,對于反爬檢測高的網(wǎng)站一下就能檢測你的無頭瀏覽器的相應(yīng)特征,所以就用平時用的瀏覽器就能以真亂真

我: 老是整這些花里胡哨的,有啥用呀

友人 A: 10 斤小龍蝦!

我:成交!!!

整體的思路

根據(jù)朋友以上的要求,我們可以簡單的得出一下的通信流程:

具體有疑問沒關(guān)系,我們只要知道大體的流程是這樣通信的即可

github 地址 每個 commit 對應(yīng)相應(yīng)的步驟

第一步 創(chuàng)建一個 chrome 插件

我們首先來創(chuàng)建一個啥功能都沒有的 chrome 插件

目錄如下所示

manifest.json

 
 
 
 
  1. // manifest.json 
  2.     "manifest_version": 2, // 配置文件的版本 
  3.     "name": "SocketEXController", // 插件的名稱 
  4.     "version": "1.0.0", // 插件的版本 
  5.     "description": "Chrome SocketEXController",// 插件描述 
  6.     "author": "wjryours", // 作者 
  7.     "icons": { 
  8.         "48": "icon.png",// 對應(yīng)尺寸的圖標(biāo)路徑 我這邊全部用一個了 
  9.         "128": "icon.png" 
  10.     }, 
  11.     "browser_action": { 
  12.         "default_icon": "icon.png", // 圖標(biāo) 
  13.         "default_popup": "popup.html" // 點(diǎn)擊右上角的圖標(biāo)的 popup 浮層 html 文件 
  14.     }, 
  15.     "background": { 
  16.         // 會一直常駐的后臺 JS 或后臺頁面 
  17.         // 2 種指定方式,如果指定 JS,那么會自動生成一個背景頁 
  18.         "page": "background.html" 
  19.     }, 
  20.     "content_scripts": [ 
  21.         { 
  22.             // 允許哪些域名下加載 注入的 JS 
  23.             // "matches": ["http://*/*", "https://*/*"], 
  24.             // "" 表示匹配所有地址 
  25.             "matches": [ 
  26.                 "
  27.             ], 
  28.             "js": [ 
  29.                 "content-script.js" 
  30.             ], 
  31.             "run_at": "document_start" 
  32.         } 
  33.     ], 
  34.     "permissions": [ 
  35.         "contextMenus", // 右鍵菜單 
  36.         "tabs", // 標(biāo)簽 
  37.         "notifications", // 通知 
  38.         "webRequest", // web 請求 
  39.         "webRequestBlocking", // 阻塞式 web 請求 
  40.         "storage", // 插件本地存儲 
  41.         "http://*/*", // 可以通過 executeScript 或者 insertCSS 訪問的網(wǎng)站 
  42.         "https://*/*" // 可以通過 executeScript 或者 insertCSS 訪問的網(wǎng)站 
  43.     ], 

js

 
 
 
 
  1. // background.js 
  2. console.log('background.js') 
 
 
 
 
  1. // popup.js 
  2. console.log('popup.js') 
 
 
 
 
  1. // content-script.js 
  2. console.log('content-script.js loaded') 

html

 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.      
  6.      
  7.      
  8.     SocketController Popup 
  9.      
  10.      
  11.  
  12.  
  13.     popup 
  14.  
  15.  
 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.      
  7.      
  8.      
  9.     SocketController 
  10.  
  11.  
  12.  
  13.      
  14.         bg-container 
  15.     
 
  •  
  •  
  •  
  • 然后在 chrome 的擴(kuò)展程序頁加載我們的文件目錄 即可

    然后我們啟用插件 隨手打開一個頁面就發(fā)現(xiàn)我們的插件已經(jīng)生效了

    第二步 在本地創(chuàng)建 websocket 的服務(wù)

    正如上面的通信流程所示,我們還需要在本地創(chuàng)建一個可用的 websocket 來發(fā)送信息給 chrome 插件

    為了方便起見,我這邊就用 node 的 express 以及 socket.io 這個庫來啟用

    目錄結(jié)構(gòu)和代碼都很簡單

     
     
     
     
    1. // index.js  用來創(chuàng)建 node 服務(wù) 
    2. const express = require('express') 
    3. const app = express() 
    4. const http = require('http') 
    5. const server = http.createServer(app) 
    6. const { Server } = require("socket.io") 
    7. const io = new Server(server) 
    8.  
    9. app.get('/', (req, res) => { 
    10.     res.sendFile(__dirname + '/index.html') 
    11. }) 
    12.  
    13. io.on('connection', (socket) => { 
    14.     console.log('a user connected') 
    15.     socket.on('disconnect', () => { 
    16.         console.log('user disconnected'); 
    17.     }); 
    18.     socket.on('webviewEvent', (msg) => { 
    19.         console.log('webviewEvent: ' + msg); 
    20.         io.emit('webviewEvent', msg); 
    21.         // socket.broadcast.emit('chat message', msg); 
    22.     }); 
    23.     socket.on('webviewEventCallback', (msg) => { 
    24.         console.log('webviewEventCallback: ' + msg); 
    25.         io.emit('webviewEventCallback', msg); 
    26.     }); 
    27. }) 
    28.  
    29.  
    30. server.listen(9527, () => { 
    31.     console.log('listening on 9527') 
    32. }) 
     
     
     
     
    1.   
    2.  
    3.  
    4.  
    5.  
    6.  
    7.   Socket.IO Page 
    8.