HTTPポストバック
ウェブサイト・ランチャー・Minecraft以外のゲームに最適。Minecraftでは Votifier の代替(またはサイト側報酬の追加)としても使えます。
- このリストの全ゲームで利用可能
- ポイント・クールダウン・ログは自分で管理
- 公開 HTTPS エンドポイントが必要
設定パス: ダッシュボード → サーバー編集 → 投票報酬(Votifier は Minecraft 詳細)。
プレイヤーが投票リンクを開く(できれば ?p=USERNAME でフォームを事前入力)。
投票を送信。IPごと(ログインアカウントごと)に24時間のクールダウンを適用。報酬設定がある場合はユーザー名 / パラメータが必須。
報酬システムへ通知: ポストバックURLへの HTTP GET、および/または Minecraft ホストへの Votifier パケット——同じパラメータと投票者のIPを使用。
あなたが報酬を付与。先方側の配信失敗はここに記録されますが、投票は消えません。
ウェブサイト・ランチャー・Minecraft以外のゲームに最適。Minecraftでは Votifier の代替(またはサイト側報酬の追加)としても使えます。
Minecraft向けの推奨方法。ゲーム内クレート・鍵・リスナープラグインに最適。Votifier ポートへ TCP 接続します。
Minecraftではまず Votifier を。HTTPポストバックは任意(または追加)。有効な各チャネルは投票後に独立して動作します。
投票成功後、プレイヤーパラメータとIP付きであなたのURLをリクエストします。スクリプト側で「投票済み」を記録し、ポイントやアイテムを付与します。
ファイアウォールとポストバックスクリプトで、このサイトの公開アウトバウンドIPを許可してください。ほかの送信元は拒否。HTTPS推奨。
ダッシュボード → サーバー編集 → 投票報酬 → ポストバックURL。
https://YOURDOMAIN/postback.php
投票ページ到着時に各プレイヤーを識別できるよう、パラメータを付けます。
/GAME/server/SLUG/vote?p=PARAMETER
| 項目 | ルール |
|---|---|
PARAMETER / p_resp |
英数字・_・- のみ · 最大32文字 · ユーザー名・アカウントID・任意の管理ID |
ip |
このリストから見た投票者の IPv4 または IPv6(プロキシ対応時は考慮) |
| 事前入力クエリ | ?p= または ?username= |
成功時のみ。有効な投票が完了していない場合はリクエストを送りません。
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 はリスト上で使われたアドレスです。
報酬サイト側でホスト(この投票リスト上である必要はありません)。本番前に 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';
投票を Minecraft サーバーへ直接プッシュできます。リスナープラグインが報酬コマンドを実行します。
ファイアウォール: このサイトの公開IPから Votifier ポート(既定 8192)への着信 TCP を許可。可能ならインターネット全体への公開は避けてください。
プレイヤーが投票ページで Minecraft ユーザー名を入力(または ?p=Steve で到着)。
このリストで投票が成功。
Votifier ホスト/ポートへ接続し、投票パケットを配信。
リスナーがクレート・鍵・マネーなどを付与。
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
プロトコル 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 のデバッグを有効にして再試行。 |
配信試行は vote_reward_logs(ok / fail / skipped)に記録。コールバック失敗でもリスト上の投票は巻き戻りません。
いいえ。ゲストも投票できます。ログインアカウントも、不正防止のため同じ24時間クールダウン規則を共有します。
ポストバックURLや Votifier を設定している場合、誰に報酬を渡すか伝えるパラメータが必要です。報酬未設定ならユーザー名は任意のままです。
はい。投票成功後に両方とも動きます。失敗は互いに独立です。
公開の http(s) URLである必要があります。localhost、.local、プライベートIP(例: 10.*、192.168.*)、認証情報付きURLはブロックされます。
このリストで投票が成功したか確認。ポストバックログまたは NuVotifier のデバッグ出力を確認。ファイアウォール許可と、ユーザー名がゲーム内アカウントと一致するかを確認。リストのクールダウンは24時間。独自の報酬クールダウンは別に設定できます。
A–Z、a–z、0–9、_、- のみ。それ以外は除去。パラメータは32文字以内。