Emoji Reactions

投稿に絵文字リアクションボタンを追加します。読者ごとに 1 リアクション、カウント表示は任意、Cookie も生の IP も保存しません。

プラグイン

Emoji Reactions

投稿に絵文字リアクションボタンを追加します。読者ごとに 1 リアクション、カウント表示は任意、Cookie も生の IP も保存しません。

  • カテゴリー: reactions
  • ステータス: 利用可能
  • バージョン: 0.2.1
  • 価格: 不明
  • 提供元: 公式プラグインレジストリ
  • 導入方法: レジストリのサンドボックスプラグイン
  • 確認日: 2026-10-21

説明

Reactions は、投稿に絵文字リアクションボタン(デフォルトは 💗 🤔 😗)を追加します。 読者は投稿ごとにリアクションを 1 つ選べます。もう一度クリックすると取り消され、別のものをクリックすると切り替わります。

機能

  • 最大 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(スラッグ)は使わないでください。投稿の名前を変えるとスラッグも変わり、翻訳されたスラッグには / が含まれるため、プラグインはそれを拒否します。

プロパティ: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 からも除外されるため、ページから読み取ることはできません。カウント自体は続けられ、管理ページではあなたに見えるままです。

自宅やオフィスの 2 人が 1 人の読者として数えられます

同じ IP の背後で同じブラウザーを使っている読者は、1 人として扱われます。これは気軽なリアクションボタンであり、投票システムではありません。

ボタンを連打して荒らされませんか?

読者は投稿ごとに 1 つのリアクションしか持てないため、連続クリックは切り替わるだけです。ただし、ルートは公開されています。必要なら、/_emdash/api/plugins/reactions/react に Cloudflare のレート制限ルールを追加してください。

ローカル開発でも動きますか?

はい。クライアント IP が取得できない場合は、代わりにブラウザーが localStorage(rx-visitor)に保持したランダムな ID を送信します。

セキュリティ

脆弱性の報告

セキュリティ上の問題は、公開の issue ではなく、 GitHub のプライベートな脆弱性報告から非公開で報告してください。

プラグインがアクセスできるもの

  • 権限もネットワークアクセスも要求しません。 プラグインは、自身のストレージ以外にあるコンテンツ、メディア、ユーザー、設定を読み取ったり変更したりできず、他のサービスを呼び出すこともできません。
  • データは自身の EmDash ストレージにのみ保存されます。投稿ごとのカウント、投票ごとの 1 レコード、そしてボタンの設定です。

読者について保存されるデータ

  • 読者の 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

  • 初期バージョン(レジストリには未公開)。