« January 2009 | Main | July 2009 »

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

|

2009.02.15

[iPhone][Jailbreak]テキストエディタgTxtEditJplus 0.91

開発終了のため、公開停止しました。再配布はしないように願います。(2010.05.30)

テキストエディタgTxtEditJplusをバージョンアップしました。
iKeyExのhClipboardがgTxtEditJplusで使えなかったので、使えるようにしました。

その他細々とした修正。

gTxtEditJplus終了時にクリップボードにテキストがある場合は、従来のDynamic Textのほか、hClipboardにもコピーするようにしました。

詳細は、以前のエントリをご覧下さい。

[iPhone]コピー&ペースト機能搭載テキストエディタgTxtEditJplus

gTxtEditJplusはのちなさんがgTxtEditを改造したものですが、前身のTextEdit改造版TextEditJからの流れもあったりして、のちなさんと入れ替わり立ち代わりいじってる感じですね。

[iPod touch]TextEditJ.appを小修正

|

2009.02.04

[iPhone][Jailbreak]標準入出力とiKeyExのhClipboardのヒストリを橋渡しするstdio2hclip

開発終了のため、公開停止しました。再配布はしないように願います。(2010.05.30)

標準入出力とiKeyExのhClipboardのヒストリとを橋渡しする「stdio2hclip」というものを作ってみました。

Mac OS Xでいえば、pbpaste / pbcopyに当たるものですね。

藤棚工房さんのNSString_FJNStringEncodingを使っているので、入力するテキストのエンコーディングは、UTF-8、Shift-JIS、EUC-JP、ISO-2022JP何でもOKだと思います。ただ、短いテキストであるほど、自動認識に失敗する確率は高まると思います。改行コードも、何でも大丈夫だと思います。

oオプションの動作は、hClipboardの最新のヒストリを標準出力に書き出すというものです。

iオプションの動作は、標準入力からの入力を、hClipboardの最新の項目として登録するというものです。

履歴

Ver.0.2 (2009.02.07)
 ヒストリのリスト機能、ヒストリからの出力機能
 テンプレートへの追加機能追加

Ver.0.1 (2009.02.04)
 初版

コマンドラインオプション

-i 標準入力からhClipboardのクリップボードに登録
-I 標準入力からhClipboardのテンプレートに登録
-l クリップボードのヒストリリストを表示
-L テンプレートのヒストリリストを表示
-h N hClipboardのN番目のクリップボードのヒストリを標準出力に出力
-H N hClipboardのN番目のテンプレートのヒストリを標準出力に出力
-o 最新のクリップボードのヒストリを標準出力に出力
-O 最新のテンプレートのヒストリを標準出力に出力
-? ヘルプ

無指定時はヘルプが表示されます。

使用例

コマンドの出力をhClipboardのヒストリに登録


ls -l | stdio2hclip -i

テキストファイルを登録


cat sample.txt | stdio2hclip -i

Webからダウンロードしたhtml等を登録(lastvisiturl2stdoutを併用すると便利かと思います)


curl www.foobar.com | sed -e 's/<[^>][^>]*>//g' | stdio2hclip -i

hClipboardの最新のヒストリをテキストファイルに書き込み


stdio2hclip -o > output.txt

母艦(この場合はMac OS X)のクリップボードから直接流し込み


pbpaste | ssh -l mobile 100.100.100.100 stdio2hclip -i

iPhoneから直接母艦(この場合はMac OS X)のクリップボードに転送
ただなんでだか改行が消えてしまうので、あらかじめ改行を別のものに置換しておいて、母艦側で戻す?


echo `ssh -l mobile 100.100.100.100 stdio2hclip -o` | nkf --mac | pbcopy

Rubyスクリプトから利用

ココログなどTypePadやMovable TypeにファイルをアップロードするRubyスクリプトから使った例です。

upload_.rb

GoodPic.comさんのエントリ「ブログにXML-RPC APIで、複数のファイルをアップロードするRubyスクリプト」にあるupload.rbを改造させてもらいました。
アップロードしたファイルのURLをクリップボードにコピーするというものです。iPhoneではstdio2hclipを、Mac OS Xではpbcopyを使うようにしてあります(適当な判定ですが)。
個人的にかなり便利に使えそうです。

オリジナルは引数を一つしか見てくれないので、複数の引数を指定できるようにもしました。

インストール

インストールは、いつものCydiaのリポジトリから「stdio2hclip」で検索してください。

|

2009.02.02

[iPhone][Jailbreak]SBSettings用Add-on JPMemoDic Ver.0.4

開発終了のため、公開停止しました。再配布はしないように願います。(2010.05.30)

iPhone上で単語登録をするJPMemoDicをバージョンアップしました。

「/var/mobile/Documens/wordslist.txt」があれば、その内容を取り込むようにしました。

詳しくは下記エントリでどうぞ。

[iPhone][Jailbreak]SBSettings用Add-on JPMemoDic

|

« January 2009 | Main | July 2009 »