Skip to content

NYCU-Chung/portal_e3_helper

Repository files navigation

NYCU E3 Helper

優化陽明交通大學 E3 學習平台的使用體驗。

Chrome 線上應用程式商店: https://chromewebstore.google.com/detail/nycu-e3-helper/cmagonljljocpkfojkabhiedjafamoef

功能特色

✅ 已實作功能

1. 📱 側邊欄助手

  • 浮動按鈕:任何網頁都能快速開啟側邊欄
  • 響應式設計:美觀的漸層介面,支援滑動展開/收合
  • 多分頁切換:作業、公告、成績一目了然
  • 跨網頁使用:不限於 E3 網站,任何網頁都能使用

2. 📝 作業倒數與管理

  • 即時倒數:顯示作業截止時間倒數(天/小時/分鐘)
  • 狀態標記:手動標記作業為「已繳交」或「待處理」
  • 視覺化提示
    • 🔴 已逾期(紅色)
    • 🟡 即將到期(黃色,3 天內)
    • 🟢 充裕時間(綠色)
  • 快速連結:點擊作業直接進入繳交頁面
  • 課程顯示:自動顯示作業所屬課程名稱
  • 自動保留:已標記為「已繳交」的作業不會被自動刪除

3. 📢 公告與信件整合

  • 公告聚合:整合所有課程的最新公告
  • 信件整合:支援 dcpcmail 系統的課程信件
  • 統一介面:公告與信件合併顯示,方便管理
  • 篩選功能
    • 按類型:全部/公告/信件
    • 按狀態:全部/未讀/已讀
  • 詳細預覽:點擊查看完整內容,保留所有連結和附件
  • 已讀追蹤:自動記錄已讀狀態,未讀項目顯示紅點標記
  • 新分頁開啟:預覽中的連結自動在新分頁開啟
  • 跨網站載入:在任何網站都能載入公告與信件(自動在背景連接 E3)

4. 📊 成績查詢(任何網頁可用)

  • 快速查詢:一鍵查看所有課程成績
  • 詳細資訊
    • 作業成績與比重
    • 考試成績與比重
    • 總成績計算
  • 視覺化呈現:清楚的分數顯示與百分比
  • 即時更新:支援手動重新載入

5. 📥 快速下載教材(任何網頁可用)

  • 批次下載:一鍵下載課程所有檔案
  • ZIP 打包:自動打包成 ZIP 檔案
  • 自動命名:檔案名稱包含課程名稱
  • 進度提示:下載過程中顯示進度

6. 🔄 自動同步功能

  • 背景同步:每小時自動同步一次
  • 手動同步:點擊按鈕立即同步
  • 同步內容
    • 作業列表與截止時間
    • 課程列表
    • 公告與信件(手動)
  • 同步狀態:顯示最後同步時間
  • 登入檢查:自動檢測登入狀態
  • 錯誤處理:網路錯誤時友好提示

7. 🎯 一鍵前往作業

  • 快速按鈕:在 E3 頁面的作業旁新增「📝 前往作業」按鈕
  • 直接進入:點擊直接進入作業繳交頁面,跳過日曆頁面
  • 支援位置
    • ✅ 首頁時間軸
    • ✅ 日曆頁面
    • ✅ 通知中心
    • ✅ 課程總覽
  • 動態監聽:自動偵測新增的作業元素

8. 🔔 智能通知系統

  • 浮動按鈕徽章:右側浮動按鈕顯示未讀通知數量(紅色徽章)
  • 擴充功能徽章:瀏覽器工具列圖示顯示未讀通知總數
  • 24小時緊急通知:24小時內到期的作業自動發送通知
  • 作業評分通知:自動偵測作業是否已評分,第一次評分時立即通知
  • 新公告通知:公告同步時自動比對,有新公告立即發送桌面通知
  • 多來源整合
    • 作業通知
    • 作業評分通知
    • 新公告通知
    • 參與者變動通知
    • 緊急作業提醒
  • 實時更新:通知數量即時同步

9. 🤖 AI 智能助手(選配)

  • AI 翻譯:使用 Gemini 2.5 Flash-Lite 或 Google Translate
    • 🌐 中文→英文 / 英文→中文(繁體中文)
    • 完美保留段落格式、連結、附件
    • 支援公告與信件內容翻譯
  • AI 摘要:快速生成公告與信件摘要
  • 顯示原文:隨時切換回原始內容
  • API 金鑰設定
    • 支援 Gemini API(需自行申請)
    • 未設定時使用 Google Translate 免費服務

截圖

側邊欄介面

┌─────────────────────┐
│  📚 作業 📢 公告 📊 成績 │
├─────────────────────┤
│  🔴 DSA HW (F)      │
│  📘 資料結構與演算法  │
│  ⏰ 還有 2 天 3 小時 │
│  [📝 前往] [✓ 已繳交] │
├─────────────────────┤
│  🟡 期末書面報告     │
│  📗 人文與科學經典   │
│  ⏰ 還有 5 天       │
│  [📝 前往] [⏸ 待處理]│
├─────────────────────┤
│  🔄 同步  ✓ 5分鐘前  │
└─────────────────────┘

安裝方式

Chrome / Edge / Brave

  1. 下載專案

    git clone https://github.com/NYCU-Chung/portal_e3_helper.git
    cd portal_e3_helper
  2. 載入擴充功能

    • 開啟瀏覽器,進入擴充功能管理頁面
      • Chrome: chrome://extensions/
      • Edge: edge://extensions/
      • Brave: brave://extensions/
    • 開啟右上角「開發人員模式」
    • 點擊「載入未封裝項目」
    • 選擇專案資料夾
    • 完成!
  3. 驗證安裝

    • 開啟任何網頁
    • 應該會看到右側浮動的「📚 E3小助手」按鈕
    • 點擊按鈕開啟側邊欄

使用指南

首次使用

  1. 登入 E3

  2. 首次同步

    • 點擊側邊欄中的「🔄 同步」按鈕
    • 等待同步完成(約 10-30 秒)
    • 同步內容包括:作業、課程列表
  3. 開始使用

    • 切換到「📝 作業」分頁查看作業倒數
    • 點擊「📢 公告」分頁查看公告與信件
    • 點擊「📊 成績」分頁查詢成績

日常使用

查看作業

  • 開啟側邊欄 → 作業分頁
  • 查看作業截止時間倒數
  • 點擊「前往」按鈕進入作業頁面
  • 完成作業後點擊「已繳交」標記

查看公告與信件

  • 開啟側邊欄 → 公告分頁
  • 點擊「🔄 載入公告與信件」按鈕(可在任何網站使用)
  • 使用篩選功能:
    • 類型:全部 / 公告 / 信件
    • 狀態:全部 / 未讀 / 已讀
  • 點擊「👁️ 查看內容」查看詳細資訊
  • 未讀項目會在左側顯示紅色圓點標記
  • 點擊「✓ 全部已讀」一鍵標記所有為已讀

查詢成績

  • 開啟側邊欄 → 成績分頁
  • 選擇要查詢的課程
  • 點擊「查詢成績」
  • 查看作業、考試、總成績

下載教材

  • 前往 E3 課程頁面
  • 開啟側邊欄
  • 點擊「📥 下載教材」按鈕
  • 等待打包完成並自動下載

進階功能

AI 翻譯與摘要(選配)

設定 Gemini API(強烈建議)


📝 步驟一:申請 Google Gemini API 金鑰

1.1 前往 Google AI Studio

1.2 登入 Google 帳號

  • 點擊頁面右上角的 「Sign in」 按鈕
  • 使用你的 Google 帳號登入(Gmail、學校信箱等)
  • 如果沒有 Google 帳號,需要先註冊一個

1.3 獲取 API 金鑰

  • 登入後,點擊頁面上的 「Get API key」 按鈕
    • 位置通常在頁面中央或左側導航欄
  • 會彈出一個對話框,顯示「Create API key」選項

1.4 選擇或建立 Google Cloud 專案

選項 A:使用現有專案(如果你已經有)

  • 在下拉選單中選擇現有的專案
  • 點擊 「Create API key in existing project」

選項 B:建立新專案(推薦給新手)

  • 點擊 「Create API key in new project」
  • Google 會自動建立一個新的專案(名稱類似 generativelanguage-XXXXX
  • 等待約 5-10 秒,系統會自動生成 API 金鑰

1.5 複製 API 金鑰

  • API 金鑰會顯示在對話框中
  • 格式:AIzaSy...(通常是 39 個字元)
  • 點擊 「Copy」 按鈕複製金鑰
  • 重要:請妥善保管此金鑰,不要公開分享

⚠️ 步驟二:連結帳單帳戶(非常重要!)

2.1 為什麼需要連結帳單帳戶?

免費額度差異

項目 未連結帳單 已連結帳單
每分鐘請求數(RPM) 15 1,000
每天 Token 額度 有限 1,500,000
適用情境 簡單測試 正常使用

簡單來說

  • 未連結帳單:每分鐘只能翻譯 15 次,翻譯多篇公告會很快用完
  • 已連結帳單:每分鐘可翻譯 1000 次,正常使用完全足夠

會扣款嗎?

  • 不會! Google 提供 $300 美元的免費試用額度
  • ✅ Gemini 2.5 Flash-Lite 模型成本極低($0.10 / 百萬 input tokens)
  • ✅ 正常使用情況下,每月費用 < $1 美元(如果使用付費模型)
  • ✅ 可以設定預算警報,避免意外超支

2.2 如何連結帳單帳戶

步驟 2.2.1:前往 Google Cloud Console

方法一:從 Google AI Studio 進入

  1. 回到 Google AI Studio
  2. 點擊左側導航欄的 「Billing」「計費」
  3. 系統會自動導向 Google Cloud Console

方法二:直接訪問 Google Cloud Console

  1. 開啟 Google Cloud Console
  2. 登入同一個 Google 帳號
  3. 選擇你剛剛建立 API 金鑰的專案
    • 專案名稱會顯示在頁面頂部,例如 generativelanguage-XXXXX
    • 點擊專案下拉選單,選擇正確的專案
步驟 2.2.2:進入帳單設定
  1. 點擊左上角的 「☰ 選單」(漢堡選單)
  2. 向下捲動,找到 「Billing」(計費/帳單)
  3. 點擊進入帳單管理頁面
步驟 2.2.3:連結帳單帳戶

情況 A:還沒有帳單帳戶(第一次使用)

  1. 你會看到「This project has no billing account」的提示
  2. 點擊 「Link a billing account」「連結帳單帳戶」
  3. 點擊 「Create billing account」「建立帳單帳戶」
  4. 填寫以下資訊:
    • 國家/地區:選擇「台灣」或你所在的國家
    • 帳戶類型:選擇「個人」(Individual)
    • 名稱:輸入你的姓名
    • 地址:輸入你的地址(可以是學校或家裡地址)
  5. 點擊 「繼續」 進入付款方式設定

情況 B:已經有帳單帳戶(之前用過 Google Cloud)

  1. 選擇現有的帳單帳戶
  2. 點擊 「Set account」「設定帳戶」
  3. 完成連結
步驟 2.2.4:設定付款方式
  1. 選擇付款方式:
    • 信用卡/金融卡:推薦,最方便
    • PayPal:如果可用的話
  2. 填寫信用卡資訊:
    • 卡號(16 位數字)
    • 到期日(月/年)
    • CVV 安全碼(卡片背面 3 位數字)
    • 持卡人姓名
  3. 勾選「我同意 Google Cloud 服務條款」
  4. 點擊 「啟用帳單功能」「Enable billing」

⚠️ 重要提醒

  • ✅ 這只是驗證你的身分,不會立即扣款
  • ✅ Google 會發送 $1 美元的驗證交易,稍後會退回
  • ✅ 你會獲得 $300 美元的免費試用額度(有效期 90 天)
  • ✅ 免費額度用完後,系統會提醒你是否要繼續使用付費服務
步驟 2.2.5:確認連結成功
  1. 連結完成後,你會看到「Billing account linked」的確認訊息
  2. 回到 Google AI Studio
  3. 你的 API 金鑰現在擁有更高的額度了!

2.3 (選配)設定預算警報

如果你擔心超支,可以設定預算警報:

  1. 在 Google Cloud Console 的帳單頁面
  2. 點擊左側的 「Budgets & alerts」(預算與警報)
  3. 點擊 「Create budget」(建立預算)
  4. 設定預算金額:
    • 例如:$10 美元(遠超過正常使用量)
  5. 設定警報閾值:
    • 50%、75%、90%、100%
  6. 填寫通知信箱(你的 Gmail)
  7. 點擊 「Finish」 完成

🔧 步驟三:在擴充功能中設定 API 金鑰

3.1 開啟設定頁面

  1. 點擊頁面右側的 「📚 E3小助手」 浮動按鈕
  2. 側邊欄會滑出
  3. 點擊左上角的 「⚙️」 齒輪圖示
  4. 進入設定頁面

3.2 啟用 AI 功能

  1. 找到「🤖 AI 設定」區塊
  2. 勾選 「🤖 啟用 AI 功能」 核取方塊
  3. 設定區域會展開,顯示更多選項

3.3 輸入 API 金鑰

  1. 「Gemini API 金鑰」 欄位中:
    • 貼上你在步驟 1.5 複製的 API 金鑰
    • 格式:AIzaSy...(39 個字元)
  2. 確認金鑰沒有多餘的空格或換行

3.4 選擇模型(選配)

預設模型:gemini-2.5-flash-lite(推薦,速度最快、成本最低)

其他可選模型:

  • gemini-1.5-flash:穩定版本,收費極低($0.075 / 百萬 tokens)
  • gemini-1.5-pro:更強大但較貴($1.25 / 百萬 tokens)

建議:使用預設的 gemini-2.5-flash-lite,速度最快且成本最低

3.5 儲存設定

  1. 檢查所有設定是否正確
  2. 點擊頁面底部的 「💾 儲存設定」 按鈕
  3. 會顯示「✅ 設定已儲存」的確認訊息

3.6 測試 AI 功能

  1. 切換到「📢 公告」分頁
  2. 點擊「🔄 載入公告與信件」
  3. 選擇一個公告,點擊「👁️ 查看內容」
  4. 在詳細頁面中,點擊 「🌐 英→中」「🤖 AI摘要」
  5. 如果設定正確,翻譯或摘要會在幾秒鐘內完成

📚 步驟四:使用 AI 功能

4.1 使用翻譯功能

步驟 4.1.1:開啟公告詳細頁面

  1. 點擊側邊欄的「📢 公告」分頁
  2. 點擊「🔄 載入公告與信件」按鈕
  3. 等待載入完成(約 10-30 秒)
  4. 選擇一個公告,點擊「👁️ 查看內容」

步驟 4.1.2:選擇翻譯方向

  • 🌐 中→英:將中文公告翻譯為英文
  • 🌐 英→中:將英文公告翻譯為繁體中文

步驟 4.1.3:等待翻譯完成

  1. 點擊翻譯按鈕後,按鈕會顯示「翻譯中...」
  2. 翻譯通常需要 3-10 秒(取決於內容長度)
  3. 翻譯完成後:
    • 內容會自動替換為翻譯後的文字
    • 按鈕變成「📄 顯示原文」

步驟 4.1.4:查看翻譯效果

  • ✅ 段落格式完整保留
  • ✅ 所有連結可點擊
  • ✅ 附件仍然可下載
  • ✅ 圖片和表格不受影響

步驟 4.1.5:切換回原文

  • 點擊「📄 顯示原文」按鈕
  • 內容會立即恢復為原始文字
  • 可以隨時在原文和翻譯之間切換

4.2 使用 AI 摘要功能

步驟 4.2.1:開啟公告詳細頁面

  1. 同翻譯功能,先開啟公告詳細頁面
  2. 選擇一個較長的公告(摘要功能對長文章最有用)

步驟 4.2.2:生成摘要

  1. 點擊「🤖 AI摘要」按鈕
  2. 按鈕會顯示「摘要中...」
  3. 等待 5-15 秒(取決於內容長度)

步驟 4.2.3:查看摘要結果

  • 摘要會顯示在原文上方
  • 通常包含:
    • 📝 主要內容重點(3-5 點)
    • 📅 重要日期和截止時間
    • ⚠️ 需要注意的事項
    • 📎 附件說明(如果有)

步驟 4.2.4:關閉摘要

  • 點擊摘要區域右上角的「✕」關閉按鈕
  • 或點擊「🤖 AI摘要」按鈕重新生成

💰 API 使用成本與額度說明

成本總覽

模型 免費額度 收費標準 實際費用(每月)
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 年)

⚠️ 常見問題與疑難排解

Q1: 翻譯時出現錯誤「API key not valid」

原因

  • API 金鑰輸入錯誤
  • API 金鑰被刪除或停用

解決方法

  1. 檢查 API 金鑰是否完整(39 個字元,以 AIza 開頭)
  2. 確認沒有多餘的空格或換行
  3. 前往 Google AI Studio 重新複製金鑰
  4. 如果金鑰已刪除,重新建立一個新的

Q2: 翻譯時出現錯誤「Resource has been exhausted」

原因

  • API 請求額度用盡(未連結帳單帳戶)
  • 每分鐘請求數超過限制(15 RPM)

解決方法

  1. 立即:等待 1 分鐘後再試
  2. 長期:完成「步驟二:連結帳單帳戶」
  3. 連結後額度會提升到 1000 RPM

如何確認是否已連結帳單

  1. 前往 Google Cloud Console
  2. 選擇你的專案
  3. 點擊左側「Billing」
  4. 如果顯示「This project has no billing account」,表示未連結

Q3: 翻譯後連結或附件無法點擊

原因

  • 使用舊版本的擴充功能(v1.2 以前)

解決方法

  1. 前往 chrome://extensions/
  2. 找到「NYCU E3 Helper」
  3. 點擊「重新載入」按鈕
  4. 重新翻譯公告

Q4: 翻譯結果是簡體中文而非繁體中文

原因

  • 使用舊版本的 prompt(v1.3 以前)

解決方法

  1. 更新到最新版本的擴充功能
  2. 重新載入擴充功能
  3. 重新翻譯

Q5: AI 摘要功能無法使用

原因

  • 未設定 Gemini API 金鑰
  • API 金鑰無效

解決方法

  1. 確認已啟用「🤖 啟用 AI 功能」
  2. 確認已輸入有效的 Gemini API 金鑰
  3. Google Translate 備用服務不支援 AI 摘要功能

Q6: 如何查看 API 使用量?

步驟

  1. 前往 Google Cloud Console
  2. 選擇你的專案
  3. 點擊左側「☰ 選單」→「APIs & Services」→「Dashboard」
  4. 點擊「Generative Language API」
  5. 查看「Quotas」和「Metrics」分頁

可查看的資訊

  • 每分鐘請求數(RPM)
  • 每天請求數(RPD)
  • Token 使用量
  • 錯誤率

Q7: 如何設定 API 用量警報?

步驟

  1. 在 Google Cloud Console 的 API 頁面
  2. 點擊「Quotas」分頁
  3. 選擇要監控的配額(例如:Requests per minute)
  4. 點擊「Create alert」
  5. 設定閾值(例如:使用量達 80%)
  6. 填寫通知信箱
  7. 點擊「Save」

Q8: 翻譯速度很慢怎麼辦?

可能原因

  • 公告內容過長(>5,000 字)
  • 網路速度較慢
  • Google API 暫時繁忙

解決方法

  1. 短期:等待翻譯完成(通常不超過 30 秒)
  2. 長期:考慮升級網路速度
  3. 替代:對於超長公告,使用 AI 摘要功能快速了解重點

Q9: 可以離線使用翻譯功能嗎?

答案:不行

原因

  • 翻譯功能需要連接 Google AI 或 Google Translate API
  • 這些服務都需要網路連線

建議

  • 在有網路的環境下使用翻譯功能
  • 翻譯後的內容會保存在頁面上,即使斷網也能查看

Q10: API 金鑰會被其他人看到嗎?

答案:不會

安全措施

  • ✅ API 金鑰僅儲存在你的瀏覽器本地
  • ✅ 不會上傳到任何伺服器
  • ✅ 不會與其他人分享
  • ✅ 只有你的瀏覽器擴充功能可以存取

最佳實踐

  • ❌ 不要將 API 金鑰貼到公開的地方(GitHub、論壇等)
  • ❌ 不要與他人分享你的 API 金鑰
  • ✅ 如果懷疑金鑰外洩,立即刪除並建立新的

📊 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 忽略規則

技術架構

Manifest V3

  • 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 解析成績頁面
  • 提取作業、考試、總成績
  • 計算百分比與比重

AI 翻譯與摘要

  • Gemini 2.5 Flash-Lite API
    • 繁體中文翻譯(Traditional Chinese Taiwan)
    • 保留段落格式的 prompt 工程
    • 禁用 thinking budget 避免 token 浪費
  • 翻譯引擎
    • 提取所有文字節點(Text Node)
    • 使用特殊分隔符合併文字
    • 完整保留 HTML 結構和屬性
    • 翻譯後將文字放回對應節點
  • Google Translate 備用
    • 免費 API 端點(無需金鑰)
    • 自動降級機制

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 項安全問題:

XSS 防護

  • HTML 消毒:所有動態插入的 HTML 內容經過 sanitizeHtml() 白名單過濾,移除 <script><iframe><svg><object><embed> 等危險標籤
  • 事件屬性移除:自動移除所有 on* 事件處理屬性(onclick、onerror 等)
  • JavaScript URI 攔截:封鎖 javascript: 協議的連結
  • 轉義輸出:所有動態文字使用 escapeHtml() 轉義後才插入 DOM

API 金鑰保護

  • Background Script 代理:Gemini API 呼叫透過 background.js 代理,content script 無法直接存取 API 金鑰
  • Console 遮蔽:API 金鑰在日誌輸出中自動遮蔽(僅顯示前 10 字元)

下載安全

  • 網域白名單:下載 URL 限制為 E3 網域(e3.nycu.edu.twe3p.nycu.edu.tw
  • 路徑穿越防護:檔名中的 ../ 會被攔截
  • URL 驗證:所有下載請求先驗證 URL 格式與網域

其他安全措施

  • IIFE 封裝:整個 content script 以立即執行函式封裝,避免全域命名空間污染
  • 條件初始化:非 E3 網站不執行 console 攔截與 window.E3Helper 掛載
  • 遞迴深度限制:renderValue 函式加入深度限制,防止堆疊溢位
  • MutationObserver 清理:加入 disconnect 機制,避免記憶體洩漏

隱私權

  • 不收集任何個人資料
  • 不追蹤使用者行為
  • 所有資料僅儲存在本地瀏覽器
  • 開源程式碼,可自行審查

關於 AI 功能

  • 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(預設翻譯服務)

常見問題

Q: 為什麼同步失敗?

A: 可能原因:

  1. 未登入 E3:請先登入 https://e3p.nycu.edu.tw/
  2. 網路問題:檢查網路連線
  3. Session 過期:重新登入 E3 後再同步

解決方法:開啟 Service Worker Console 查看詳細錯誤訊息

Q: 作業沒有顯示課程名稱?

A: 擴充功能會自動從 API 獲取課程名稱,如果仍顯示「(未知課程)」:

  1. 點擊「🔄 同步」重新同步
  2. 檢查 Service Worker Console 是否有錯誤訊息

Q: 擴充功能重新載入後無法使用?

A: 這是正常現象。當擴充功能更新時:

  1. 會自動顯示「擴充功能已更新」警告
  2. 點擊「重新整理頁面」按鈕即可

Q: 公告或信件載入很慢?

A: 公告與信件需要逐一抓取每個課程的資料,可能需要 10-30 秒。載入過程中:

  • 顯示「載入中...」提示
  • 可查看 Console 了解進度

Q: 下載的 ZIP 檔案無法開啟?

A: 可能原因:

  1. 下載過程中斷
  2. 課程檔案過大(超過 500MB)
  3. 瀏覽器限制

解決方法:

  1. 重新下載
  2. 檢查網路連線
  3. 手動下載大型檔案

Q: 翻譯功能不能使用?

A: 請確認:

  1. 未設定 Gemini API
    • 會自動使用 Google Translate 免費服務
    • 翻譯品質可能較低,但無需設定
  2. 設定 Gemini API 後仍失敗
    • 檢查 API 金鑰是否正確
    • 確認 Google AI Studio 帳號狀態
    • 查看 Console 是否有錯誤訊息(API 額度、網路問題等)
  3. 翻譯結果是簡體中文
    • 已修復,現在強制使用繁體中文
    • 請重新載入擴充功能

Q: 翻譯後連結和附件點不了?

A: 已修復!v1.3 版本重寫了翻譯引擎:

  • 完整保留所有 HTML 標籤和屬性
  • 連結 (<a> 標籤) 的 hreftarget 屬性都會保留
  • 附件、圖片、表格等元素完全不受影響
  • 段落格式與原文一致

Q: 浮動按鈕的紅色徽章沒有顯示?

A: 徽章顯示條件:

  1. 有未讀的公告或信件
  2. 有參與者變動通知
  3. 有 24 小時內到期的作業

如果沒有上述通知,徽章會自動隱藏。

開發與除錯

除錯模式

  1. 開啟 Console

    • 按 F12 開啟開發者工具
    • 切換到 Console 分頁
    • 查看 E3 Helper: 開頭的訊息
  2. Service Worker Console

    • 訪問 chrome://extensions/
    • 找到 NYCU E3 Helper
    • 點擊「Service Worker」→「檢查檢視」
    • 查看背景同步的 log
  3. Storage 檢視

    • F12 → Application → Storage → Extension Storage
    • 查看 assignmentscoursesannouncements 等資料

常用除錯指令

// 查看作業資料
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 中載入擴充功能

提交 PR 前

  1. 確保程式碼正常運作
  2. 測試所有功能
  3. 遵循現有程式碼風格
  4. 提供清楚的 commit 訊息

更新日誌

v2.1.0 (2026-04-06)

  • 🔒 全面安全加固(18 項修復)
    • XSS 防護:sanitizeHtml 白名單 + escapeHtml 轉義
    • API 金鑰保護:透過 background.js 代理 Gemini API 呼叫
    • 下載安全:網域白名單 + 路徑穿越防護
    • IIFE 封裝、條件初始化、遞迴深度限制
  • 效能優化
    • 日誌批次截斷改用 splice 替代逐條 shift
    • MutationObserver disconnect 機制
  • 🏗️ 程式碼品質
    • 移除未使用的開發文件(DEBUG.md 等)

v1.9 (2025-12-05)

  • 🐛 修復重複函數定義導致的時間顯示問題
  • 🐛 修復作業儲存競態條件(加入 debounce 機制)
  • 🎨 將所有彈窗提示改為非阻塞式 Toast 通知
  • 🎨 同步超時時加入重試按鈕
  • 🎨 優化日誌系統效能(throttling)
  • 🎨 改善信件載入的使用者回饋

v1.8 (2025-11-25)

  • 新增作業繳交狀態自動檢測功能
    • 使用 HTML 解析技術智能判斷作業是否已繳交
    • 擴大同步範圍從 7 天到 30 天,確保較舊作業也能正確檢測
  • 🐛 修復手動改變狀態後作業可能消失的問題
  • 🐛 修復已繳交作業在同步後不被保留的問題
  • 🎨 優化作業保留邏輯(未過期作業全部保留,已過期只保留已繳交)

v1.7 (2025-11-25)

  • 新增手動新增作業功能(支援自訂課程、截止時間)
  • ✨ 所有作業(包括 E3 同步作業)支援編輯和刪除
  • ✨ 課程欄位改為智能選單(整合 E3 課程與自訂輸入)
  • ✨ 新增臨時訊息提示系統
  • ✨ 自動收集課程名稱作為選項
  • 🎨 優化作業管理流程與使用體驗
  • 🐛 刪除同步作業時顯示警告提示

v1.6 (2025-11-24)

  • 新增 AI 智能翻譯功能(支援繁體中文,保留格式與連結)
  • 新增 AI 智能摘要功能
  • 新增智能通知徽章系統(浮動按鈕與擴充功能圖示)
  • ✨ 新增 24 小時緊急作業通知(紅色警示)
  • ✨ 整合 Google Gemini 2.5 Flash API
  • ✨ 新增 AI 設定頁面(API 金鑰管理)
  • ✨ 支援影片與公告附件批次下載
  • 🐛 修復未讀卡片對齊問題
  • 🐛 修復翻譯後連結與附件無法點擊問題
  • 🐛 修復非 E3 網站重新載入郵件按鈕錯誤
  • 🎨 優化使用說明文件

v1.3 (2025-01-24)

  • 新增 AI 智能翻譯與摘要功能
    • 支援 Gemini 2.5 Flash API 和 Google Translate 免費服務
    • 翻譯使用繁體中文(禁用簡體中文)
    • 完美保留段落格式、連結、附件(重寫翻譯引擎)
    • 支援中→英、英→中雙向翻譯
    • AI 摘要功能(需 Gemini API)
  • 新增智能通知系統
    • 浮動按鈕顯示未讀數量徽章(紅色圓點+數字)
    • 擴充功能圖示顯示未讀總數
    • 24小時內到期作業自動通知
    • 整合作業通知、參與者變動、緊急提醒
  • 🎨 UI/UX 改進
    • 未讀公告/信件顯示紅色圓點標記(絕對定位,不影響排版)
    • 浮動按鈕位置優化(右上角固定定位)
  • 🐛 修復「焦點綜覽」課程名稱問題
    • 新增三層課程名稱驗證機制
    • 過濾無效的頁面標題(焦點綜覽、通知、時間軸等)
    • 保留的「已繳交」作業會自動清理無效課程名稱

v1.2 (2025-01-23)

  • 🐛 修復重新載入信件按鈕在非 E3 網站無效的問題
    • 按鈕現在會在所有網站顯示
    • 在非 E3 網站點擊時,會透過背景自動連接到 E3 載入資料
    • 新增背景載入機制,使用已開啟的 E3 標籤頁或自動開啟新標籤頁
    • 改善使用者體驗,無需手動切換到 E3 網站
  • 📝 新增完整的使用說明與技術文件
  • 📋 新增 CHANGELOG.md 詳細記錄版本變更

v1.1 (2025-01-17)

  • ✨ 新增側邊欄介面,支援跨網頁使用
  • ✨ 新增作業倒數與狀態管理功能
  • ✨ 新增公告與信件整合(支援 dcpcmail)
  • ✨ 新增成績查詢功能
  • ✨ 新增快速下載教材功能
  • ✨ 新增自動同步功能(每小時)
  • 🐛 修復作業課程名稱顯示問題
  • 🐛 修復 Extension Context Invalidated 錯誤
  • 🎨 改進 UI/UX 設計,更加美觀易用

v1.0 (2025-01-14)

  • ✨ 新增一鍵前往作業按鈕
  • ✨ 支援動態載入的內容(MutationObserver)
  • ✨ 紫色漸層按鈕設計

📋 完整的更新記錄請參閱 CHANGELOG.md

授權

MIT License

聯絡方式

About

Chrome extension for NYCU E3 learning platform — sidebar assistant, assignment countdown, announcements, grades, AI translation, batch download

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors