&pgid();

見習い中の小沼です。
スパム防止用のPukiwikiライブラリを作成しましたので公開いたします。

**目次 [#ea670dd8]
#contents();

**spam(スパム)対策が必要になった契機 [#q2fbdcde]
当ホームページの中に[[アークウェブ プロジェクト管理方法ご紹介]]というページがあります。
そのページにPukiWikiのプラグインであるtrackerを置いているのですが、そこが今月(2006年12月)の頭ごろからスパムの標的になってしまいました。
ひどいときは一日に20件近く投稿されていました。
会社のWebサイトがスパムだらけになってしまったら、まるでメンテナンスができていないような印象を与えてしまい、会社のイメージを大きく傷つけます。
かといって、毎日手作業でスパム投稿を削除していたのでは大変ですので、今回PukiWikiのスパム防止機能を作成することになりました。

#blikimore


**Akismetについて [#w5afcea5]
Akismetというスパムチェック用のWebAPIがあります。
http://akismet.com/development/
今回のspam対策にこのAPIを利用させていただきました。
**導入方法 [#eff2131f]
今回作成した機能を利用される方は以下の手順をおこなってください。

***事前準備 [#x23bcc0e]
-webapi登録
--まずAkismetにユーザ登録をする必要があります。
---以下のページからユーザ登録をおこない、APIキーを取得してください。(基本的に無料ですが、商用に利用する場合は有料となります。)
http://wordpress.com/api-keys/

-Akismetクラスダウンロード
--以下のページからPHP4用のAkismetクラスをダウンロードしてください。
http://miphp.net/blog/view/php4_akismet_class

-ライブラリをダウンロード
--ここからダウンロードしてください。
#ref(akismet_filter.php);

***ファイル書き換え [#c3236629]
いくつか書き換えが必要な箇所があります。
-akismet_filter
--先ほどダウンロードしたakismet_fileter.phpに以下のような記述があります。
 /*
  *  使用時に以下の定数を書き換えてください。
  */
 //チェック対象とするプラグイン名。カンマ区切り
 define('PLUGIN_NAME_WITH_AKISMET_CHECK', 'comment,tracker');
 //Akismetで取得する。APIキー
 define('API_KEY', '');
 //あなたのサイトのURL
 define('URL','http://ark-web.jp');
 //あなたのサイトのパーマリンク
 define('PERMA_LINK','http://ark-web.jp');
--ここを適切な値で書き換えてください。
-plugin.php
--actionが呼ばれたときに、スパムチェック機能が呼び出されるように、plugin.phpを書き換える必要があります。
---plugin.phpの中にdo_plugin_action()という関数があります。その中にakismet_filter.phpを呼び出す記述をしてください。以下のようになると思います。
// Call API 'action' of the plugin
 function do_plugin_action($name)
 {
     if (! exist_plugin_action($name)) return array();
 
     if(do_plugin_init($name) === FALSE)
         die_message('Plugin init failed: ' . $name);
 
     //Akismet Spam Filter
     require_once(LIB_DIR . 'akismet_filter.php');
     if ( is_spam_message($_POST, $name) == "1" )
         die_message("Spam check faild. Plugin:$name");
 
     $retvar = call_user_func('plugin_' . $name . '_action');
 ...略
 
***ファイルのアップロード [#he46a883]
-ダウンロードしたakismet(Akismet.class.php )と、akismet_fileter.phpをpukiwikiのライブラリフォルダに配置してください。
 pukiwiki/lib/Akismet.class.php
 pukiwiki/lib/akismet_fileter.php

----
これで設定は全てです。
画面から操作し、正しく動くことを確認してください。


**内部的なこと [#qf19ece5]
-このSpam対策の仕組みをご説明します。といっても大したことはしていません。
--まず作成したakismet_filter.phpは以下のようになっています。
 <?php
 require_once 'Akismet.class.php';
 
 /*
  *  使用時に以下の定数を書き換えてください。
  */
 //チェック対象とするプラグイン名。カンマ区切り
 define('PLUGIN_NAME_WITH_AKISMET_CHECK', 'comment,tracker');
 //Akismetで取得する。APIキー
 define('API_KEY', '');
 //あなたのサイトのURL
 define('URL','http://ark-web.jp');
 //あなたのサイトのパーマリンク
 define('PERMA_LINK','http://ark-web.jp');
 
 function is_spam_message($post_data, $plugin_name){
   
   //PLUGIN_NAME_WITH_AKISMET_CHECKを配列に変換
   $plugin_names = explode(",", PLUGIN_NAME_WITH_AKISMET_CHECK);
    
   if (in_array($plugin_name, $plugin_names)) {
     //チェック対象のプラグインの場合。
     $akismet = new Akismet(URL, API_KEY);
     $akismet->setAuthor("pukiwiki");
     $akismet->setContent( var_export($post_data, true) );
     $akismet->setPermalink(PERMA_LINK);
     
     return $akismet->isSpam();
   }
   
   return false;
 
 }
 
 ?>
---is_spam_messageが呼ばれると、実行されるプラグインが処理対象とするもの、つまり定数PLUGIN_NAME_WITH_AKISMET_CHECKで指定されているもの(上記例の場合trackerとcomment)であるかを判定をおこないます。
---処理対象のプラグインであった場合は、postデータをAkismetクラスに渡し、スパム投稿かどうかの判定を行っています。

--次にplugin.phpを以下のように書き換えることによって、アクションが実行された場合に、先ほどのis_spam_message関数が呼ばれるようにしています。
 require_once(LIB_DIR . 'akismet_filter.php');
 if ( is_spam_message($_POST, $name) == "1" )
     die_message("Spam check faild. Plugin:$name");

以上です。

***関連ページ [#k020648a]
[[PukiWikiにコントリビュートしました。>http://pukiwiki.sourceforge.jp/dev/?PukiWiki%2F1.4%2F%A4%C1%A4%E7%A4%C3%A4%C8%CA%D8%CD%F8%A4%CB%2FAkismet%A4%CB%A4%E8%A4%EBspam%28%A5%B9%A5%D1%A5%E0%29%CB%C9%BB%DF%B5%A1%C7%BD]]

#blikifooter(小沼)

tag: [[PHP>tag/PHP]], [[PukiWiki>tag/PukiWiki]], [[Spam>tag/Spam]], [[Akismet>tag/Akismet]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら