Pukiwikiのスパム対策akismet.inc.phpプラグイン
sonotsさんが2008年頃に作られたakismet.inc.phpが、recaptcha.netの廃止などによって動作しなくなっていたので、Google recaptcha v2に対応させてみました。Google reCaptchaは現在は月間1万リクエストまでは無料で利用できます*1。数ヶ月前まで無料で利用できる上限が月間100万リクエストありましたが、大幅に縮小されました*2。
プラグイン内の設定で、akismetだけ使う、またはGoogle reCaptcha v2だけ使う、あるいは両方とも使う(akismetがスパムの可能性ありと判定したものだけreChaptchaの画像認証をさせる)ということが切り替えられます。
無理矢理動かしているので、色々と細かいところは動作確認できていません。v2.0.2はPHP7.4〜8.2で動くことを確認しています。
ダウンロード
プラグイン本体は下記GitHubからダウンロードして、プラグインフォルダにakismet.inc.phpを設置してください。こちらから入手することも可能です。また、Pukiwiki本体のlib/pukiwiki.phpの修正が必要です。
インストール
WordPress API Key の取得
- Akismet は元々 WordPress 用プラグインとして作られたもので WordPress のユーザ登録をする必要があります。
- 以下のページから WordPress.com ユーザ登録をおこなうとAPIキーを取得できます。(基本的に無料ですが、商用に利用する場合は有料となります。)
- http://wordpress.com/api-keys/img → http://wordpress.com/signup/img
reCAPTCHA API Key の取得
- SPAM 取り消し報告をする際に、Google reCAPTCHAを利用した CAPTCHA(歪曲文字)認証を導入しています。Google reCAPTCHA v2に対応しています。v3には対応していません。Pukiwikiで使用するにはv2のほうが扱いやすいかと思います(→reCAPTCHA v2 と v3 の違い)。
- 以下のページで設置予定サイトのドメインを入力すると、APIキー(publickey, privatekey)を取得できます。(無料です)
- https://www.google.com/recaptcha/about/
lib/pukiwiki.phpの修正
下記の場所に // Akismet Spam filtering 以下のif文を付け加えます。
if (isset($vars['cmd'])) { $is_cmd = TRUE; $plugin = & $vars['cmd']; } else if (isset($vars['plugin'])) { $plugin = & $vars['plugin']; } else { $plugin = ''; } // Akismet Spam filtering (←この部分以下を追記) if (exist_plugin('akismet')) { // require_once PluginAkismet::spamfilter(); }
recaptcha.jsの読み込み→不要になりました
本体のスキンで下記の行を読み込んでおきます。
ver2.0.3からはスキンでapi.jsを呼び出さなくてもakismet.inc.php内で呼び出せるようになったので、スキンに以下のapi.jsを呼び出す行を埋め込む必要はなくなりました。
<script src="https://www.google.com/recaptcha/api.js" defer></script>
これで、ページ編集などのときにakismet.inc.phpプラグインの基準に達した書き込みをするとGoogle reCaptchaによる画像認証が表示されます。
改修履歴
ver2.0.2(2022.12.3)
当初はPHP7.4まででしか動作しませんでしたが、2022.12.3に公開したv2.0.2からはPHP8系でも動作可能になりました。
- static functionの前に'static'の単語を挿入しました(3箇所)。
- function AkismetHttpClientやfunction Akismetをfunction __constructに修正しました。
- 996行目のisError(SERVER_NOT_FOUND)をisError('SERVER_NOT_FOUND')に修正しました。
ver2.0.3(2024.3.30)
ver2.0.3からはスキンでapi.jsを呼び出さなくてもakismet.inc.php内で呼び出せるようになったので、スキンにapi.jsを呼び出す行を埋め込む必要はなくなりました。
この記事に対するコメント
このページには、まだコメントはありません。
*1 https://cloud.google.com/recaptcha-enterprise/docs/compare-tiers
*2 https://internet.watch.impress.co.jp/docs/yajiuma/1565437.html
更新日:2024-03-30 閲覧数:528 views.