Emoji Reactions
為你的文章加入表情回應按鈕。每位讀者只能回應一次,可選擇顯示數量,不使用 Cookie,也不儲存原始 IP。
外掛
Emoji Reactions
為你的文章加入表情回應按鈕。每位讀者只能回應一次,可選擇顯示數量,不使用 Cookie,也不儲存原始 IP。
說明
Reactions 會為你的文章加入表情回應按鈕(預設是 💗 🤔 😗)。 每位讀者對每篇文章只能選擇一個回應:再次點擊會取消,點擊另一個則會切換。
功能
- 最多 6 個按鈕,在管理頁面中設定(
key=emoji:label)。 - 可在每個表情旁顯示標籤,也可公開顯示數量。
- 管理頁面會列出回應最多的 10 篇文章。
- 管理頁面跟隨管理後台的語言(英文或日文)。
- 無需額外資料庫:資料儲存在外掛自己的 EmDash 儲存空間中。
- 不要求任何權限,也不要求網路存取。
隱私
- 讀者透過其 IP 位址和 User-Agent 的 SHA-256 雜湊值(附帶每個網站隨機的鹽)來識別。IP 和 User-Agent 本身絕不會被儲存。
- 每次投票儲存:文章 ID、雜湊值、所選回應和時間戳記。不使用 Cookie。
注意: 外掛本身不會渲染任何內容。安裝後,請把
Reactions.astro元件加入你的文章範本中(參見安裝)。
需求
- Cloudflare(D1)上的 EmDash 1.x
- Workers Paid 方案(沙盒外掛在 Worker Loader 繫結中執行)
安裝
1. 安裝外掛
透過 Open in EmDash 從本頁安裝 Reactions,或從原始碼建置:
pnpm install
pnpm run build # dist/
從原始碼建置時,把該套件加入你的網站(pnpm add file:../emdash-plugin-emoji-reactions),並在 astro.config.mjs 的 sandboxed: [reactions] 下列出它。
2. 啟用外掛沙盒
沙盒外掛需要 Worker Loader 繫結。在 wrangler.jsonc 中(範本裡已被註解掉):
"worker_loaders": []
確保 src/worker.ts 匯出了 PluginBridge(*-cloudflare 範本已經匯出),並且 astro.config.mjs 設定了 sandboxRunner: sandbox()。
3. 把按鈕加入文章範本中(必要)
把 site-snippets/Reactions.astro 複製到 src/components/,並放在文章頁面上:
---
import Reactions from "../../components/Reactions.astro";
// `post` comes from getEmDashEntry()
---
使用 post.data.id(資料庫 ID),不要使用 post.id(slug)。文章重新命名時 slug 會改變,而翻譯後的 slug 含有 /,外掛會拒絕它。
屬性:contentId(必填)、heading(空字串則隱藏)、label(按鈕群組的無障礙名稱)。在 CSS 中設定 --rx-accent 以符合你的強調色。
4. 選擇你的按鈕
開啟管理後台側邊欄中的 Reactions 並編輯該欄位,例如:
love=💗:Love, hmm=🤔:Hmm, whistle=😗:Whoa
最多 6 項。鍵以小寫字母開頭。數量依鍵儲存:重新命名鍵會開始一個新按鈕;移除一個鍵會隱藏它,但保留其數量。
常見問題
按鈕沒有出現在我的網站上
- 檢查
Reactions.astro是否已加入你的文章範本中。外掛本身不會渲染任何內容。 - 開啟瀏覽器主控台。失敗訊息會以
[reactions] state: HTTP 403 CSRF_REJECTED ...的形式記錄。 - 如果你是把
dist/複製到網站中,而不是安裝套件,請檢查dist/index.mjs是否包含"routes"。沒有它,EmDash 會把公開路由當作私有路由並拒絕請求。
我能隱藏數量嗎?
可以。在管理頁面中關閉 Show counts。此後公開 API 也不會包含數量,因此無法從頁面中讀取。它們仍會繼續被統計,你在管理頁面中依然可以看到。
我家裡或辦公室的兩個人被算作一位讀者
使用同一個 IP 且使用同一瀏覽器的讀者會被視為一個人。這只是一個隨意的回應按鈕,而不是投票系統。
有人能刷這個按鈕嗎?
每位讀者對每篇文章只有一個回應,因此重複點擊只會切換它。不過這些路由是公開的。如有需要,請為 /_emdash/api/plugins/reactions/react 加入一條 Cloudflare 速率限制規則。
它能在本機開發中使用嗎?
可以。當沒有可用的用戶端 IP 時,瀏覽器會改為傳送儲存在 localStorage(rx-visitor)中的隨機 ID。
安全性
回報漏洞
請透過 GitHub 私密漏洞回報私下回報安全問題, 不要發布在公開的 issue 中。
外掛可以存取什麼
- 不要求任何權限,也不要求網路存取。 外掛無法讀取或變更其自身儲存空間之外的你的內容、媒體、使用者或設定,也無法呼叫其他服務。
- 它只把資料儲存在自己的 EmDash 儲存空間中:每篇文章的數量、每次投票一筆紀錄,以及它的按鈕設定。
儲存的讀者資料
- 讀者 IP 位址和 User-Agent 的截斷 SHA-256 雜湊值,並結合每個網站隨機的鹽。IP 位址和 User-Agent 本身從不被儲存。
- 每次投票:文章 ID、該雜湊值、所選回應和時間戳記。不使用 Cookie。
公開路由
state(GET)和 react(POST)是公開的。兩者都會驗證輸入:contentId 必須符合 [A-Za-z0-9_\-:.],回應必須是已設定的鍵,請求本文上限為 1 KB。管理路由是私有的。為限制濫用,請為 /_emdash/api/plugins/reactions/react 加入一條 Cloudflare 速率限制規則。
更新日誌
0.2.1 — 2026-10-18
- 加入了註冊表圖示。
0.2.0 — 2026-10-15
在 EmDash 外掛註冊表上的首次發布。
- 管理頁面中新增 Show labels 和 Show counts 開關。標籤預設隱藏,並保留為工具提示和螢幕閱讀器文字。隱藏數量後,公開 API 也不會包含它們。
- 需要 EmDash 1.x。按鈕設定移至
ctx.settings;在 0.1.x 中儲存的按鈕會被沿用。 - 管理頁面跟隨管理後台的語言(英文或日文)。預設標籤現在為英文(
Love/Hmm/Whoa);鍵保持不變,因此現有數量仍然保留。 Reactions.astro:把失敗訊息記錄到瀏覽器主控台,而不是悄悄隱藏;新增label屬性和--rx-accentCSS 變數;並記載了傳入post.data.id的用法。pnpm run test現在以建置結束,因此dist/始終包含公開路由宣告。
0.1.0
- 初始版本(未發布到註冊表)。