愛用している YukiWiki に weblogUpdates.ping な機能をつけてみる。

機能概要

  • YukiWiki に何らかの更新があった場合、更新PINGする。
  • 6時間以内に更新PINGしているなら、更新PINGしない。
  • 更新PINGはバックグラウンドで行う(ブラウザは更新PINGが終了するまで待たなくて良い)

YukiWiki は Perl で書かれてるので、更新PINGをする部分の実装も Perl を使うことにする。

YukiWIki 2.0.5 には do_write というサブルーチンがあって、これが更新する際に呼ばれる関数となっている(らしい)。このサブルーチンの最後で、weblogUpdates.ping をする。

更新PINGの実装は別モジュールにしておく。ここでは WeblogUpdatePings.pm というモジュールにしておく。
YukiWiki からは WeblogUpdatePings::update_pings 呼び出すだけで良い。

use WeblogUpdatePings;
WeblogUpdatePings::update_pings();

以下は、WeblogUpdatePings.pm の実装。
ping サーバや Weblog 名等の設定は WeblogUpdatePings::update_pings に直書きしている。これなら、BBSの更新時等に転用するときに、ファイルをコピーして設定変えるだけですむ。
NILab::* モジュールは NI-Lab.'s Perl Modules を参照。


package WeblogUpdatePings;
 
#===========================================================
use NILab::CGIUtils;
use NILab::WeblogUpdate;
use NILab::IntervalChecker;
 
#===========================================================
# static function
#===========================================================
sub update_pings{
 
  # config
  my $interval_log  = './inteval_log.txt';
  my $interval_time = 60 * 60 * 6; # for 6 hours interval
  my $weblog_name   = 'NI-Lab.\'s MemoWiki';
  my $weblog_url    = 'http://www.nilab.info/wiki/';
  my @ping_server   = (
    'http://www.blogpeople.net/servlet/weblogUpdates',
    'http://rpc.weblogs.com/RPC2',
    'http://ping.bloggers.jp/rpc/',
    'http://ping.cocolog-nifty.com/xmlrpc',
    'http://ping.myblog.jp',
    'http://ping.exblog.jp/xmlrpc',
    'http://blog.goo.ne.jp/XMLRPC',
    'http://ping.blogmura.jp/rpc/',
    'http://rpc.blogrolling.com/pinger/',
    'http://api.my.yahoo.com/RPC2',
    'http://bulkfeeds.net/rpc',
    'http://ping.blogmura.jp/rpc/',
    'http://blogstyle.jp/xmlrpc/',
  );
  my $ping_log_file = './updateping_log.txt';
 
  $interval_checker =
    NILab::IntervalChecker->new(
      $interval_log,
      $interval_time,
    );
 
  # interval check
  if($interval_checker->check()){
 
    # create weblog update object
    $weblog_update =
      NILab::WeblogUpdate->new(\@ping_server);
    $iwup =
      WeblogUpdatePings->new(
        $weblog_update,
        $weblog_name,
        $weblog_url,
        $ping_log_file);
 
    # do background job for CGI
    NILab::CGIUtils::do_background_job($iwup);
  }
 
}
 
#===========================================================
# constructor
#===========================================================
sub new {
  my $class = shift;
  my $self = { # initializeing field value
    weblog_update => shift,
    weblog_name   => shift,
    weblog_url    => shift,
    ping_log_file => shift,
  };
 
  bless $self,$class;
  return $self;
}
 
#===========================================================
# do - for NILab::CGIUtils::do_background_job's callback
#===========================================================
sub do{
  my $self          = shift;
  my $weblog_update = $self->{weblog_update};
  my $weblog_name   = $self->{weblog_name};
  my $weblog_url    = $self->{weblog_url};
  my $ping_log_file = $self->{ping_log_file};
 
  # weblogUpdate.ping
  $weblog_update->ping($weblog_name, $weblog_url);
 
  # output ping log
  open(FH, ">$ping_log_file");
  print FH $weblog_update->{log};
  close(FH);
 
  return 1;
}
#===========================================================
 
1;

MemoWiki で使っている本番運用版とはちょっと違うけど、まぁだいたいこんな感じ。
また、日本語のブログ名に対応しているかどうかは不明。


コメント

NI-Lab.の、設定するはずだったみたい。

づらねこにゃんに設定されるところだった(^_^;

tags: zlashdot Weblog

Posted by NI-Lab. (@nilab)