はてなブックマークのバックアップ

はてなブックマークを使わないのはエクスポートが明示されてないからだと書いたら、APIとバックアップスクリプトの存在を指摘された。まあ、そりゃそうだ。

はてなブックマークをためらう理由は別にそれだけでもないんだけど、とりあえずNI-Lab.さんのスクリプトは(というかXML::Atomが依存してるいくつかのモジュールは)うちのWin2k+ActivePerl5.8.xではうまく動かんようなので、XML::Atom::Syndicationを使ってバックアップスクリプトを書いてみた。出力まわりは適当。全件ぶっこ抜くので、毎日使うならatomfeed?date=latestのようにした方が幸せになれるかも。

#!/usr/bin/perl
use 5.008;

use strict;
use warnings;
use Time::Piece;
use XML::Atom::Syndication;

our $VERSION = '0.01';

my $user  = 'charsbar';
my $sleep = 1;
my $file  = 'hatena_bookmark_backup_'.localtime->ymd;

my $atom  = XML::Atom::Syndication->instance or die;

open my $fh, ">:encoding(shiftjis)", $file or die;

my $next = "http://b.hatena.ne.jp/$user/atomfeed";

while( $next ) {
  my $feed = $atom->get($next) or die;

  $next = $feed->query('link[@rel="next"]/@href');

  foreach my $entry ( $feed->query('entry') ) {
    print $fh "<entry>\n";
    print $fh
      '<title>',
      $entry->query('title')->text_value,
      "</title>\n";
    print $fh
      '<link>',
      $entry->query('link[@rel="related"]/@href'),
      "</link>\n";
    print $fh
      '<tags>',
      $entry->query('id')->text_value,
      "</tags>\n";
    if ( my $summary = $entry->query('summary')->text_value ) {
      print $fh
        "<summary>\n",
        $summary,"\n",
        "</summary>\n";
    }
    print $fh "</entry>\n\n";
  }

  sleep( $sleep );
}

close $fh;

このXML::Atom::Syndication、

The module endeavors to provide developers with a package that is simple, lightweight and easy install.

というだけあって、確かにインストは楽。ただ、ちとクセがあるので、あわせてClass::XPathのPODも読んでから作業するのが吉ですね。