Emoji Reactions

為你的文章加入表情回應按鈕。每位讀者只能回應一次,可選擇顯示數量,不使用 Cookie,也不儲存原始 IP。

外掛

Emoji Reactions

為你的文章加入表情回應按鈕。每位讀者只能回應一次,可選擇顯示數量,不使用 Cookie,也不儲存原始 IP。

  • 分類: reactions
  • 狀態: 可用
  • 版本: 0.2.1
  • 價格: 未知
  • 來源: 官方外掛註冊表
  • 安裝方式: 註冊表沙盒外掛
  • 核實日期: 2026-10-21

說明

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 項。鍵以小寫字母開頭。數量依鍵儲存:重新命名鍵會開始一個新按鈕;移除一個鍵會隱藏它,但保留其數量。

常見問題

按鈕沒有出現在我的網站上

  1. 檢查 Reactions.astro 是否已加入你的文章範本中。外掛本身不會渲染任何內容。
  2. 開啟瀏覽器主控台。失敗訊息會以 [reactions] state: HTTP 403 CSRF_REJECTED ... 的形式記錄。
  3. 如果你是把 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-accent CSS 變數;並記載了傳入 post.data.id 的用法。
  • pnpm run test 現在以建置結束,因此 dist/ 始終包含公開路由宣告。

0.1.0

  • 初始版本(未發布到註冊表)。