XMLRPC による MT の更新

MT を CMS として使っている、とある案件で英語版が必要になった。
こういう用途だと、管理画面経由ではとてもやってられない*1ので、原稿を Perl でパースし、MT の xmlrpc.cgi に食わせるバッチを書いた。
構造体を作るところは完全に adhoc になるので適当な class にしてある程度コードを汎化したが、いまひとつなので、スケルトン部分のみを掲載しておく。

#!/usr/local/bin/perl

use strict;
use warnings;
#use myParseData; # 構造体パース用の野良クラス
use XMLRPC::Lite;

my $uri = 'http://MT_HOME/mt-xmlrpc.cgi'; # mt-xmlrpc.cgi の URI。 適宜書き換え
my $user = "BLOG_USERNAME";               # mt の管理用ユーザ名。  適宜書き換え
my $pass="XMLRPC_PASSWORD";               # xmlrpc 用のパスワード。適宜書き換え

# データのパース
#my $datas = myParseData::parse_data(); # 野良クラスを使用
my $datas = [
    { 
        blogid            => 1,          # blogid
        categories        => [{ CategoryId => 1, isPrimary=>1 },{ CategoryId => 50, isPrimary=>0 }],    # categories structure ( メインカテゴリとサブカテゴリ)
        title             => "hogehoge", # title
        dateCreated       => "2008-06-01T00:00:00",  # time
        description       => "hogehogehoge", 
        mt_text_more      => "bodybodybody", # more
    },
];
## こんな感じで array_ref を構築しておく。

# コンストラクタ
my $rpc = XMLRPC::Lite -> proxy($uri);

for my $record (@$datas)
{
    my $blogid = $record=>{blogid};
    delete $record->{blogid};
    my $categories_ref = $record=>{categories};
    delete $record->{categories};

    my $rec =
             {
                %$record,
                mt_allow_comments => 0, # コメントはつけられない
                mt_allow_pings    => 0, # ping も不要
             };
    my $id = $rpc->call('metaWeblog.newPost',$blogid,$user,$pass,$rec, 1)->result; # 最期の引数の 1 は、"公開"
    $rpc->call('mt.setPostCategories',$id,$user,$pass,$categories_ref)->result || die("error by $id");
}

*1:エントリを修正するたびいちいち再構築する