日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)
- p (01/03)
 - Thiramil (10/26)
 - 久々にいまむらを食べたい通りすがり (09/28)
 - Fluxadir (05/16)
 - Antiprestin (11/08)
 
2010/03/28
_ [Perl][tDiary] tDiary のコメントスパムを一括削除する Perl スクリプトを書いた
先日、「青山データセンター」を名乗るコメント spam と「この間も俊太郎の詩をお」という意味不明なコメント spam に絨毯爆撃され、手作業でぽちぽち非表示にするには多すぎたので、コメントスパムを一括削除するスクリプト書いた。
#!/usr/bin/env perl
# *.tdc のコメント spam を削除する
# 使用例: tdc-clean.pl *.tdc
use strict;
use warnings;
use utf8;
 
foreach my $file (@ARGV) {
  # tdc 読み込み
  my $head;
  my $src = '';
  open my $fh, '<:utf8', $file or die $!;
  $head = <$fh>;
  $src .= $_ for <$fh>;
  close $fh;
  my @src_blocks = split "\n.\n", $src;
 
  # 非表示に設定されているコメント削除
  my @dst_blocks = grep !/\nVisible: false\n/, @src_blocks;
  # 特定 NG ワードが含まれるコメント削除
  @dst_blocks = grep !/青山データセンター|この間も俊太郎の詩をお/i, @dst_blocks;
 
  # 削除コメントがある場合書き出し (コメントが0になる場合はリネームのみ)
  if (@dst_blocks != @src_blocks) {
    if (@dst_blocks > 0) {
      open my $fh, '>:utf8', "$file.tmp" or die $!;
      print $fh $head, join("\n.\n", @dst_blocks), "\n.\n";
      close $fh or die $!;
      chmod 0666, "$file.tmp" or die $!;
    }
    rename $file, "$file.bak" or die;
    if (@dst_blocks > 0) {
      rename "$file.tmp", $file or die;
    }
  }
}
注意事項
- tDiary 用のスクリプトだけど Perl。
 - tDiary 2.3.3 環境で確認。
 - .tdc の文字コードが UTF-8 であることを前提としたスクリプトなので tDiary 2.3 未満の .tdc ではまともに動作しない。tDiary 2.3 未満では :utf8 の部分を :encoding(eucjp) に書き換えれば動くだろうけど未確認。
 - 「最近のコメント」は削除されない。
 - 排他制御何もしてないので、同時にコメント投稿があるとどうなるかわからない。
 
…で、綺麗さっぱり削除できたわけだが、そういやそういうスクリプト他にも誰か書いてんじゃねと思ってググったら、やはり tdiary-comment-clean というものが contrib パッケージに入っているのだそうだ。また無駄な車輪を作ってしまった。
いい加減 Ruby でスクリプト書けるようになりたいもので…
