« [iPhone][Jailbreak]テキストエディタgTxtEditJplus 0.91 | Main | [iPhone][Jailbreak]SBSettings用Add-on MMSReq »

2009.02.24

Captchaを破ってココログに付いたSPAMコメントを、ほぼ一掃するRubyスクリプト

最近、Captchaを破ってSPAMコメントが付くようになりました。

とてもウザいのですが、自分のところに付くSPAMコメントには、以下の書式でURLが貼られることが多いようです。

[url=http://hoge.com/] hoge [/url]
[URL=http://hoge.com/] hoge [/URL]

これまでこのブログにコメントをくださった方にはこの書式でリンクを書く人は居なかったので、実績で言うと、この書式のURLが含まれるコメントは100%SPAMです。

ちょっと乱暴ですが、こういう書式のURLが含まれるコメントはSPAMである、という判定をすることにし、機械的に削除することにしました。

この書式が現れないSPAMコメントもあるのですが、こちらは特徴点が無く、機械的な判別が困難なので置いておくことにします。

ウクライナとか、ロシア方面のIPからのコメントだったらSPAM、というやり方でもよさそうですけどね。

RubyとMechanizeを使って自動削除スクリプトを書きました。

このスクリプトをcronなどで定期的に実行して使います。

コメント一覧ページから操作しているので、最初の20件内だけ処理します。 逆を言うと毎回20件見ているので、実行間隔によっては、

「0.upto((comments/'//*[@class="flyout-action-edit flyout-action"]').length - 1) do |i|」

の部分を例えば「0.upto(5) do |i|」などとして、無駄なアクセスが生じないようにするといいかもしれません。

すいませんが、無保証です。 また、自分はココログベーシックなので、FreeやProで動くか分かりません。

コメントを編集するAPIは無いようなので、HTMLの構造に依存するスクリプトです。

リニューアルがあった際には使えなくなると思います。

削除だけの対策だとSPAMコメントが付いた場合にもメール通知が来てしまいウザいので、「新しいコメント書き込みを、記事の投稿者にメール通知する」をオフにした上で、明らかなSPAMは除外した上で、このスクリプトから新着コメント通知のメール送信をしたいところですね。気が向いたら改良します。

#!/usr/bin/env ruby

$KCODE = "u"

require 'rubygems'
require 'mechanize'

# ココログのユーザ名
username = 'あなたのユーザー名'
# ココログのパスワード
password = 'あなたのパスワード'
# ココログのブログID
blog_id = 'あなたのブログID'

app_top = 'https://app.cocolog-nifty.com/'
login_page = app_top + 't/app'
comment_page = login_page + '/weblog/post?__mode=list_comments&blog_id=' + blog_id

agent = WWW::Mechanize.new
agent.max_history = 1
login_page = agent.get(login_page)
login_form = login_page.forms[0]
login_form['username'] = username
login_form['password'] = password
agent.submit(login_form)
comment_page = agent.get(comment_page)
comments = (comment_page/'//*[@id="comments-list"]/table/tbody/tr')

0.upto((comments/'//*[@class="flyout-action-edit flyout-action"]').length - 1) do |i|
  comment_edit_page = agent.get(app_top + (comments/'//*[@class="flyout-action-edit flyout-action"]/span/a/@href')[i].inner_text)
  0.upto((comment_edit_page/'//*[@id="text"]').length - 1) do |j|
    body = (comment_edit_page/'//*[@id="text"]')[j].inner_text
    # puts body.gsub(13.chr, '')
    # コメント本文が正規表現にマッチしたらSPAM
    # [url=http://hoge.com] hoge [/url]みたいな書式が含まれるコメントはSPAM
    if (body =~ /\[[uU][rR][lL]=.+\].+\[\/[uU][rR][lL]\]/) then
      # スパムコメントとして@Niftyに報告しつつ削除
      comment_edit_form = comment_edit_page.forms[1]
      comment_edit_form.status = 'junk'
      comment_edit_form.from = 'edit_comment'
      comment_edit_form.to = 'list_comments'
      agent.submit(comment_edit_form)
      # 初回は以下2行をコメントアウトしてテストした方がいいかも
      # puts "SPAM comment deleted"
      # exit
    end
  end
end

|

« [iPhone][Jailbreak]テキストエディタgTxtEditJplus 0.91 | Main | [iPhone][Jailbreak]SBSettings用Add-on MMSReq »