Emoji Reactions
投稿に絵文字リアクションボタンを追加します。読者ごとに 1 リアクション、カウント表示は任意、Cookie も生の IP も保存しません。
プラグイン
Emoji Reactions
投稿に絵文字リアクションボタンを追加します。読者ごとに 1 リアクション、カウント表示は任意、Cookie も生の IP も保存しません。
説明
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 項目です。キーは小文字で始めます。カウントはキーごとに保存されます。キーの名前を変えると新しいボタンとして始まり、削除すると非表示になりますがカウントは残ります。
よくある質問
サイトにボタンが表示されません
Reactions.astroが投稿テンプレートに追加されているか確認してください。プラグイン自体は何も表示しません。- ブラウザーのコンソールを開いてください。失敗は
[reactions] state: HTTP 403 CSRF_REJECTED ...のように記録されます。 - パッケージをインストールせずに
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-accentCSS 変数を追加し、post.data.idを渡す方法を文書化。pnpm run testはビルドで終わるようになり、dist/に常に公開ルートの宣言が含まれます。
0.1.0
- 初期バージョン(レジストリには未公開)。