はてなブックマークはバックアップする機構がない(ベータ版だから?)。
ので、バックアップする perl スクリプトを作ってみた。


#!/usr/local/bin/perl
use strict;
use warnings;
 
use FileHandle;
use XML::Atom::Feed;
 
##### user config ##########################################
my $user = 'nilab';
my $prefix_filename  = 'atomfeed';
my $postfix_filename = '.xml';
my $interval_time = 10;
############################################################
 
# hatena bokmark atom feed url
my $feed_url = "http://b.hatena.ne.jp/${user}/atomfeed";
 
my $counter = 1;
 
do{
  # get atom feed
  my $req = HTTP::Request->new(GET => $feed_url);
  my $res = LWP::UserAgent->new->request($req)->content;
 
  # output xml file
  my $filename =
    sprintf(
     "%s%03d%s",
     $prefix_filename, $counter, $postfix_filename);
 
  my $fh = FileHandle->new("> $filename");
  if(defined $fh){
    print $fh $res;
    $fh->close;
  }else{
    die 'Couldn\'t open the file' . $filename;
  }
 
  # output result
  print STDERR "OK: ${feed_url} to ${filename}\n";
 
  # search next feed url
  my $feed = XML::Atom::Feed->new(\$res);
  my @links = $feed->link;
  $feed_url = 0;
  for(@links){
    if($_->rel eq 'next'){
      $feed_url = $_->href;
    }
  }
 
  $counter++;
  sleep $interval_time;
 
}while($feed_url);

はてなブックマークフィードでは、link タグの next で次の Atom Feed の URL を拾えるところが便利。

はてなブックマークAtomAPIとは とか はてなブックマークフィード仕様とは とかを参考にしたけど、WSSE認証は実装してない(^_^;
公開されているブックマークのみバックアップ。どうせ、自分は public にしかブックマークしないし。

本当は、自分のメモを www.nilab.info にすべて蓄えておきたいのだけれど、はてなブックマークはとても便利だし、同じ機能を自前で作るのもめんどい(ソーシャルな機能はあまり必要としてないのでそれを除くとしても)。
このバックアップツールを使えば、とりあえず www.nilab.info にはてなブのデータをコピーすることが簡単になる。
いざとなれば、Atom Feed を XSL で見た目良くするとか、XSLT で HTML化するとか、タグで一覧とか、実装できる余地はある(時間と意欲は無い)。

# はてな万歳?

追記: 2006-11-04

はてブにエクスポート機能が追加された! ので、もうこの perl スクリプトは不要。


コメント

NI-Lab.が、広いフィード仕様と、タグとか良くするとか
簡単などをコピーしたいよ♪


さっそく、なてなの投げ銭でポイントを下さった方がいらっしゃいます。
ありがとうございます m(_ _)m

そういえば「投げ銭」とか呼んでるけど、正式名称はなんだろう。
「はてなブックマークではてなポイントを贈る」機能?

僕はこれを毎日回しています。

#!/bin/sh
cd "${HOME}/backup/hatena" || exit 1
alias wget='wget -T 10 -t 2 -q'
date=`date +%Y-%m-%d`
wget "http://b.hatena.ne.jp/$USER/rss" -O "${date}.rdf"
bzip2 ${date}.rdf

tags: zlashdot Internet Hatena Perl

Posted by NI-Lab. (@nilab)