➜ Old React website
Chung Cheuk Hang MichaelJava Web Developer
在 Java 項目中使用 Lombok網頁抓取(二) - Selenium/Selenide

寫第一個 Chrome Extension

Table of contents

1 關於 Chrome Extension

相信大家對 Chrome extension 都唔陌生,因為大部分人都係 ad blocker plugins 既 user,知道瀏覽器係可以安裝一啲小插件黎優化用戶體驗(UX)。
其實呢啲小插件係可以自己寫,而且非常簡單。

2 需求情境

呢篇文章會教大家動手寫一個 Chrome extension,用黎去除 uTorrent Web 網頁各種各樣既多餘網頁 components,令到版面更簡潔。
uTorrent Web 係一個專門用黎 BT 下載既電腦程式,需要自行下載安裝,佢個程式介面係用網頁既形式呈現,所以叫 uTorrent Web,有別於以前既 uTorrent(PC 客戶端)。

3 比較原貌及結果

先畀大家睇下我地既 before & after 會相差幾遠。

3.1 Before

3.2 After

4 動手寫

4.1 Project structure

我地呢個 project folder 會有以下檔案:
檔案用途
manifest.json關於呢個 Chrome extension 既 metadata。Chrome 會讀取,咁就知道邊啲網頁要用呢個 extension,邊啲唔洗,同埋知道需要執行既 JavaScript 資源既位置
content.js我地既程式入口,類似 Java 既 main method,喺 Chrome load 完 dependency 既 libraries(即係我地既 jquery.js)之後就會執行
js/jquery.jsjQuery 係一個打橫行既 JavaScript library,可以肆意修改整個 DOM tree,係傳統網頁必備既 library

4.2 寫 manifest.json

manifest.json 負責話畀 Chrome 知道我地呢個 extension 既全名、簡單描述、URL 匹配同權限,以及要執行既 JavaScript 檔案。
因為 uTorrent Web 既 URL 有時會係 utweb.trontv.com 有時會係 127.0.0.1,所以就有兩個,但一般都只係得一個。
至於 js,次序一定要岩,dependency libraries 行先,之後先到我地寫既入口主程式(類似 Java 既 main method)。
1{ 2 "name": "uTorrent Web Plugin", 3 "version": "1.0", 4 "description": "Remove ads", 5 "content_scripts": [ 6 { 7 "matches": ["*://utweb.trontv.com/*", "*://127.0.0.1/*"], 8 "js": ["js/jquery.js", "content.js"], 9 "run_at": "document_start" 10 } 11 ], 12 "manifest_version": 2 13}

4.3 寫 content.js

我地想要一個簡潔版本既 uTorrent Web,其實只需要不斷將多餘既 components 刪除就可以。
Windows 下撳 F12 或者 macOS 下撳 Option + Command + I,然後喺 Chrome developer tools 既 Elements tab 下撳左上角既箭嘴掣,手動黎喺頁面上視覺定位不同既多餘 DOM nodes,Chrome developer tools 會幫我地定位 DOM node 既位置,然後我地可以自行判決點樣 programmatically 定位呢啲 DOM nodes。
我地會想寫到呢個 Chrome extension 可以無限 loop 咁行,因為有時啲網頁完成加載既時間可能好長,有啲 components 亦可能係之後先加入,亦可能因為某啲操作(當我地新增 BT 下載任務既時候)而令頁面再次改變,所以係有必要無限 loop。
多餘既 DOM node(CSS selector)對應頁面位置
.nav-tabs > :not([id=auto-settings-btn])頂部右方設定掣左邊既兩個掣,分別係 Safe Torrrent Scanner 及 Help
footer[id=ads-privacy-footer]最底既 Terms of Service、Privacy Policy 及 copyright
[id=sidebar]左手邊既 sidebar menu
div.tutorial-video-container正右方既 Watch this video on torrenting 連影片
div.media-cover當有下載任務時,下載任務左手邊有個影片播放器
div.search-control-nav-main正中既 Search for a torrent 搜尋列
[id=jw-player-container]正下方既影片
.search-header正中既 Stream torrents while you download
1// 無限 loop 既配置,一開始會行得密啲,之後就會放慢 2const MAX_RUN = Infinity; 3const DELAY_INCREMENT = 25; 4const DELAY_MAX = 1000; 5var delay = 25; 6 7// 用於 jQuery 既 CSS selector,喺 Chrome developer tools 既 Elements tab 可以用佢黎 search 8const SELECTOR = ` 9 .nav-tabs > :not([id=auto-settings-btn]), 10 footer[id=ads-privacy-footer], 11 [id=sidebar], 12 div.tutorial-video-container, 13 div.media-cover, 14 div.search-control-nav-main, 15 [id=jw-player-container], 16 .search-header 17`; 18 19const run = () => { 20 let i = 0; 21 22 const _run = () => { 23 if (i === MAX_RUN) { 24 return; 25 } 26 27 i++; 28 console.log("Running iteration " + i); // 喺 Chrome developer tools 既 Console 會見到 29 30 const result = $(SELECTOR); 31 32 if (!(result.length > 0)) { 33 // 如果未搵到(可能係頁面未 load 好) 34 setTimeout(_run, delay); 35 delay = Math.min(delay + DELAY_INCREMENT, DELAY_MAX); 36 return; 37 } 38 39 // 將多餘野設置為唔顯示 40 41 result.css("display", "none"); 42 43 $(".media-library-top-container.show-ad").removeClass("show-ad"); 44 45 setTimeout(_run, delay); 46 delay = Math.min(delay + DELAY_INCREMENT, DELAY_MAX); 47 }; 48 49 _run(); 50}; 51 52run(); // call 上面 define 既 run function

4.4 下載 jquery.js

正因為 jQuery 太強大,可以肆意修改整個 DOM tree,所以佢係傳統網頁必備既 dependency library(但新派做法已經棄用 jQuery)。正正就係我地刪除多餘 DOM nodes 需要用到。
我地需要將呢個 jQuery library 既 code 下載落黎。只需要 right click 下面條 link,save as js/jquery.js 即可:

5 安裝

chrome://extensions 度,打開右上角 Developer mode 既開關,撳 Load unpacked,然後揀我地個 project folder。
之後我地會見到多左個我地個 Chrome extension(請確保開關掣係開住)。呢個時候我地可以 refresh 一下 uTorrent Web 個網頁,就會見到係極致地簡潔!