Windows Live WriterでMovable Type(MT)の古い記事を編集したい

20100186

20100183

私はこのブログを書くのにMicrosoftのフリーのブログ投稿ソフトWindows Live Writerを利用しています。ワープロで文章を作成する感覚でWYSIWYGで文章を作成することができるからです。文章への画像の挿入も簡単で、画像を回転させたり明るさを調整したり一部分をトリミングして貼りつけたりも簡単にできます。

と、ソフトの紹介はここまでにして、Windows Live Writer(以降WLW)は過去に書いた記事もサーバから取り出して編集する事が出来るのですが、最近投稿した記事を過去にさかのぼって20,50,100,500から取得して編集することができます。

20100187

 

20100188

これがちょっと問題になる場合があります。つまり最近から500件より古い記事は編集できないことになるわけです。

これにはネット上で困っている人が他にもいらっしゃるようで検索してみるといくつか同じ問題で困っている方々のブログが見つかりましたが、残念ながら問題を解決された方の記事を発見することはできませんでした。

僕自身は下の2007年5月5日に書いた記事が、画像のリンク切れや貼りつけているソースが崩れてて見難くひどい状態だったのでこれを編集したかったのですが、MTの編集画面から編集をしようかと思ったのですが、MTの編集画面からではどう修正したものかわからないような状態になっていたのと、やっぱりWLWで編集するのが楽なのでなんとか過去の記事を編集する方法が無いものかと検索したりして方法を模索していました。

ファイル読込時や保存時に表示を縮小版にする

本当は記事番号とかで直接編集する記事を呼び出して編集出来るといいのですが、ネット上で見かける記事などにもなんでこんな仕様になってるのか不思議、修正して欲しい。等の意見を見かけたりしました。

でもこれは、WLWの問題というよりXML-RPC APIの仕様によるものなのでしょうがないですね。新しい記事から何件の記事を取得という仕様も汎用性を持たせたシンプルな機能にした結果なんでしょう。

最大500件という制限も記事情報取得時のサーバへの負荷を考慮した結果でしょう。これを無制限にするととんでもないことになるのは目に見えます。

500件にしても500件取得できないという方のブログも拝見しましたが、これは多分使っているブログのXML-RPCの実装で負荷対策としてそういう制限がかかっているんじゃないかと思いました。

WLWにMT用の設定をしている場合、最近の記事を取得するのにはmetaWeblog.getRecentPostsというAPIを利用しているようです。

ならば、metaWeblog.getPostを利用して個別の記事を取り出す機能もユーザーに提供していただけると嬉しいところです。ただ、ユーザが記事IDなどを把握したりしなければならなくなるのでそこら辺の関係でソフトのシンプルな操作が犠牲になるのを避けたくなるのは当然といえば当然ですね。

そういうわけで、とりあえずMT側をいじって取得される記事を操作すれば過去の記事をWLWで取得して編集できるのではないかと考えXML-RPC関係のライブラリを探していじってみることにしました。

ちなみにこの記事で扱っているMTのバージョンはMovable Type version 4.261ですので、最新のバージョンでは多少状況が違う場合があるかと思います。現在の総記事数は1256件です。

とりあえずの目標は、上であげた古い記事をWLWを編集するところまでです。

mtのディレクトリを覗いてみると、

mt/lib/MT

の中に

XMLRPCServer.pm

というライブラリが存在しました。

このファイルをダウンロードしてテキストエディタで開いておもむろにgetRecentPostsというキーワードで検索してみると664行目あたりにまさに同じ名前のサブルーチンが存在します。

■XMLRPCServer.pmの664行目付近

sub getRecentPosts {
    my $class = shift;
    my ($blog_id, $user, $pass, $num);
    if ($class eq ‘blogger’) {
        (my($appkey), $blog_id, $user, $pass, $num) = @_;
    }
    else {
        ($blog_id, $user, $pass, $num) = @_;
    }
    $class->_get_entries( blog_id => $blog_id, user => $user,
        pass => $pass, num => $num );
}

この中でさらに
_get_entries

というサブルーチンを呼び出しています。引数にはblog_id,user,pass,numとなっています。このnumが多分記事を取得する件数だというのが容易に想像できます。

そして、XMLRPCServer.pmのなかで_get_entriesを検索してみると615行目あたりに_get_entriesというサブルーチンの本体が見つかります。ちょっと見るとここでループしながら指定した数の記事を取得しているのが分かります。

■XMLRPCServer.pmの615行目付近

sub _get_entries {
    my $class = shift;
    my %param = @_;
    my($blog_id, $user, $pass, $num, $titles_only) =
        @param{qw( blog_id user pass num titles_only )};
    my $obj_type = $param{page} ? ‘page’ : ‘entry’;
    my $mt = MT::XMLRPCServer::Util::mt_new();   ## Will die if MT->new fails.
    my($author, $perms) = $class->_login($user, $pass, $blog_id);
    die _fault(MT->translate("Invalid login")) unless $author;
    die _fault(MT->translate("Permission denied.")) unless $perms && $perms->can_create_post;
    my $iter = MT->model($obj_type)->load_iter({ blog_id => $blog_id },
        { ‘sort’ => ‘authored_on’,
         direction => ‘descend’,
          limit => $num });
    my @res;
    while (my $entry = $iter->()) {
        my $co = sprintf "%04d%02d%02dT%02d:%02d:%02d",

(以下略)

 

そしてちょっと見ると、

limitが取得件数

sortの下のdirection => ‘descend’,をいじれば取得する記事リストの昇順降順を変えられそうなのが分かります。

で、下のようにコメントアウトしたりしながらdescendを逆のascendにしてみたり、limitを5にしたり2000にしてみたりして実験してみた。

sub _get_entries {
    my $class = shift;
    my %param = @_;
    my($blog_id, $user, $pass, $num, $titles_only) =
        @param{qw( blog_id user pass num titles_only )};
    my $obj_type = $param{page} ? ‘page’ : ‘entry’;
    my $mt = MT::XMLRPCServer::Util::mt_new();   ## Will die if MT->new fails.
    my($author, $perms) = $class->_login($user, $pass, $blog_id);
    die _fault(MT->translate("Invalid login")) unless $author;
    die _fault(MT->translate("Permission denied.")) unless $perms && $perms->can_create_post;
    my $iter = MT->model($obj_type)->load_iter({ blog_id => $blog_id },
        { ‘sort’ => ‘authored_on’,
         direction => ‘descend’,
#          direction => ‘ascend’,
          limit => $num });
#         limit => 5 });
#         limit => 2000 });
    my @res;
    while (my $entry = $iter->()) {
        my $co = sprintf "%04d%02d%02dT%02d:%02d:%02d",

(以下略)

 

上記のように無理やり取得件数や昇順降順をMTの方で強制的に決めると、もうWLW側の設定は関係なくなります。

実際下は取得件数を5件に強制的にしてみたところ。表示する項目の数は50件になっているけど実際には下のように5件のみ取得表示されてます。

20100179

どうやらうまくいきそうなので、directionをascendにしてみたところちゃんと記事が古い順に取得されました。下の画像ではブログを始めた頃の一番古い2005年4月の記事からリスト表示されています。(この頃はまだMTではなく無料レンタルのブログを使っていました。)

20100181
(クリックで拡大表示)

そして、結果的にlimitを400、directionを”ascend”で2007年5月5日の記事を取得することができ、編集することができました。

20100182 
(クリックで拡大表示)

記事を編集した後はXMLRPCServer.pmの修正箇所は元に戻しました。

あまり大きな数にするとサーバーの制限でプロセスをkillされたりタイムアウトしたりするんじゃないかと思います。自分でブログを設置している人にしか使えない方法ですし、記事数がもっととてつもない人には使えない方法ですが、なにかの参考になれば幸いです。

◇参考文献:MovableType で使える XML-RPC API

タグ : , , ,