tDiaryの記事をNucleusに移す その1

簡単にできるだろ、と思ったらえらい苦労したので、メモっておく。 うちのtDiaryは複数の日記を運用してるので、前のエントリにあったやりかただとうまくいかなかった(がんばればできたのかもしれないけど、rubyとかxmlとかよくわからんし・・・)。

で、BrogWriteみたいなBlog投稿ツールを使えばいいか、と思って試すも、記事をまとめてブログ間をコピーするようなのは無くて沈没。

仕方が無いので、XML-RPCを使って記事をコピーすることにした。以下、Perlスクリプト


#!/usr/bin/perl

use Frontier::Client;
use Unicode::Japanese;

### configration

$POSTNUM=550;

# tdiary config
$tdiary_url = 'http:///xmlrpc.rb';
$username_td = 'username';
$password_td = 'password';
$blogid_td = 'blogid';

# nucleus config
$nucleus_url = 'http:///nucleus/xmlrpc/server.php';
$username_nu = 'username';
$password_nu = 'password';
$blogid_nu = 'blogid';


### main

# connect

$server_nu = Frontier::Client->new('url' => $nucleus_url,'debug'=>0);
print "Connect $nucleus_url\n";

$server_td = Frontier::Client->new('url' => $tdiary_url,'debug'=>0);
print "Connect $tdiary_url\n";

$coder = Frontier::RPC2->new;

# get tdiary

$method = 'metaWeblog.getRecentPosts';

$result = $server_td->call($method,
    $blogid_td,
    $username_td,
    $password_td,
    $POSTNUM
);

print "Get $POSTNUM post(s) from tdiary\n";

# new posts

$s = Unicode::Japanese->new;

foreach $i (@$result) {

    $s->set($i->{'title'}, 'utf8');
    $i->{'title'} = $coder->base64($s->conv('utf8', 'base64'));

    $s->set($i->{'description'}, 'utf8');
    $temp = $s->euc;
    $temp =~ s/\n/\n\n/g;
    $s->set($temp, 'euc');
    $i->{'description'} = $coder->base64($s->conv('utf8', 'base64'));

    $datecreated = $i->{'postid'};
    $datecreated =~ s/\d\d$//;
    $datecreated .= "T00:00:00";
    $i->{'dateCreated'} = $coder->date_time($datecreated);

    delete $i->{'postid'};
    delete $i->{'link'};
    delete $i->{'permaLink'};

    $method = 'metaWeblog.newPost';
    $result_nu = $server_nu->call($method,
        $coder->string($blogid_nu),
        $username_nu,
        $password_nu,
        $i,
        $coder->boolean(1)
    );
    print "Add new post to nucleus($result_nu, $datecreated)\n";
}

1;

Frontier::ClientとUnicode::JapaneseはCPANからインストール。スクリプトの先頭のほうに書いてあるURLにXML-RPCエンドポイント、ユーザ名、パスワード、blogidを指定。tDiaryXML-RPC APIの設定があるからわかるんだけど、Nucleusのblogidが不明で困った。blogger.getUsersBlogsで調べたんだけど、結局トップページへのリンクに含まれてるindex.php?blogid=の数字だったりorz

あと、先頭にある$POSTNUMはコピーするblogの「最近の投稿から」の数。全部でいくつの記事があるのかをとってくる方法がわからなかったのよ・・・

さらに、これだけでは上手くいかないのであった・・・以下、次号。Nucleusは奥が深いっすよ、ほんと(実装が適当なだけ、て気もする)。