(2)從零開發 Chrome 插件:實現 API 登錄與本地存儲功能

從零開發 Chrome 插件:實現 API 登錄與本地存儲功能

Chrome 插件作為瀏覽器功能的重要擴展,能極大提升用戶的工作效率。本文將以一個「登錄功能插件」為例,帶你從零構建一個可調用 API 驗證身份、并將用戶信息存儲在本地的 Chrome 插件。

基礎信息請看
Chrome插件開發入門:從零構建你的第一個插件

為什么需要這樣的插件?

在日常開發中,我們經常需要訪問各種需要登錄自有系統或 API,記錄操作以及后續的業務操作需要攜帶token,訪問其他業務系統,是很多工具類插件的基礎功能。

本文將實現的核心功能包括:

  • 一個簡潔的登錄界面(輸入用戶名、密碼)
  • 調用后端登錄 API 驗證身份
  • 將登錄狀態(如 Token、用戶名)安全存儲到本地
  • 處理登錄過程中的各種異常(如網絡錯誤、賬號密碼錯誤)

在這里插入圖片描述

從零構建登錄插件

第一步:搭建目錄結構

一個基礎的登錄插件目錄非常簡潔,包含 4 個核心文件:

login-extension/
├─ manifest.json       // 插件配置(必選)
├─ popup.html          // 登錄界面(點擊插件圖標顯示)
├─ popup.js            // 登錄邏輯(API調用、本地存儲)
└─ style.css           // 美化界面(可選但推薦)

第二步:配置 manifest.json

manifest.json 是插件的「身份證」,用于告訴 Chrome 插件的名稱、版本、權限等信息。以下是適配 Manifest V3 的配置:

{"manifest_version": 3,"name": "簡易登錄助手","version": "1.0.0","description": "通過 API 登錄并安全保存用戶信息","permissions": ["storage"],  // 允許使用本地存儲"action": {"default_popup": "popup.html",  // 點擊插件圖標顯示的頁面"default_icon": "icon.png"      // 插件圖標(可自定義)},"host_permissions": ["https://api.yourdomain.com/*"]  // 允許請求的 API 域名
}

關鍵配置說明

  • permissions: ["storage"]:聲明使用 Chrome 的本地存儲 API(chrome.storage)。
  • host_permissions:指定插件可以訪問的 API 域名,避免跨域問題(開發時可先用 *://*/* 測試,但上線前需改為具體域名)。

第三步:設計登錄界面(popup.html)

登錄界面需要包含用戶名輸入框、密碼輸入框、登錄按鈕和狀態提示區。以下是一個簡潔的實現:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>用戶登錄</title><link rel="stylesheet" href="style.css">
</head>
<body><div class="login-box"><h2>系統登錄</h2><div class="input-group"><label for="username">用戶名</label><input type="text" id="username" placeholder="請輸入用戶名"></div><div class="input-group"><label for="password">密碼</label><input type="password" id="password" placeholder="請輸入密碼"></div><button id="loginBtn">登錄</button><p id="status"></p>  <!-- 顯示登錄狀態(成功/失敗) --></div><script src="popup.js"></script>
</body>
</html>

樣式優化后,界面會更貼近現代 Web 應用的設計風格,輸入框聚焦時的藍色邊框也能給用戶明確的反饋。

第四步:實現登錄邏輯(popup.js)

這是插件的核心,負責讀取用戶輸入、調用 API、處理返回結果并保存數據到本地存儲。

// 等待頁面加載完成
document.addEventListener('DOMContentLoaded', () => {// 獲取頁面元素const usernameInput = document.getElementById('username');const passwordInput = document.getElementById('password');const loginBtn = document.getElementById('loginBtn');const status = document.getElementById('status');// 登錄按鈕點擊事件loginBtn.addEventListener('click', async () => {// 獲取并驗證輸入const username = usernameInput.value.trim();const password = passwordInput.value.trim();if (!username || !password) {showStatus('請輸入用戶名和密碼', 'error');return;}try {// 調用登錄 API(替換為你的實際接口)const response = await fetch('https://api.yourdomain.com/login', {method: 'POST',headers: {'Content-Type': 'application/json',// 如需額外 headers(如 API 密鑰),可在此添加// 'X-API-Key': 'your-api-key'},body: JSON.stringify({ username, password })});const result = await response.json();// 處理 API 返回結果if (response.ok && result.success) {// 登錄成功:保存用戶信息到本地存儲await saveUserInfo(username, result.token);showStatus('登錄成功!', 'success');// 清空輸入框usernameInput.value = '';passwordInput.value = '';} else {// 登錄失敗(如賬號密碼錯誤)showStatus(result.message || '登錄失敗,請檢查賬號密碼', 'error');}} catch (error) {// 捕獲網絡錯誤showStatus('網絡錯誤,請稍后重試', 'error');console.error('登錄請求失敗:', error);}});// 顯示狀態信息的工具函數function showStatus(text, type) {status.textContent = text;status.className = type;}// 保存用戶信息到本地存儲function saveUserInfo(username, token) {return new Promise((resolve) => {chrome.storage.local.set({userInfo: {username: username,token: token,  // 假設 API 返回 TokenloginTime: new Date().toISOString()  // 記錄登錄時間}}, () => {resolve();});});}
});
代碼關鍵點解析:
  1. API 調用:使用 fetch 發送 POST 請求,將用戶名和密碼以 JSON 格式傳遞給后端。實際開發中,需根據后端要求調整請求參數(如是否需要驗證碼、額外的請求頭)。

  2. 本地存儲:通過 Chrome 提供的 chrome.storage.local API 保存用戶信息。與普通 localStorage 相比,它的優勢在于:

    • 不受頁面域名限制(插件內全局可用)
    • 支持異步操作,適合存儲較大數據
    • 配合 storage 權限,安全性更高
  3. 錯誤處理:覆蓋了三種常見場景:輸入為空、API 返回失敗(如密碼錯誤)、網絡異常,確保用戶能明確知道問題所在。

測試插件功能

插件開發完成后,需要在 Chrome 中測試是否能正常工作:

  1. 打開 Chrome 瀏覽器,訪問 chrome://extensions/
  2. 開啟右上角的「開發者模式」
  3. 點擊「加載已解壓的擴展程序」,選擇插件所在的 login-extension 文件夾
  4. 點擊瀏覽器工具欄中的插件圖標,即可看到登錄界面

測試流程建議:

  • 輸入正確的賬號密碼 → 應提示「登錄成功」,并在 chrome://extensions/ 的「檢查視圖」中通過控制臺驗證本地存儲是否有數據(通過 chrome.storage.local.get('userInfo', (data) => console.log(data)) 查看)

總結

通過本文的示例,掌握了 Chrome 插件調用 API 實現登錄并存儲用戶信息的核心流程。這個基礎框架可以擴展出更多功能,例如:自動攜帶 Token 調用其他 API、定期檢查登錄狀態、多賬號管理等。

Chrome 插件開發的核心是理解其配置規則和 API 特性,結合前端基礎知識,就能快速實現各種實用工具。希望本文能幫助你邁出插件開發的第一步!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88821.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flink時間窗口詳解

一、引言在大數據流處理的領域中&#xff0c;Flink 的時間窗口是一項極為關鍵的技術&#xff0c;想象一下&#xff0c;你要統計一個電商網站每小時的訂單數量。由于訂單數據是持續不斷產生的&#xff0c;這就形成了一個無界數據流。如果沒有時間窗口的概念&#xff0c;你就需要…

寬帶接入,網線插入電腦的經驗

現在一般家里安裝移動寬帶&#xff0c;都會提供四個千兆接口的光貓路由器&#xff0c;但是要注意了 首先網線的兩端看起來一樣&#xff0c;實際上并不是&#xff0c;如果發現連接不成功&#xff0c;那么就要換一頭重新嘗試&#xff0c; 一般像說什么自動DHCP啊&#xff0c;因為…

crmeb多門店對接拉卡拉支付小程序聚合收銀臺集成全流程詳解

一、商戶注冊與配置??注冊支付平臺賬號??&#xff1a;在拉卡拉開放平臺注冊商戶賬號&#xff08;私信聯系注冊&#xff09;??創建應用??&#xff1a;獲取小程序應用ID(AppID)??配置支付參數??&#xff1a;商戶號(MID)終端號(TID)API密鑰支付回調地址二、配置拉卡拉…

C#將樹圖節點展示到NetronLight圖表中

之前寫過NetronLight開源框架 C#使用開源框架NetronLight繪制流程圖-CSDN博客 我們這里將TreeView樹圖的節點內容展示到NetronLight圖表中&#xff0c;按照樹的層次【深度Level】展示 新建窗體應用程序ShowTreeNodeToDiagram&#xff0c;將默認的Form1重命名為FormShowNode&…

精密模具大深徑比微孔尺寸檢測方案 —— 激光頻率梳 3D 輪廓檢測

引言精密模具中大深徑比微孔&#xff08;深徑比&#xff1e;20:1&#xff0c;孔徑&#xff1c;1mm&#xff09;的尺寸精度直接影響注塑件、電子元件等產品的成型質量。此類微孔具有孔徑小、深度大、表面質量要求高&#xff08;Ra≤0.1μm&#xff09;等特點&#xff0c;傳統檢測…

defer學習指南

一、源頭&#xff1a;早期管理資源&#xff08;如數據庫連接、鎖、文件句柄、網絡連接&#xff09;和狀態清理異常麻煩。 必須在每個可能的返回點&#xff08;return、err、panic&#xff09;手動重復清理代碼&#xff0c;極易遺漏且打斷主要邏輯思路&#xff01;像Java語言雖然…

NLP_知識圖譜_大模型——個人學習記錄

1. 自然語言處理、知識圖譜、對話系統三大技術研究與應用 https://github.com/lihanghang/NLP-Knowledge-Graph 深度學習-自然語言處理(NLP)-知識圖譜&#xff1a;知識圖譜構建流程【本體構建、知識抽取&#xff08;實體抽取、 關系抽取、屬性抽取&#xff09;、知識表示、知…

linux:進程詳解(1)

目錄 ?編輯 1.進程基本概念與基本操作 1.1 概念 1.2 描述進程-PCB 1.2.1PCB的基本概念 1.2.2 task_ struct 1.2.3 查看進程 2.進程狀態 2.1 Linux內核源碼展示 2.2 進程狀態查看 ?編輯 2.3 Z(zombie)-僵?進程 2.4 僵尸進程的危害 2.5 孤兒進程 3.進程優先級 …

碳中和目標下的全球產業鏈重構:深度解析與未來路徑

引言&#xff1a;氣候臨界點與產業鏈的系統性風險2023年&#xff0c;全球平均氣溫較工業化前上升1.2℃&#xff0c;南極冰蓋年消融量達1500億噸&#xff0c;極端天氣事件導致的經濟損失占全球GDP的2.3%。這一系列數據背后&#xff0c;暴露出傳統產業鏈的致命缺陷——其設計邏輯…

FPGA實現SDI轉LVDS視頻發送,基于GTX+OSERDES2原語架構,提供2套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目本博已有的 SDI 編解碼方案FPGA實現LVDS視頻收發方案 3、工程詳細設計方案工程設計原理框圖SDI 輸入設備Gv8601a 均衡器GTX 解串SMPTE SD/HD/3G SDI IP核BT1120轉RGB奇…

新手向:使用Python構建高效的日志處理系統

本文將詳細講解如何使用Python開發一個專業的日志分析工具&#xff0c;能夠自動化處理、分析和可視化各類日志文件&#xff0c;大幅提升運維效率。環境準備開發本工具需要以下環境配置&#xff1a;Python環境&#xff1a;建議Python 3.8或更高版本必要庫&#xff1a;pandas&…

大模型-量化技術

簡介 模型量化是一種重要的模型壓縮技術。其核心目標是在可控精度損失下&#xff0c;將大模型中浮點型權重&#xff08;通常為 float32 等高精度格式&#xff09;近似轉換為低精度離散值表示&#xff08;通常為 int8&#xff09;。 具體而言&#xff0c;該技術通過將模型的權重…

【C語言網絡編程】HTTP 客戶端請求(域名解析過程)

在做 C 語言網絡編程或模擬 HTTP 客戶端時&#xff0c;第一步就離不開“把域名解析為 IP 地址”這一步。很多人可能直接復制粘貼一段 gethostbyname 的代碼&#xff0c;但未必真正理解它的原理。 本篇博客將圍繞一個經典函數&#xff1a; char *host_to_ip(const char *hostna…

Node.js特訓專欄-實戰進階:16. RBAC權限模型設計

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從RBAC權限模型的基礎概念、核心組件講起,詳細闡述其設計原則、數據庫模型設計,還會結合代碼示例展示在…

mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

問題背景與挑戰 在構建高性能RPC框架BRPC時&#xff0c;?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點&#xff1a; ?路徑搜索不精確?&#xff1a;默認find_library無法定位自定義安裝路徑下的Protobuf?版本兼容…

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中&#xff0c;性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏&#xff0c;還是 goroutine 失控&#xff0c;都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具&#xff0c;就像一把精準的手術刀&#xff0c;能…

fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題解決

針對您使用fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題&#xff0c;結合SSD特性和fio測試原理 fio測試SSD直接I/O&#xff08;Direct IO&#xff09;性能僅有100MB/s的問題 - LinuxGuideLinuxGuide 以下是可能的原因及優化方案&#xff1a; &a…

EVO-0:具有隱空間理解的視覺-語言-動作模型

25年6月來自上海交大、EvoMind Tech 和上海算法創新研究院&#xff08;IAAR-Shanghai&#xff09;的論文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 視覺-語言-動作 (VLA) 模型已成為一種有前途的框架&#xff0c;可使通用機器人能夠在現…

文心大模型4.5開源測評:輕量化部署實踐與多維度能力驗證

前言&#xff1a;開源浪潮下的輕量化革命 2025年百度文心大模型4.5系列的開源&#xff0c;標志著國產大模型從“參數競賽”轉向“實用落地”的關鍵轉折。當行業仍在追逐千億參數模型時&#xff0c;文心4.5以0.3B輕量級模型撕開一條新賽道——單卡部署、低成本運維、中文場景高…

LeetCode 2401.最長優雅子數組

給你一個由 正 整數組成的數組 nums 。 如果 nums 的子數組中位于 不同 位置的每對元素按位 與&#xff08;AND&#xff09;運算的結果等于 0 &#xff0c;則稱該子數組為 優雅 子數組。 返回 最長 的優雅子數組的長度。 子數組 是數組中的一個 連續 部分。 注意&#xff1a;長…