[[PukiWiki/1.4/ちょっと便利に]] **Akismetによるspam(スパム)防止機能 [#mbe35572] - &new{2006-12-20 (水) 13:13:16}; - &new{2007-02-11 (日) 14:38:03}; *目次 [#n0b9f4b6] #contents *概要 [#gb302814] >WordPress用スパム対策プラグインとして開発されており、多数のWordPress利用者から「最強」との呼び声が高いプラグイン「Akismet」 を PukiWiki で利用します。 投稿内容をチェックし、Spamを防止することができます。 *事前準備 [#p9f1dddb] -WordPress API Key の取得 -- Akismet は元々 WordPress 用プラグインとして作られたもので WordPress のユーザ登録をする必要があります。 -- 以下のページからユーザ登録をおこない、APIキーを取得してください。(基本的に無料ですが、商用に利用する場合は有料となります。) -- http://wordpress.com/api-keys/ -PHP4 Akismet Class のダウンロード -- Akismet Web API を簡単に利用できるようにしたライブラリ PHP4 Akismet Class を使用します。 -- 以下のページからダウンロードし、akismet.class.php を lib ディレクトリにおいてください。 -- http://miphp.net/blog/view/php4_akismet_class *ファイルの書き換え [#m5211b89] lib/pukiwiki.php を変更します。 // Spam filtering if ($spam && $method != 'GET') { . . . } のような箇所があります。そこを以下に置き換えます。<API Key> を取得した API Key に変更します。 // Spam filtering if (isset($vars['msg']) && $vars['msg'] != '' && $method != 'GET') { // SPAM chek by akismet require_once(LIB_DIR . 'akismet.class.php'); // load array with comment data $comment = array( 'author' => isset($vars['name']) ? $vars['name'] : '', 'email' => '', 'website' => '', 'body' => $vars['msg'], 'permalink' => '', 'user_ip' => $_SERVER['REMOTE_ADDR'], 'user_agent' => $_SERVER['HTTP_USER_AGENT'], ); // instantiate an instance of the class $akismet = new Akismet(get_script_uri(), '<API Key>', $comment); // test for errors if($akismet->errorsExist()) { // returns true if any errors exist if($akismet->isError('AKISMET_INVALID_KEY')) { die_message('akismet : APIキーが不正です.'); } elseif($akismet->isError('AKISMET_RESPONSE_FAILED')) { //die_message('akismet : レスポンスの取得に失敗しました'); } elseif($akismet->isError('AKISMET_SERVER_NOT_FOUND')) { //die_message('akismet : サーバへの接続に失敗しました.'); } } elseif ($akismet->isSpam()) { // returns true if Akismet thinks the comment is spam die_message('投稿はスパムと判断されました.'); } } **相談所 [#h71c053a] -問題 --AkismetのAPIでは、以下の情報を元にスパム判定をおこなう ---投稿者(author) ---E-mail ---WebSite(投稿者のURL) ---本文 ---基本的に「本文」だけを設定すればスパム判定はおこなわれる。 --が、Pukiwikiのほうではプラグインによって、本文が設定される変数名が異なる。 ---例えばコメントプラグインなどの場合は「msg」に本文が設定されるが、トラッカープラグインの場合は変数名は、ユーザーの設定によって異なる。 --ようするに、AkismetAPIの本文に対して、Pukiwiki上で投稿された変数のうちどれをマッピングさせるかという問題が存在する。 -解決策 --案1:$vars['msg'] を使用(現状) --- comment, article プラグインや edit プラグイン(通常編集)には対応できる --- tracker の場合設定 :config ページで msg にしなければならない --- article の subject などがスルー --案2:$vars 全体を使用(オリジナル小沼版) --- Akismetに送信する情報にゴミが付く。そのせいで普通の投稿もスパムに間違われはしないか懸念がある。 ---楽チン --案3:こつこつと1つずつ対応 --- 大変だし。PukiwikiやAkismetの仕様変更が行われるたびに修正しないといけない。 --- tracker の場合 :config 設定による *参照 [#ab798c71] -[[PukiWiki/Akismetによるspam(スパム)防止機能>http://www.ark-web.jp/sandbox/wiki/190.html]] オリジナル小沼版 -http://akismet.com/ -http://miphp.net/blog/view/php4_akismet_class -[[最強の呼び声高いブログ用対スパムプラグイン「Akismet」- GIGAZINE>http://gigazine.net/index.php?/news/comments/20070127_akismet/]] *コメント [#xf620ae2] - 感想などお待ちしています。 -- [[小沼]] &new{2006-12-20 (水) 13:22:45}; - http://www.ark-web.jp/blog/archives/2006/12/pukiwikiakismet.html?rss10 -- &new{2006-12-21 (木) 23:47:03}; - お疲れ様です。Akismetに関する概要説明がこの上のblogエントリにしかありませんから、初めての方は手を出し辛いかもしれません (^^; -- [[henoheno]] &new{2006-12-23 (土) 13:31:00}; - ありがとうございます。確かに手を出しにくいかもしれないですね(^^; -- [[小沼]] &new{2006-12-25 (月) 09:52:17}; - GIGAZINEによる紹介((最初にpostした方へ:あまりに補足がなさすぎて、SPAMと間違われて消されていましたよ)) http://gigazine.net/index.php?/news/comments/20070127_akismet/ -- &new{2007-01-28 (日) 08:21:34}; - 1.4.7にて導入してみようとしたのですが、動きませんでした。lib/pulgin.php を書き換えて適用した時点で全てwikiが固まります -- &new{2007-01-30 (火) 03:33:10}; --2007/1/27のAkismetの仕様変更で動作しなくなっていたと思われます。 -- [[小沼]] &new{2007-02-15 (木) 17:41:00}; - 私もAkismetはBlogで使用していますが、非常に強力で重宝しています。導入して2ヶ月、一度もSPAMを突破された事がありません。PukiWikiで公式に利用できるようになると非常に嬉しいです。 -- [[AntiSpam]] &new{2007-02-07 (水) 12:06:45}; -- こうした外部のシステムを(一つじゃなく、管理者の任意の種類と数)呼べるように、anti-spam機構の下地を作ればいいんだろうなあと思っています。 -- [[henoheno]] &new{2007-02-10 (土) 21:36:25}; - クラスの仕様が変わって既に小沼さんのakismet_filter.phpの内容は古くなっているようです。以下にcommentプラグインを直接改造する例を挙げておきます。(comment.inc.php 30行目付近。<PukiWikiのURI>と<API Key>は各サイトに合わせて変更) -- &new{2007-02-09 (金) 02:14:52}; if (! isset($vars['msg'])) return array('msg'=>'', 'body'=>''); // Do nothing +////////////////////////////////////////////// +// SPAM chek by akismet +require_once(LIB_DIR.'akismet.class.php'); + +// load array with comment data +$comment = array( + 'author' => $vars['name'], + 'email' => '', + 'website' => '', + 'body' => $vars['msg'], + 'permalink' => '' +); + +// instantiate an instance of the class +$akismet = new Akismet('<PukiWikiのURI>', '<API Key>', $comment); + +// test for errors +if($akismet->errorsExist()) { // returns true if any errors exist + $akismet_msg = ''; + if($akismet->isError('AKISMET_INVALID_KEY')) { + $akismet_msg = 'akismet : APIキーが不正です.'; + } elseif($akismet->isError('AKISMET_RESPONSE_FAILED')) { + $akismet_msg = 'akisumet : レスポンスの取得に失敗しました'; + } elseif($akismet->isError('AKISMET_SERVER_NOT_FOUND')) { + $akismet_msg = 'akismet : サーバへの接続に失敗しました.'; + } + return array('msg'=>'投稿内容の確認中にエラーが発生しました.', 'body'=>$akismet_msg); +} else { + if ($akismet->isSpam()) { // returns true if Akismet thinks the comment is spam + return array('msg'=>'投稿内容の確認中にエラーが発生しました.', 'body'=>'投稿はスパムと判断されました.'); + } +} +////////////////////////////////////////////// $vars['msg'] = str_replace("\n", '', $vars['msg']); // Cut LFs - コメント以外にも全ての編集にAkismetのチェックをしたいのですがどのように改造すればいいのでしょうか? -- &new{2007-02-10 (土) 18:45:12}; -- 今の[[CVS版]](1.4.8_alpha) の [[cvs:lib/pukiwiki.php]] にはまさにそんな感じの処理があるかもしれません。GET以外の処理について、プラグインの判定と下処理をした上で、その内容を全部関数に渡すようなものが。ここをもう少し拡張して、こうした外部サービスを呼べるようにすればいいんではないかなと思っています。 -- [[henoheno]] &new{2007-02-10 (土) 21:38:24}; - オリジナルの小沼さん版が動作しないとのことなので今現在のまとめ的なものに内容を整頓しました。 -- &new{2007-02-11 (日) 14:38:03}; - 小沼です。しばらく目を離している間にいろいろあったみたいですね。すいません。これから状況を確認します。それとメンテしていただいている方々、本当にありがとうございます。 -- [[小沼]] &new{2007-02-15 (木) 12:02:44}; - オリジナル版を更新しました。akismet_filter.phpを新しいものに差し替えていただければ動作するようになると思います。 -- [[小沼]] &new{2007-02-15 (木) 17:31:39}; http://www.ark-web.jp/sandbox/wiki/190.html #comment