優化陽明交通大學 E3 學習平台的使用體驗。
Chrome 線上應用程式商店: https://chromewebstore.google.com/detail/nycu-e3-helper/cmagonljljocpkfojkabhiedjafamoef
- 浮動按鈕:任何網頁都能快速開啟側邊欄
- 響應式設計:美觀的漸層介面,支援滑動展開/收合
- 多分頁切換:作業、公告、成績一目了然
- 跨網頁使用:不限於 E3 網站,任何網頁都能使用
- 即時倒數:顯示作業截止時間倒數(天/小時/分鐘)
- 狀態標記:手動標記作業為「已繳交」或「待處理」
- 視覺化提示:
- 🔴 已逾期(紅色)
- 🟡 即將到期(黃色,3 天內)
- 🟢 充裕時間(綠色)
- 快速連結:點擊作業直接進入繳交頁面
- 課程顯示:自動顯示作業所屬課程名稱
- 自動保留:已標記為「已繳交」的作業不會被自動刪除
- 公告聚合:整合所有課程的最新公告
- 信件整合:支援 dcpcmail 系統的課程信件
- 統一介面:公告與信件合併顯示,方便管理
- 篩選功能:
- 按類型:全部/公告/信件
- 按狀態:全部/未讀/已讀
- 詳細預覽:點擊查看完整內容,保留所有連結和附件
- 已讀追蹤:自動記錄已讀狀態,未讀項目顯示紅點標記
- 新分頁開啟:預覽中的連結自動在新分頁開啟
- 跨網站載入:在任何網站都能載入公告與信件(自動在背景連接 E3)
- 快速查詢:一鍵查看所有課程成績
- 詳細資訊:
- 作業成績與比重
- 考試成績與比重
- 總成績計算
- 視覺化呈現:清楚的分數顯示與百分比
- 即時更新:支援手動重新載入
- 批次下載:一鍵下載課程所有檔案
- ZIP 打包:自動打包成 ZIP 檔案
- 自動命名:檔案名稱包含課程名稱
- 進度提示:下載過程中顯示進度
- 背景同步:每小時自動同步一次
- 手動同步:點擊按鈕立即同步
- 同步內容:
- 作業列表與截止時間
- 課程列表
- 公告與信件(手動)
- 同步狀態:顯示最後同步時間
- 登入檢查:自動檢測登入狀態
- 錯誤處理:網路錯誤時友好提示
- 快速按鈕:在 E3 頁面的作業旁新增「📝 前往作業」按鈕
- 直接進入:點擊直接進入作業繳交頁面,跳過日曆頁面
- 支援位置:
- ✅ 首頁時間軸
- ✅ 日曆頁面
- ✅ 通知中心
- ✅ 課程總覽
- 動態監聽:自動偵測新增的作業元素
- 浮動按鈕徽章:右側浮動按鈕顯示未讀通知數量(紅色徽章)
- 擴充功能徽章:瀏覽器工具列圖示顯示未讀通知總數
- 24小時緊急通知:24小時內到期的作業自動發送通知
- 作業評分通知:自動偵測作業是否已評分,第一次評分時立即通知
- 新公告通知:公告同步時自動比對,有新公告立即發送桌面通知
- 多來源整合:
- 作業通知
- 作業評分通知
- 新公告通知
- 參與者變動通知
- 緊急作業提醒
- 實時更新:通知數量即時同步
- AI 翻譯:使用 Gemini 2.5 Flash-Lite 或 Google Translate
- 🌐 中文→英文 / 英文→中文(繁體中文)
- 完美保留段落格式、連結、附件
- 支援公告與信件內容翻譯
- AI 摘要:快速生成公告與信件摘要
- 顯示原文:隨時切換回原始內容
- API 金鑰設定:
- 支援 Gemini API(需自行申請)
- 未設定時使用 Google Translate 免費服務
┌─────────────────────┐
│ 📚 作業 📢 公告 📊 成績 │
├─────────────────────┤
│ 🔴 DSA HW (F) │
│ 📘 資料結構與演算法 │
│ ⏰ 還有 2 天 3 小時 │
│ [📝 前往] [✓ 已繳交] │
├─────────────────────┤
│ 🟡 期末書面報告 │
│ 📗 人文與科學經典 │
│ ⏰ 還有 5 天 │
│ [📝 前往] [⏸ 待處理]│
├─────────────────────┤
│ 🔄 同步 ✓ 5分鐘前 │
└─────────────────────┘
-
下載專案
git clone https://github.com/NYCU-Chung/portal_e3_helper.git cd portal_e3_helper -
載入擴充功能
- 開啟瀏覽器,進入擴充功能管理頁面
- Chrome:
chrome://extensions/ - Edge:
edge://extensions/ - Brave:
brave://extensions/
- Chrome:
- 開啟右上角「開發人員模式」
- 點擊「載入未封裝項目」
- 選擇專案資料夾
- 完成!
- 開啟瀏覽器,進入擴充功能管理頁面
-
驗證安裝
- 開啟任何網頁
- 應該會看到右側浮動的「📚 E3小助手」按鈕
- 點擊按鈕開啟側邊欄
-
登入 E3
- 訪問 https://e3p.nycu.edu.tw/
- 使用學號密碼登入
-
首次同步
- 點擊側邊欄中的「🔄 同步」按鈕
- 等待同步完成(約 10-30 秒)
- 同步內容包括:作業、課程列表
-
開始使用
- 切換到「📝 作業」分頁查看作業倒數
- 點擊「📢 公告」分頁查看公告與信件
- 點擊「📊 成績」分頁查詢成績
- 開啟側邊欄 → 作業分頁
- 查看作業截止時間倒數
- 點擊「前往」按鈕進入作業頁面
- 完成作業後點擊「已繳交」標記
- 開啟側邊欄 → 公告分頁
- 點擊「🔄 載入公告與信件」按鈕(可在任何網站使用)
- 使用篩選功能:
- 類型:全部 / 公告 / 信件
- 狀態:全部 / 未讀 / 已讀
- 點擊「👁️ 查看內容」查看詳細資訊
- 未讀項目會在左側顯示紅色圓點標記
- 點擊「✓ 全部已讀」一鍵標記所有為已讀
- 開啟側邊欄 → 成績分頁
- 選擇要查詢的課程
- 點擊「查詢成績」
- 查看作業、考試、總成績
- 前往 E3 課程頁面
- 開啟側邊欄
- 點擊「📥 下載教材」按鈕
- 等待打包完成並自動下載
設定 Gemini API(強烈建議):
- 開啟瀏覽器,訪問 Google AI Studio
- 網址:
https://ai.google.dev/
- 點擊頁面右上角的 「Sign in」 按鈕
- 使用你的 Google 帳號登入(Gmail、學校信箱等)
- 如果沒有 Google 帳號,需要先註冊一個
- 登入後,點擊頁面上的 「Get API key」 按鈕
- 位置通常在頁面中央或左側導航欄
- 會彈出一個對話框,顯示「Create API key」選項
選項 A:使用現有專案(如果你已經有)
- 在下拉選單中選擇現有的專案
- 點擊 「Create API key in existing project」
選項 B:建立新專案(推薦給新手)
- 點擊 「Create API key in new project」
- Google 會自動建立一個新的專案(名稱類似
generativelanguage-XXXXX) - 等待約 5-10 秒,系統會自動生成 API 金鑰
- API 金鑰會顯示在對話框中
- 格式:
AIzaSy...(通常是 39 個字元) - 點擊 「Copy」 按鈕複製金鑰
- 重要:請妥善保管此金鑰,不要公開分享
免費額度差異:
| 項目 | 未連結帳單 | 已連結帳單 |
|---|---|---|
| 每分鐘請求數(RPM) | 15 | 1,000 |
| 每天 Token 額度 | 有限 | 1,500,000 |
| 適用情境 | 簡單測試 | 正常使用 |
簡單來說:
- ❌ 未連結帳單:每分鐘只能翻譯 15 次,翻譯多篇公告會很快用完
- ✅ 已連結帳單:每分鐘可翻譯 1000 次,正常使用完全足夠
會扣款嗎?
- ✅ 不會! Google 提供 $300 美元的免費試用額度
- ✅ Gemini 2.5 Flash-Lite 模型成本極低($0.10 / 百萬 input tokens)
- ✅ 正常使用情況下,每月費用 < $1 美元(如果使用付費模型)
- ✅ 可以設定預算警報,避免意外超支
方法一:從 Google AI Studio 進入
- 回到 Google AI Studio
- 點擊左側導航欄的 「Billing」 或 「計費」
- 系統會自動導向 Google Cloud Console
方法二:直接訪問 Google Cloud Console
- 開啟 Google Cloud Console
- 登入同一個 Google 帳號
- 選擇你剛剛建立 API 金鑰的專案
- 專案名稱會顯示在頁面頂部,例如
generativelanguage-XXXXX - 點擊專案下拉選單,選擇正確的專案
- 專案名稱會顯示在頁面頂部,例如
- 點擊左上角的 「☰ 選單」(漢堡選單)
- 向下捲動,找到 「Billing」(計費/帳單)
- 點擊進入帳單管理頁面
情況 A:還沒有帳單帳戶(第一次使用)
- 你會看到「This project has no billing account」的提示
- 點擊 「Link a billing account」 或 「連結帳單帳戶」
- 點擊 「Create billing account」 或 「建立帳單帳戶」
- 填寫以下資訊:
- 國家/地區:選擇「台灣」或你所在的國家
- 帳戶類型:選擇「個人」(Individual)
- 名稱:輸入你的姓名
- 地址:輸入你的地址(可以是學校或家裡地址)
- 點擊 「繼續」 進入付款方式設定
情況 B:已經有帳單帳戶(之前用過 Google Cloud)
- 選擇現有的帳單帳戶
- 點擊 「Set account」 或 「設定帳戶」
- 完成連結
- 選擇付款方式:
- 信用卡/金融卡:推薦,最方便
- PayPal:如果可用的話
- 填寫信用卡資訊:
- 卡號(16 位數字)
- 到期日(月/年)
- CVV 安全碼(卡片背面 3 位數字)
- 持卡人姓名
- 勾選「我同意 Google Cloud 服務條款」
- 點擊 「啟用帳單功能」 或 「Enable billing」
- ✅ 這只是驗證你的身分,不會立即扣款
- ✅ Google 會發送 $1 美元的驗證交易,稍後會退回
- ✅ 你會獲得 $300 美元的免費試用額度(有效期 90 天)
- ✅ 免費額度用完後,系統會提醒你是否要繼續使用付費服務
- 連結完成後,你會看到「Billing account linked」的確認訊息
- 回到 Google AI Studio
- 你的 API 金鑰現在擁有更高的額度了!
如果你擔心超支,可以設定預算警報:
- 在 Google Cloud Console 的帳單頁面
- 點擊左側的 「Budgets & alerts」(預算與警報)
- 點擊 「Create budget」(建立預算)
- 設定預算金額:
- 例如:$10 美元(遠超過正常使用量)
- 設定警報閾值:
- 50%、75%、90%、100%
- 填寫通知信箱(你的 Gmail)
- 點擊 「Finish」 完成
- 點擊頁面右側的 「📚 E3小助手」 浮動按鈕
- 側邊欄會滑出
- 點擊左上角的 「⚙️」 齒輪圖示
- 進入設定頁面
- 找到「🤖 AI 設定」區塊
- 勾選 「🤖 啟用 AI 功能」 核取方塊
- 設定區域會展開,顯示更多選項
- 在 「Gemini API 金鑰」 欄位中:
- 貼上你在步驟 1.5 複製的 API 金鑰
- 格式:
AIzaSy...(39 個字元)
- 確認金鑰沒有多餘的空格或換行
預設模型:gemini-2.5-flash-lite(推薦,速度最快、成本最低)
其他可選模型:
gemini-1.5-flash:穩定版本,收費極低($0.075 / 百萬 tokens)gemini-1.5-pro:更強大但較貴($1.25 / 百萬 tokens)
建議:使用預設的 gemini-2.5-flash-lite,速度最快且成本最低
- 檢查所有設定是否正確
- 點擊頁面底部的 「💾 儲存設定」 按鈕
- 會顯示「✅ 設定已儲存」的確認訊息
- 切換到「📢 公告」分頁
- 點擊「🔄 載入公告與信件」
- 選擇一個公告,點擊「👁️ 查看內容」
- 在詳細頁面中,點擊 「🌐 英→中」 或 「🤖 AI摘要」
- 如果設定正確,翻譯或摘要會在幾秒鐘內完成
步驟 4.1.1:開啟公告詳細頁面
- 點擊側邊欄的「📢 公告」分頁
- 點擊「🔄 載入公告與信件」按鈕
- 等待載入完成(約 10-30 秒)
- 選擇一個公告,點擊「👁️ 查看內容」
步驟 4.1.2:選擇翻譯方向
- 🌐 中→英:將中文公告翻譯為英文
- 🌐 英→中:將英文公告翻譯為繁體中文
步驟 4.1.3:等待翻譯完成
- 點擊翻譯按鈕後,按鈕會顯示「翻譯中...」
- 翻譯通常需要 3-10 秒(取決於內容長度)
- 翻譯完成後:
- 內容會自動替換為翻譯後的文字
- 按鈕變成「📄 顯示原文」
步驟 4.1.4:查看翻譯效果
- ✅ 段落格式完整保留
- ✅ 所有連結可點擊
- ✅ 附件仍然可下載
- ✅ 圖片和表格不受影響
步驟 4.1.5:切換回原文
- 點擊「📄 顯示原文」按鈕
- 內容會立即恢復為原始文字
- 可以隨時在原文和翻譯之間切換
步驟 4.2.1:開啟公告詳細頁面
- 同翻譯功能,先開啟公告詳細頁面
- 選擇一個較長的公告(摘要功能對長文章最有用)
步驟 4.2.2:生成摘要
- 點擊「🤖 AI摘要」按鈕
- 按鈕會顯示「摘要中...」
- 等待 5-15 秒(取決於內容長度)
步驟 4.2.3:查看摘要結果
- 摘要會顯示在原文上方
- 通常包含:
- 📝 主要內容重點(3-5 點)
- 📅 重要日期和截止時間
⚠️ 需要注意的事項- 📎 附件說明(如果有)
步驟 4.2.4:關閉摘要
- 點擊摘要區域右上角的「✕」關閉按鈕
- 或點擊「🤖 AI摘要」按鈕重新生成
| 模型 | 免費額度 | 收費標準 | 實際費用(每月) |
|---|---|---|---|
| Gemini 2.5 Flash-Lite | 無限制 | $0.10 / $0.40 per 1M tokens | < $1 |
| Gemini 1.5 Flash | 前 $300 免費試用 | $0.075 / 百萬 tokens | < $1 |
| Gemini 1.5 Pro | 前 $300 免費試用 | $1.25 / 百萬 tokens | $5-10 |
翻譯一篇公告的成本:
- 短公告(500 字):約 1,000 tokens = $0.000075(不到 0.01 元台幣)
- 中等公告(1,500 字):約 3,000 tokens = $0.000225
- 長公告(5,000 字):約 10,000 tokens = $0.00075
每月使用估算:
- 假設每天翻譯 10 篇公告(1,500 字/篇)
- 每天使用:30,000 tokens
- 每月使用:900,000 tokens(< 100 萬 tokens)
- 月費用:< $0.075(約 2.5 元台幣)
結論:
- ✅ 使用
gemini-2.5-flash-lite(預設):速度最快、成本最低 - ✅ 使用
gemini-1.5-flash:月費用 < $1 美元(約 30 元台幣) - ✅ $300 免費試用額度足夠使用 4,000 個月(約 333 年)
原因:
- API 金鑰輸入錯誤
- API 金鑰被刪除或停用
解決方法:
- 檢查 API 金鑰是否完整(39 個字元,以
AIza開頭) - 確認沒有多餘的空格或換行
- 前往 Google AI Studio 重新複製金鑰
- 如果金鑰已刪除,重新建立一個新的
原因:
- API 請求額度用盡(未連結帳單帳戶)
- 每分鐘請求數超過限制(15 RPM)
解決方法:
- 立即:等待 1 分鐘後再試
- 長期:完成「步驟二:連結帳單帳戶」
- 連結後額度會提升到 1000 RPM
如何確認是否已連結帳單:
- 前往 Google Cloud Console
- 選擇你的專案
- 點擊左側「Billing」
- 如果顯示「This project has no billing account」,表示未連結
原因:
- 使用舊版本的擴充功能(v1.2 以前)
解決方法:
- 前往
chrome://extensions/ - 找到「NYCU E3 Helper」
- 點擊「重新載入」按鈕
- 重新翻譯公告
原因:
- 使用舊版本的 prompt(v1.3 以前)
解決方法:
- 更新到最新版本的擴充功能
- 重新載入擴充功能
- 重新翻譯
原因:
- 未設定 Gemini API 金鑰
- API 金鑰無效
解決方法:
- 確認已啟用「🤖 啟用 AI 功能」
- 確認已輸入有效的 Gemini API 金鑰
- Google Translate 備用服務不支援 AI 摘要功能
步驟:
- 前往 Google Cloud Console
- 選擇你的專案
- 點擊左側「☰ 選單」→「APIs & Services」→「Dashboard」
- 點擊「Generative Language API」
- 查看「Quotas」和「Metrics」分頁
可查看的資訊:
- 每分鐘請求數(RPM)
- 每天請求數(RPD)
- Token 使用量
- 錯誤率
步驟:
- 在 Google Cloud Console 的 API 頁面
- 點擊「Quotas」分頁
- 選擇要監控的配額(例如:Requests per minute)
- 點擊「Create alert」
- 設定閾值(例如:使用量達 80%)
- 填寫通知信箱
- 點擊「Save」
可能原因:
- 公告內容過長(>5,000 字)
- 網路速度較慢
- Google API 暫時繁忙
解決方法:
- 短期:等待翻譯完成(通常不超過 30 秒)
- 長期:考慮升級網路速度
- 替代:對於超長公告,使用 AI 摘要功能快速了解重點
答案:不行
原因:
- 翻譯功能需要連接 Google AI 或 Google Translate API
- 這些服務都需要網路連線
建議:
- 在有網路的環境下使用翻譯功能
- 翻譯後的內容會保存在頁面上,即使斷網也能查看
答案:不會
安全措施:
- ✅ API 金鑰僅儲存在你的瀏覽器本地
- ✅ 不會上傳到任何伺服器
- ✅ 不會與其他人分享
- ✅ 只有你的瀏覽器擴充功能可以存取
最佳實踐:
- ❌ 不要將 API 金鑰貼到公開的地方(GitHub、論壇等)
- ❌ 不要與他人分享你的 API 金鑰
- ✅ 如果懷疑金鑰外洩,立即刪除並建立新的
每分鐘請求數:15 RPM
適用情境:簡單測試
限制:翻譯 15 篇公告後需等待 1 分鐘
每分鐘請求數:1,000 RPM
每天 Token 額度:1,500,000 tokens
適用情境:正常使用
限制:幾乎沒有限制
前往:console.cloud.google.com
選擇專案 → Billing
看到「Billing account linked」= 已連結 ✅
看到「No billing account」= 未連結 ❌
✅ 不設定 Gemini API
✅ 使用 Google Translate 免費服務
✅ 翻譯品質:中等
✅ 費用:$0
✅ 設定 Gemini API
✅ 連結帳單帳戶
✅ 使用 gemini-2.5-flash-lite 模型
✅ 翻譯品質:優秀
✅ 費用:$0(完全免費)
✅ 設定 Gemini API
✅ 連結帳單帳戶
✅ 使用 gemini-1.5-pro 模型
✅ 翻譯品質:極佳
✅ 費用:~$5-10/月
- 浮動按鈕:右側「📚 E3小助手」按鈕右上角顯示未讀數量
- 擴充功能圖示:瀏覽器工具列圖示顯示總未讀數
- 包含:未讀公告、未讀信件、24小時內到期作業
- 擴充功能會每小時自動同步一次
- 可隨時點擊「🔄 同步」手動同步
- 同步狀態會顯示在側邊欄底部
- 「待處理」:預設狀態,顯示在作業列表中
- 「已繳交」:手動標記,過期後仍保留在列表中
- 「已逾期」:自動標記,顯示紅色警告
e3_helper/
├── manifest.json # Chrome Extension 配置(Manifest V3)
├── background.js # Service Worker(背景同步、API 代理)
├── content.js # 內容腳本(核心功能)
├── jszip.min.js # ZIP 打包函式庫
├── README.md # 說明文件
├── CHANGELOG.md # 更新日誌
├── STORE_DESCRIPTION.txt # 商店說明文字
└── .gitignore # Git 忽略規則
- Service Worker 架構
- 非持久性背景頁面
- 支援 Chrome 88+
- 使用 Moodle REST API
- 背景定時同步(Alarms API)
- 本地儲存(Storage API)
- API:
core_calendar_get_action_events_by_timesort - 自動提取課程名稱
- 保留已繳交作業資料
- 公告: Moodle Forum API
- 信件: dcpcmail 系統 HTML 解析
- 合併顯示與篩選
- HTML 解析成績頁面
- 提取作業、考試、總成績
- 計算百分比與比重
- Gemini 2.5 Flash-Lite API:
- 繁體中文翻譯(Traditional Chinese Taiwan)
- 保留段落格式的 prompt 工程
- 禁用 thinking budget 避免 token 浪費
- 翻譯引擎:
- 提取所有文字節點(Text Node)
- 使用特殊分隔符合併文字
- 完整保留 HTML 結構和屬性
- 翻譯後將文字放回對應節點
- Google Translate 備用:
- 免費 API 端點(無需金鑰)
- 自動降級機制
POST https://e3p.nycu.edu.tw/lib/ajax/service.php?sesskey={sesskey}
{
"methodname": "core_calendar_get_action_events_by_timesort",
"args": {
"limitnum": 50,
"timesortfrom": timestamp,
"timesortto": timestamp
}
}POST https://e3p.nycu.edu.tw/lib/ajax/service.php?sesskey={sesskey}
{
"methodname": "core_course_get_enrolled_courses_by_timeline_classification",
"args": {
"classification": "inprogress"
}
}v2.1.0 進行了全面安全審查與加固,修復 18 項安全問題:
- HTML 消毒:所有動態插入的 HTML 內容經過
sanitizeHtml()白名單過濾,移除<script>、<iframe>、<svg>、<object>、<embed>等危險標籤 - 事件屬性移除:自動移除所有
on*事件處理屬性(onclick、onerror 等) - JavaScript URI 攔截:封鎖
javascript:協議的連結 - 轉義輸出:所有動態文字使用
escapeHtml()轉義後才插入 DOM
- Background Script 代理:Gemini API 呼叫透過 background.js 代理,content script 無法直接存取 API 金鑰
- Console 遮蔽:API 金鑰在日誌輸出中自動遮蔽(僅顯示前 10 字元)
- 網域白名單:下載 URL 限制為 E3 網域(
e3.nycu.edu.tw、e3p.nycu.edu.tw) - 路徑穿越防護:檔名中的
..和/會被攔截 - URL 驗證:所有下載請求先驗證 URL 格式與網域
- IIFE 封裝:整個 content script 以立即執行函式封裝,避免全域命名空間污染
- 條件初始化:非 E3 網站不執行 console 攔截與 window.E3Helper 掛載
- 遞迴深度限制:renderValue 函式加入深度限制,防止堆疊溢位
- MutationObserver 清理:加入 disconnect 機制,避免記憶體洩漏
- ✅ 不收集任何個人資料
- ✅ 不追蹤使用者行為
- ✅ 所有資料僅儲存在本地瀏覽器
- ✅ 開源程式碼,可自行審查
- Gemini API(選配):
- 使用者自行申請並管理 API 金鑰
- 翻譯時會將公告/信件內容傳送至 Google AI 服務
- 遵循 Google AI API Terms of Service
- 可隨時停用 AI 功能
- Google Translate(預設):
- 使用公開的免費翻譯服務
- 不需要 API 金鑰或帳號
- 翻譯請求透過 Google Translate 端點處理
本擴充功能可能連接以下服務(僅在使用相關功能時):
- E3 學習平台:e3.nycu.edu.tw, e3p.nycu.edu.tw(必要)
- Google AI Studio:generativelanguage.googleapis.com(選配,需 API 金鑰)
- Google Translate:translate.googleapis.com(預設翻譯服務)
A: 可能原因:
- 未登入 E3:請先登入 https://e3p.nycu.edu.tw/
- 網路問題:檢查網路連線
- Session 過期:重新登入 E3 後再同步
解決方法:開啟 Service Worker Console 查看詳細錯誤訊息
A: 擴充功能會自動從 API 獲取課程名稱,如果仍顯示「(未知課程)」:
- 點擊「🔄 同步」重新同步
- 檢查 Service Worker Console 是否有錯誤訊息
A: 這是正常現象。當擴充功能更新時:
- 會自動顯示「擴充功能已更新」警告
- 點擊「重新整理頁面」按鈕即可
A: 公告與信件需要逐一抓取每個課程的資料,可能需要 10-30 秒。載入過程中:
- 顯示「載入中...」提示
- 可查看 Console 了解進度
A: 可能原因:
- 下載過程中斷
- 課程檔案過大(超過 500MB)
- 瀏覽器限制
解決方法:
- 重新下載
- 檢查網路連線
- 手動下載大型檔案
A: 請確認:
- 未設定 Gemini API:
- 會自動使用 Google Translate 免費服務
- 翻譯品質可能較低,但無需設定
- 設定 Gemini API 後仍失敗:
- 檢查 API 金鑰是否正確
- 確認 Google AI Studio 帳號狀態
- 查看 Console 是否有錯誤訊息(API 額度、網路問題等)
- 翻譯結果是簡體中文:
- 已修復,現在強制使用繁體中文
- 請重新載入擴充功能
A: 已修復!v1.3 版本重寫了翻譯引擎:
- 完整保留所有 HTML 標籤和屬性
- 連結 (
<a>標籤) 的href和target屬性都會保留 - 附件、圖片、表格等元素完全不受影響
- 段落格式與原文一致
A: 徽章顯示條件:
- 有未讀的公告或信件
- 有參與者變動通知
- 有 24 小時內到期的作業
如果沒有上述通知,徽章會自動隱藏。
-
開啟 Console
- 按 F12 開啟開發者工具
- 切換到 Console 分頁
- 查看
E3 Helper:開頭的訊息
-
Service Worker Console
- 訪問
chrome://extensions/ - 找到 NYCU E3 Helper
- 點擊「Service Worker」→「檢查檢視」
- 查看背景同步的 log
- 訪問
-
Storage 檢視
- F12 → Application → Storage → Extension Storage
- 查看
assignments、courses、announcements等資料
// 查看作業資料
chrome.storage.local.get(['assignments'], console.log)
// 查看課程列表
chrome.storage.local.get(['courses'], console.log)
// 查看同步狀態
chrome.storage.local.get(['lastSync'], console.log)
// 手動觸發同步(在 Service Worker Console)
syncE3Data()歡迎提交 Issue 和 Pull Request!
git clone https://github.com/NYCU-Chung/portal_e3_helper.git
cd portal_e3_helper
# 在 Chrome 中載入擴充功能- 確保程式碼正常運作
- 測試所有功能
- 遵循現有程式碼風格
- 提供清楚的 commit 訊息
- 🔒 全面安全加固(18 項修復)
- XSS 防護:sanitizeHtml 白名單 + escapeHtml 轉義
- API 金鑰保護:透過 background.js 代理 Gemini API 呼叫
- 下載安全:網域白名單 + 路徑穿越防護
- IIFE 封裝、條件初始化、遞迴深度限制
- ⚡ 效能優化
- 日誌批次截斷改用 splice 替代逐條 shift
- MutationObserver disconnect 機制
- 🏗️ 程式碼品質
- 移除未使用的開發文件(DEBUG.md 等)
- 🐛 修復重複函數定義導致的時間顯示問題
- 🐛 修復作業儲存競態條件(加入 debounce 機制)
- 🎨 將所有彈窗提示改為非阻塞式 Toast 通知
- 🎨 同步超時時加入重試按鈕
- 🎨 優化日誌系統效能(throttling)
- 🎨 改善信件載入的使用者回饋
- ✨ 新增作業繳交狀態自動檢測功能
- 使用 HTML 解析技術智能判斷作業是否已繳交
- 擴大同步範圍從 7 天到 30 天,確保較舊作業也能正確檢測
- 🐛 修復手動改變狀態後作業可能消失的問題
- 🐛 修復已繳交作業在同步後不被保留的問題
- 🎨 優化作業保留邏輯(未過期作業全部保留,已過期只保留已繳交)
- ✨ 新增手動新增作業功能(支援自訂課程、截止時間)
- ✨ 所有作業(包括 E3 同步作業)支援編輯和刪除
- ✨ 課程欄位改為智能選單(整合 E3 課程與自訂輸入)
- ✨ 新增臨時訊息提示系統
- ✨ 自動收集課程名稱作為選項
- 🎨 優化作業管理流程與使用體驗
- 🐛 刪除同步作業時顯示警告提示
- ✨ 新增 AI 智能翻譯功能(支援繁體中文,保留格式與連結)
- ✨ 新增 AI 智能摘要功能
- ✨ 新增智能通知徽章系統(浮動按鈕與擴充功能圖示)
- ✨ 新增 24 小時緊急作業通知(紅色警示)
- ✨ 整合 Google Gemini 2.5 Flash API
- ✨ 新增 AI 設定頁面(API 金鑰管理)
- ✨ 支援影片與公告附件批次下載
- 🐛 修復未讀卡片對齊問題
- 🐛 修復翻譯後連結與附件無法點擊問題
- 🐛 修復非 E3 網站重新載入郵件按鈕錯誤
- 🎨 優化使用說明文件
- ✨ 新增 AI 智能翻譯與摘要功能
- 支援 Gemini 2.5 Flash API 和 Google Translate 免費服務
- 翻譯使用繁體中文(禁用簡體中文)
- 完美保留段落格式、連結、附件(重寫翻譯引擎)
- 支援中→英、英→中雙向翻譯
- AI 摘要功能(需 Gemini API)
- ✨ 新增智能通知系統
- 浮動按鈕顯示未讀數量徽章(紅色圓點+數字)
- 擴充功能圖示顯示未讀總數
- 24小時內到期作業自動通知
- 整合作業通知、參與者變動、緊急提醒
- 🎨 UI/UX 改進
- 未讀公告/信件顯示紅色圓點標記(絕對定位,不影響排版)
- 浮動按鈕位置優化(右上角固定定位)
- 🐛 修復「焦點綜覽」課程名稱問題
- 新增三層課程名稱驗證機制
- 過濾無效的頁面標題(焦點綜覽、通知、時間軸等)
- 保留的「已繳交」作業會自動清理無效課程名稱
- 🐛 修復重新載入信件按鈕在非 E3 網站無效的問題
- 按鈕現在會在所有網站顯示
- 在非 E3 網站點擊時,會透過背景自動連接到 E3 載入資料
- 新增背景載入機制,使用已開啟的 E3 標籤頁或自動開啟新標籤頁
- 改善使用者體驗,無需手動切換到 E3 網站
- 📝 新增完整的使用說明與技術文件
- 📋 新增 CHANGELOG.md 詳細記錄版本變更
- ✨ 新增側邊欄介面,支援跨網頁使用
- ✨ 新增作業倒數與狀態管理功能
- ✨ 新增公告與信件整合(支援 dcpcmail)
- ✨ 新增成績查詢功能
- ✨ 新增快速下載教材功能
- ✨ 新增自動同步功能(每小時)
- 🐛 修復作業課程名稱顯示問題
- 🐛 修復 Extension Context Invalidated 錯誤
- 🎨 改進 UI/UX 設計,更加美觀易用
- ✨ 新增一鍵前往作業按鈕
- ✨ 支援動態載入的內容(MutationObserver)
- ✨ 紫色漸層按鈕設計
📋 完整的更新記錄請參閱 CHANGELOG.md
MIT License