投票報酬

Voting Check

JoinGameServers で掲載への投票が成功したあと、プレイヤーに報酬を渡す方法です。

設定パス: ダッシュボード → サーバー編集 → 投票報酬(Votifier は Minecraft 詳細)。

01

仕組み

  1. プレイヤーが投票リンクを開く(できれば ?p=USERNAME でフォームを事前入力)。

  2. 投票を送信。IPごと(ログインアカウントごと)に24時間のクールダウンを適用。報酬設定がある場合はユーザー名 / パラメータが必須。

  3. 報酬システムへ通知: ポストバックURLへの HTTP GET、および/または Minecraft ホストへの Votifier パケット——同じパラメータと投票者のIPを使用。

  4. あなたが報酬を付与。先方側の配信失敗はここに記録されますが、投票は消えません。

方法を選ぶ

HTTPポストバック

ウェブサイト・ランチャー・Minecraft以外のゲームに最適。Minecraftでは Votifier の代替(またはサイト側報酬の追加)としても使えます。

  • このリストの全ゲームで利用可能
  • ポイント・クールダウン・ログは自分で管理
  • 公開 HTTPS エンドポイントが必要
ポストバック PHP →
Minecraft向け

Minecraft Votifier

Minecraft向けの推奨方法。ゲーム内クレート・鍵・リスナープラグインに最適。Votifier ポートへ TCP 接続します。

  • Minecraft掲載のみ
  • クラシック RSA または NuVotifier v2 トークン
  • 開放ポート+ファイアウォール許可が必要
Minecraft Votifier →

Minecraftではまず Votifier を。HTTPポストバックは任意(または追加)。有効な各チャネルは投票後に独立して動作します。

クイックスタート

  1. ログインしてダッシュボードを開く。
  2. 承認済みサーバーの掲載を編集。
  3. ポストバックURLを設定、および/または Minecraft 詳細で Votifier を有効化。
  4. 編集フォームからインセンティブ投票リンクをコピー(末尾は ?p=USERNAME)。
  5. そのリンクをサイトや Discord に設置し、プレイヤーごとに USERNAME を差し替え。
  6. テスト投票して、報酬が届くことを確認。
02

ポストバック PHP

投票成功後、プレイヤーパラメータとIP付きであなたのURLをリクエストします。スクリプト側で「投票済み」を記録し、ポイントやアイテムを付与します。

ファイアウォールとポストバックスクリプトで、このサイトの公開アウトバウンドIPを許可してください。ほかの送信元は拒否。HTTPS推奨。

1. ポストバックURLを設定

ダッシュボード → サーバー編集 → 投票報酬 → ポストバックURL。

https://YOURDOMAIN/postback.php
  • ファイル名は任意——スタックに合わせたパスで構いません。
  • 公開の http/https URLのみ受付。localhost・プライベートLAN IP・URL認証情報は拒否(SSRF対策)。
  • リダイレクトは少数のみ追従し、数秒でタイムアウトして投票を速く保ちます。

2. インセンティブ投票リンクを作る

投票ページ到着時に各プレイヤーを識別できるよう、パラメータを付けます。

/GAME/server/SLUG/vote?p=PARAMETER
項目 ルール
PARAMETER / p_resp 英数字・_・- のみ · 最大32文字 · ユーザー名・アカウントID・任意の管理ID
ip このリストから見た投票者の IPv4 または IPv6(プロキシ対応時は考慮)
事前入力クエリ ?p= または ?username=

3. 投票後に呼び出す内容

成功時のみ。有効な投票が完了していない場合はリクエストを送りません。

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
インセンティブリンク こちらのコールバック
/minecraft-server/server/your-server-slug/vote?p=1234 …/postback.php?p_resp=1234&ip=123.123.123.123
/minecraft-server/server/your-server-slug/vote?p=Razor …/postback.php?p_resp=Razor&ip=123.123.123.123

ポストバックに p_resp=Razor で届いたとき、プレイヤー Razor が投票済みです。ip はリスト上で使われたアドレスです。

スクリプト側でやること

  • リクエストがこのリストの公開IPから来ていることを確認。
  • p_resp と ip をサニタイズ(生入力を信用しない)。
  • データベースにアカウント / キャラクターが存在することを確認。
  • 24時間より厳しい報酬クールダウンが必要なら、独自に適用。
  • ポイント・コイン・アイテムを付与し、ログを残し、HTTP 200 を返す。

postback.php の例

報酬サイト側でホスト(この投票リスト上である必要はありません)。本番前に VOTE_LIST_IP をこのサイトのアウトバウンド公開IPに設定してください。

<?php
/**
 * Example vote postback receiver for YOUR game website / CMS.
 *
 * Configure this URL on your listing under Dashboard → Edit server → Vote Rewards.
 * This list will call it ONLY after a successful vote:
 *
 *   https://yoursite.com/postback.php?p_resp=PARAMETER&ip=USERIP
 *
 * PARAMETER is the username / account id the player entered on the vote form
 * (or the value from ?p= on your incentive voting link).
 *
 * Docs: /voting-check
 */

define('DEBUG', 0); // set to 1 to write _postback.log
define('LOG_FILE', __DIR__ . '/_postback.log');

/**
 * Only accept callbacks from the vote list's public IP.
 * Leave empty to skip the allowlist (not recommended in production).
 *
 * Example: define('VOTE_LIST_IP', '203.0.113.10');
 */
define('VOTE_LIST_IP', '');

$ipRequest = $_SERVER['HTTP_CF_CONNECTING_IP']
    ?? (isset($_SERVER['HTTP_X_FORWARDED_FOR'])
        ? trim(explode(',', (string) $_SERVER['HTTP_X_FORWARDED_FOR'])[0])
        : null)
    ?? $_SERVER['REMOTE_ADDR']
    ?? '';
$ipRequest = trim((string) $ipRequest);

if (VOTE_LIST_IP !== '' && $ipRequest !== VOTE_LIST_IP) {
    if (DEBUG) {
        error_log(date('[Y-m-d H:i] ') . "[Invalid] Request from {$ipRequest}" . PHP_EOL, 3, LOG_FILE);
    }
    http_response_code(403);
    exit('Forbidden');
}

if (DEBUG) {
    error_log(date('[Y-m-d H:i] ') . "[OK] Valid callback: {$ipRequest}" . PHP_EOL, 3, LOG_FILE);
}

// Clean parameters from the vote list (letters, numbers, underscore, hyphen).
$p = preg_replace('/[^A-Za-z0-9_\-]+/', '', (string) ($_GET['p_resp'] ?? '')) ?? '';
$userIp = preg_replace('/[^0-9a-fA-F:\.]+/', '', (string) ($_GET['ip'] ?? '')) ?? '';

if ($p === '') {
    http_response_code(400);
    exit('Missing p_resp');
}

if (DEBUG) {
    error_log(date('[Y-m-d H:i] ') . "[GET] Parameters [p_resp]={$p} [ip]={$userIp}" . PHP_EOL, 3, LOG_FILE);
}

// ---------------------------------------------------------------------------
// Connect to your database, verify account $p exists, enforce your own
// cooldown if needed, then grant vote points / items to $p (voted from $userIp).
// We send p_resp + ip ONLY when that player successfully voted on the list.
// ---------------------------------------------------------------------------

http_response_code(200);
echo 'OK';
03

Minecraft Votifier

投票を Minecraft サーバーへ直接プッシュできます。リスナープラグインが報酬コマンドを実行します。

ファイアウォール: このサイトの公開IPから Votifier ポート(既定 8192)への着信 TCP を許可。可能ならインターネット全体への公開は避けてください。

  1. プレイヤーが投票ページで Minecraft ユーザー名を入力(または ?p=Steve で到着)。

  2. このリストで投票が成功。

  3. Votifier ホスト/ポートへ接続し、投票パケットを配信。

  4. リスナーがクレート・鍵・マネーなどを付与。

Minecraft 詳細で Votifier を有効化し、NuVotifier v2 または Classic を選び、ホスト・ポート・トークンまたは RSA公開鍵を入力。

NuVotifier(クラシック RSA とプロトコル v2)またはクラシック Votifier と、Minecraft バージョン向けリスナー(GAListener、SuperbVote、または独自)を導入。

Classic / v1: public.key の全文を貼り付け。ホストとポートは config.yml から。接続確認中は debug: true、その後はオフに。

host: YOUR_PUBLIC_IP
port: 8192
debug: true

パケット上のリスト識別名: JoinGameServers

04

NuVotifier v2

プロトコル v2 は RSA の代わりに共有トークンとワンタイムチャレンジを使います。このリストのサービス名にトークンを対応させるか、デフォルトトークンを使います。

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

ワイヤ形式: TCP接続 → 挨拶 VOTIFIER 2 <challenge> を読む → JSONペイロード(username, serviceName, timestamp ms, address, challenge)→ Base64(HMAC-SHA256(payload, token)) → magic 0x733A + 長さ + JSON {signature, payload}。{"status":"ok"} を期待。

症状 想定原因
NuVotifier v2 サーバーではない 挨拶にチャレンジがない — Classic を使うか、NuVotifier を更新して v2 を有効化。
署名無効 / 不明なサービス トークン違い、またはサービス名未対応。リストのサービス名を追加するかデフォルトを使用。
接続失敗 / タイムアウト ホスト/ポート誤り、Votifier 停止、またはこのリストのIPがファイアウォールで遮断。
応答なし プロキシ/プラグイン干渉の可能性。NuVotifier のデバッグを有効にして再試行。
05

テストチェックリスト

  1. 検証エラーなしで掲載設定を保存。
  2. インセンティブリンクを開く — ユーザー名欄が ?p= から事前入力されること。
  3. 1回投票。成功状態が出ること。24時間以内の2回目はブロックされること。
  4. ポストバック確認: 受信側で DEBUG を有効にし、p_resp と ip が届くこと。
  5. Votifier 確認: debug true で、Minecraft コンソールにユーザー名とこのリストのサービス名の着信投票が出ること。
  6. ゲーム内またはサイト報酬を確認。届かない場合はリスナー側を修正——リスト上の投票は残ります。

配信試行は vote_reward_logs(ok / fail / skipped)に記録。コールバック失敗でもリスト上の投票は巻き戻りません。

06

FAQ・トラブルシュート

いいえ。ゲストも投票できます。ログインアカウントも、不正防止のため同じ24時間クールダウン規則を共有します。

ポストバックURLや Votifier を設定している場合、誰に報酬を渡すか伝えるパラメータが必要です。報酬未設定ならユーザー名は任意のままです。

はい。投票成功後に両方とも動きます。失敗は互いに独立です。

公開の http(s) URLである必要があります。localhost、.local、プライベートIP(例: 10.*、192.168.*)、認証情報付きURLはブロックされます。

このリストで投票が成功したか確認。ポストバックログまたは NuVotifier のデバッグ出力を確認。ファイアウォール許可と、ユーザー名がゲーム内アカウントと一致するかを確認。リストのクールダウンは24時間。独自の報酬クールダウンは別に設定できます。

A–Z、a–z、0–9、_、- のみ。それ以外は除去。パラメータは32文字以内。