PukiWikiのコメントをFacebookコメントに変更して実装したが、PukiWikiとしてメールフォームがあれば、専用のページを作成して各種お問い合わせを受け付けることが可能だ。
確かにFacebookページのページプラグインを導入してFacebookページからメッセージを受けることも可能だが、その場合は「Facebookアカウントを持っているサイト訪問者」に限定される。そこで、フォームメールを設置してスパム対策までを実装する。
前回の記事と同様にサブドメインを連番で用意してあるので、今回はmuseum-06サブドメインの内容をmuseum-07サブドメインにコピーし、検証しながら作業を進めた。
※2019/06/01追記
PukiWiki1.5.2用スパムフィルタspam_filter.phpをreCAPTCHA(v2およびv3)に正式対応させたため、配布用のZIPファイルの内容が一部変更になっている。そのため、ソースの行数に若干の変化があるので、この記事を読んでspam_filter.phpを導入する場合は留意されたい。
※2019/12/03追記
レスポンシブデザインに対応した最新のスパムフィルタ対応メールフォームプラグインに関しては、次の記事を参照のこと。
Google AdSenseが仕様変更!?
最初に提示した「私が実現したいWikiの要件」をクリアして来たので、「いよいよアフィリエイトだな (`ω´)グフフ 」とか思っていた。やるなら手始めにGoogle AdSense(以下、「アドセンス」と略)から、と思っていたのだが、なんと!アドセンスの仕様が変更され「サイトごとに審査」が実施されるのだとか。Σ(゚Д゚ノ)ノ
仕様変更部分や、審査にパスするポイント等に関しては、次のサイトを参照して欲しい。
ザックリ簡単に言えば、アドセンスの審査にパスするには
- サイトのコンセプトにあった独自性のある質の高い記事
- プライバシーポリシーページの設置
- 運営者情報ページの設置
- お問い合わせページの設置
などが必要であるらしい。(´ヘ`;) うーむ。
1.に関しては単純に「頑張る」しかないし、2.に関してはFacebookでファンページ(サイト用のページ)を作成する際にも求められるので、今どきは当たり前なのだろう。
3.と4.に関しては必須ではないだろうが、Googleで「ウェブマスター向けガイドラインの基本方針」を決めており、「ユーザーの利便性を最優先に考慮」し「ユーザーをだますようなことをしない」サイトであることの「担保」になるのだと思う。
本サイトでも「お問い合わせ」「プライバシーポリシー」「プロフィール」を固定ページとして持っており、アドセンスの仕様が変更になっても広告が供給されているので、今のところ問題はないらしい。実際、本サイトのような拙いサイトでも、アドセンスでレンタルサーバの月額費用を賄ってお釣りが来るぐらいの収入は得ていたりする。
4.に関しては、PukiWikiでメールフォームを設置しないとクリア出来ないため、(当初はURL短縮の検証にと思っていたが)プラグインを導入して設置しようと思う。
メールフォームを設置するには?
PukiWiki公式サイトの「自作プラグイン」にpkwkmail.inc.phpページがあるので、そこから最新のプラグイン(執筆時点は1.0.0b)をダウンロードする。基本的な使い方はpkwkmail.inc.phpページを参照のこと。
サイトのリンクからプラグインをダウンロードし、ローカルの作業フォルダに解凍する。
解凍したpkwkmail.inc.phpファイルを「plugin」フォルダにFTPする。ファイルをFTPしたら、ファイルのパーミッションを「644」に変更しておく。
※pkwkmail2.inc.phpについて
PukiWiki公式サイトにpkwkmail.inc.phpの後継プラグインとしてpkwkmail2.inc.phpがあるが、対応するPukiWikiのバージョンが古いせいなのか?とんだ大バグ野郎で、私は検証するのに時間にして丸2日ほどかかった。採用しなかった理由は次の通り。
- 「pukiwiki.ini.phpで$modifierとして設定されている人を」云々
→$modifierはサイトの編集者の名前(日本語OK)だよね? - 「BASIC認証で」云々
→PukiWikiは標準でForm認証なのに?わざわざ.htaccessでBASIC認証させろと?? - 「:config/plugin … 以下の wiki ページに書き込むので」云々
→PukiWiki1.4系ではページの先頭に「:」を付けたカテゴリー機能があり、それを利用してフォームメールのパラメータを保存するらしいが、そのページをBASIC認証して・・・てなコトらしい(そしてpukiwiki.ini.phpの$non_listで隠しページにすることを推奨している?) - 設置できるメールフォームの自由度がなさ過ぎ(致命的)
→苦労して導入する意味がまったく無い
やってみたい人はどうぞ。「PukiWikiのプラグインの構造を知る」という意味では勉強になるとは思うが、オススメはしない。
メールフォームの設置
実際に「お問い合わせ」ページを新規に作成し、メールフォームを設置しようと思う。
その前に、pukiwiki.ini.phpの設定を変更する必要がある。具体的には58行目付近の「PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK」の値を「1」から「0」に変更する。
pukiwiki.ini.php
// #memo(This makes '#memo(foo)' to this)
define('PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK', 0); // 1 = Disabled
設定を修正して保存したらファイルをFTPする。
FTPが完了したら、図のように「ログイン」リンクをクリックしてPukiWikiにログインする。
ログイン後、「新規」リンクをクリックして図のように「お問い合わせ」ページを新規作成する(「編集」ボタンクリック)。
図のように「お問い合わせ」ページを記述する。
メールフォームの内容はpkwkmail.inc.phpページの記述を参考に、工夫してみるのが良いだろう。「ページの更新」ボタンをクリックしてページを更新する。
ちなみに私の記述例は次の通りだ。
「お問い合わせ」ページ記述例
* お問い合わせ
-当サイトの内容についてのお問い合わせ等はこちらからお願いします
-お問い合わせ内容によっては必ずしもお返事を約束するものではありません
-多忙により、お返事が遅くなる場合があります
#pkwkmail{{
attr = 'お名前','text','1','','','(20)'
attr = 'ふりがな','text','0','','','(20)'
attr = 'メールアドレス','email','1','',''
attr = '性別','radio-br','1','(男性,女性)'
attr = '件名','option','1','(,お問い合わせ,コンテンツについて,プライバシーポリシーについて, その他)',''
attr = 'メッセージ本文','textarea','1','','','(40,10)'
admin_adrs ='example@example.com'
default_explanation=''
default_message='CENTER:''(必須)''入力項目のご入力をお願いします'
confirm_message_title='送信確認'
confirm_message_yet = '下記項目を入力の上、送信しなおしてください。'
confirm_message = 'LEFT:''必要項目はすべて入力されています。''内容を修正したい場合は、編集・内容確認用フォームの内容を編集してください。'
reply_message_require='1'
reply_message='このたびはお問い合わせいただき、ありがとうございます。
お問い合わせいただいた内容は次の通りです。'
finish_message = 'LEFT:''下記の通りメールを送信しました。''&br;
1週間以内に返信がない場合はお手数ですが、再度お問い合わせください。'
contact_title_to_admin='【松本零士私設博物館】お問い合わせ'
contact_title_to_client='【松本零士私設博物館】お問い合わせありがとうございます'
}}
ページを更新したら「凍結」リンクをクリックしてページを凍結すると、図のようなページになる。
これでpkwkmail.inc.phpプラグインを使ったメールフォームの「お問い合わせ」ページが出来上がった。
メールフォームにスパム対策をするには?
スパム対策と言えばWordPressではAkismet系のプラグインが有名で、WordPress以外にもAkismetは各種CMS向けにプラグインがある。が、PukiWiki向けの公式のモノはないようだ。
色々とネットを調べると、PukiWiki向けにスパムフィルタとしてakismet_filter.phpや、汎用スパムフィルタのspam_filter.phpといった自作のプラグインやフィルタがあるが、どの情報も2007年頃と古く、それ以降の新しい情報やプログラムが無い状態だ。
仕方がないのでspam_filter.php一式をPukiWiki1.5.2に自力で対応させることにし、必要なファイルを最新(?)にした上で、メールフォームをスパム対策することにした。PukiWiki1.5.2用スパムフィルタspam_filter.phpを本サイトのダウンロードページで公開したので、ダウンロードして使って欲しい。
ただし、今回はAkismetのみしかテストをしていないので、不具合等がある場合はこの記事のコメント欄か【お問い合わせ】ページにてお知らせ願えるとありがたい。可能な限り対応したい(努力目標)。
ダウンロードページからプラグインをダウンロードし、ローカルの作業フォルダに解凍する。
PukiWiki1.5.2用に作ってあるので、そのままフォルダとファイルをFTPする。パーミッションは次の通り設定する。
- 755:「Net」「DNS」「RR」フォルダ
- 777:「spam_filter」フォルダ・dns_get_ns.cacheファイル
- 644:その他のファイル
※「spam_filter」フォルダはspam_filter.phpでスパム認定した際にログを保存するフォルダとして新設し、スパムログを吐くようにspam_filter.phpを改造してある
spam_filter.phpをメールフォーム向けに設定する
spam_filter.php自体が多機能で、元々Wikiはネットというオープンな場で不特定多数の人がページを作成したり更新したりするシステムであるから、スパム対策は念入りなモノとなっている。
詳細な設定は本家のページを参照していただくとして、今回のメールフォーム向けに設定を行おう。メールフォームに限定するなら、スパム対策として
のいずれか、もしくは両方(Akismetフィルタ後にreCAPTCHAで認証)となるだろう。
個人的にreCAPTCHAが嫌いなのと、たいていのスパムはAkismetで弾けるので、今回はAkismetのみの設定とする。私のようにWordPressでAkismet系プラグインを導入している場合はAPIキーを持っているのでそれを設定するが、初めてAkismetを使う場合は次のサイトでアカウントを作成してAPIキーを取得する必要がある(APIキーは無料で取得可能)。
なお、reCAPTCHAを使う場合はGoogleアカウントを持っている(持ってなければ作る)前提となるが、次のサイトからPublic Key(公開鍵)とPrivate Key(秘密鍵)を取得する必要がある(これも無料で取得可能)。
今回はAkismetのみを設定するが、スパムフィルタの設定は「lib」フォルダにFTPしたspam_filter.phpファイルを修正する。まず、58行目付近のスパムフィルタの設定でAkismetを有効にするため、次のように修正する。
lib\spam_filter.php
//define('SPAM_FILTER_COND', '#useragent() or #filename() or #atag() or (#onlyeng() and #urlnum()) or #urlnsbl() or (#onlyeng() and #url() and #akismet())');
// ※デフォルトではフィルタなし
define('SPAM_FILTER_COND', '#akismet()');
次に、Akismetの設定をするため、306行目付近を修正する(commentプラグインはFacebookコメントに変更済みでpcommentプラグインも利用しないため削除し、今回導入したメールフォームのpkwkmailプラグインを追加する)。
lib\spam_filter.php
// Akismetで取得する。APIキー
define('SPAM_FILTER_AKISMET_API_KEY', 'APIキー');
define('SPAM_FILTER_AKISMET_PLUGIN_NAME', 'edit,article,pkwkmail');
spam_filter.phpでAkismetを利用するだけなら上記の設定のみでOKだが、これだけだとメールフォームとして導入したpkwkmail.inc.phpプラグインが期待通りの動作をしてくれない。具体的に言うと「内容確認」ボタンをクリックしたタイミングでspam_filter.phpによるスパムフィルタがかからないのだ。そこでpkwkmail.inc.phpプラグインにコードを追加する。
具体的には「plugin」フォルダのpkwkmail.inc.phpの107行目付近にコードを追加する。
plugin\pkwkmail.inc.php(修正前)
//phase check - 段階のチェック
$cnfm = 0;
if( $_SERVER['REQUEST_METHOD'] == 'POST' ){
if( isset( $vars['cnfm_chk'] ) && $vars['cnfm_chk'] == 1) $cnfm = 1;
if( isset( $vars['cnfm_snd'] ) && $vars['cnfm_snd'] == 1) $cnfm = 2;
}
plugin\pkwkmail.inc.php(修正後)
//phase check - 段階のチェック
$cnfm = 0;
if( $_SERVER['REQUEST_METHOD'] == 'POST' ){
if( isset( $vars['cnfm_chk'] ) && $vars['cnfm_chk'] == 1) $cnfm = 1;
if( isset( $vars['cnfm_snd'] ) && $vars['cnfm_snd'] == 1) $cnfm = 2;
// フォームがポスト(「内容確認」ボタン押下)されたタイミングで
// Spam Filterをキックする
require_once(LIB_DIR . 'spam_filter.php');
spam_filter('pkwkmail');
}
それぞれのファイルを修正したら保存し、所定のフォルダにFTPすればメールフォームのスパム対策(Akismetのみ)が完了する。
メールフォームをテストしてみる
早速、スパム対策(Akismet)が有効であるかどうかをテストしてみる。
まずは適当な名前とメールアドレスを入力し、メッセージ本文は本サイトのURLを入力し、スパム投稿として弾かれないかどうかを確認する。
「内容確認」ボタンをクリックすると、図のように「編集・内容確認用フォーム」の画面になり、入力に問題がなければ「送信する」ボタンクリックでメールが送信される。
次に、実際に迷惑メールにあったURL(http://jnl.io/bestinvestment62764)をメッセージ本文に入力してみる。
「内容確認」ボタンをクリックすると、図のように「Runtime error」の画面になり、スパムメールが送信できないようになっている。文言として「Spam check failed.」では「スパムチェックに失敗しました」だから、「いや待て!スパムチェックに成功したから弾いたんだろ?Σ(´Д`;) 」と思うのだが(元々のspam_filter.phpのメッセージがそうなっている)ま、いっか。
メールフォームのスパム送信では、主にエロサイトや出会い系サイトのURLが国内外から投稿されるので、Akismetで弾くのが一番良い。投稿者も「Spam check failed.」の画面を見れば諦めるだろう(ロボット投稿の場合も同様に弾けるからどうでもいい)。
「名前」や「メールアドレス」に関してあり得ない(存在しない?)入力をされても、それが「有効かどうか」なんて判別のしようがないのが実情だ。単純に嫌がらせで大量にメールが送信される場合はreCAPTCHAを使う等、spam_filter.phpが持つ他のフィルタを設定して防ぐしかない。
ここまでの改造の成果
ここまでの改造の成果であるPukiWikiはこちらなので、「実際どうなのか?」を確認したい人は参照して欲しい。
今回はメールフォームをAkismetのみでスパム対策したが、spam_filter.phpは不特定多数で更新するWikiサイトのスパム対策に耐え得るほど強力なので、設定次第では商用のレンタルWikiサービスにも引けを取らないサイトにすることが可能だ(と思う)。
また、メールフォームを実現するpkwkmail.inc.phpプラグインも自由度が高く、「お問い合わせ」以外にも色々と応用が利くだろう。
おわりに
今回メールフォームの設置やスパム対策をするので色々と調べてみたが、(途中開発が約8年ほど放置されたのもあって)PukiWikiに関してはどれも情報が古く、しかも説明が断片的過ぎる上に、PukiWikiを分かっている前提の情報が多い。
「こりゃ誰もPukiWikiを導入しようとは思わないな」と思った。しかも公開されているプログラムには普通にバグがあるし、プログラムが分からない人にはお手上げだろう。
かく言う私もPHPなんて真面目に勉強したことなんか10分もないので、あまり偉そうなことは言えないのだが。それでもPukiWikiが置かれている現状は厳しいものがあると思った。
PukiWikiはWordPressのように外部DBに依存しないし、現在でも軽量CMSとして非常に魅力的だ。コンテンツによってはWordPressより使い勝手が良いだけに、「今どき」じゃない「標準仕様」とネットの情報が古くて少ないのは如何ともし難いが、微弱ながら盛り立てて行きたいと思う。
Warning: strpos() expects parameter 1 to be string, array given in /home/eware/dajya-ranger.com/public_html/wp-includes/compat.php on line 498
Warning: preg_match_all() expects parameter 2 to be string, array given in /home/eware/dajya-ranger.com/public_html/wp-includes/shortcodes.php on line 155
Array