Windows Live WriterでMovable Type(MT)の古い記事を編集したい その2
前に下の記事を書いたんですが、最近コメント欄にコメントを頂きまして最近のWindows Live Writer(以降WLW)は全件取得出来るように改良されているとのこと。またBlog WriteはエントリーID指定で個別の記事を取り出して編集出来るということを教えていただきました。
Windows Live WriterでMovable Type(MT)の古い記事を編集したい – KUMA TYPE
実は個別の記事を取り出せないかというのは僕も上の記事を書いたときに試みたのですがいじってるソースの部分にエントリーIDっぽいものが見当たらなかったのであきらめたという経緯があります。(実は見逃していただけでした)
前にも思ったことあるけど、BlogWriteほしいなーとちょっと思いました。
で、下の2008年4月に書いた記事なんですが
ペット循環式水飲み器【エコノミーファウンテン】を買ってみた。 – KUMA TYPE
下みたいな感じでエコノミーマウンテンの写真は表示されているけどウォータードーム(ウォータファイテン)の写真が表示されない状態になっていました。原因はリンク切れですが
直したいのでこの記事を編集したい。でもMTの編集画面からは嫌だ。うわーん。といった感じになったわけです。
WLWで書いた記事はWLWじゃないと訳が分からないのでMTの編集画面でみたくないんですよね。写真とか動画とかスクリプト貼り付ける場合もWLWの方が断然便利だし。とにかく便利にWYSWYGで編集したいんですよ。
WLWで取得できる過去の記事の最大数は500件なのですが500件圏内には無くて記事を取得できず編集出来ませんでした。一瞬BlogWriteを買おうかと思いました。
前に書いた記事を元に1000件とかに指定しててみたけどサーバーエラーになってしまう。うーんどうも負荷的にサーバーで止められてしまっているのかもしれない。専用サーバーやVPSならいいんですけどねー。引っ越したい。
そういうわけで原点に戻って必要な記事だけ取得できないかとちゃんとソースを見てみると。。。
MTOS 4.35-jaのmt/lib/MT/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",
unpack ‘A4A2A2A2A2A2’, $entry->authored_on;
my $row = { dateCreated => SOAP::Data->type(dateTime => $co),
userid => SOAP::Data->type(string => $entry->author_id) };
$row->{ $param{page} ? ‘page_id’ : ‘postid’ } =
SOAP::Data->type(string => $entry->id);
if ($class eq ‘blogger’) {
$row->{content} = SOAP::Data->type(string => _encode_text_for_soap($entry->text, undef, ‘utf-8’));
} else {
$row->{title} = SOAP::Data->type(string => _encode_text_for_soap($entry->title, undef, ‘utf-8’));
unless ($titles_only) {
require MT::Tag;
my $tag_delim = chr($author->entry_prefs->{tag_delim});
my $tags = MT::Tag->join($tag_delim, $entry->tags);
$row->{description} = SOAP::Data->type(string => _encode_text_for_soap($entry->text, undef, ‘utf-8’));
my $link = $entry->permalink;
$row->{link} = SOAP::Data->type(string => $link);
$row->{permaLink} = SOAP::Data->type(string => $link),
$row->{mt_basename} = SOAP::Data->type(string => _encode_text_for_soap($entry->basename, undef, ‘utf-8’));
$row->{mt_allow_comments} = SOAP::Data->type(int => $entry->allow_comments);
$row->{mt_allow_pings} = SOAP::Data->type(int => $entry->allow_pings);
$row->{mt_convert_breaks} = SOAP::Data->type(string => $entry->convert_breaks);
$row->{mt_text_more} = SOAP::Data->type(string => _encode_text_for_soap($entry->text_more, undef, ‘utf-8’));
$row->{mt_excerpt} = SOAP::Data->type(string => _encode_text_for_soap($entry->excerpt, undef, ‘utf-8’));
$row->{mt_keywords} = SOAP::Data->type(string => _encode_text_for_soap($entry->keywords, undef, ‘utf-8’));
$row->{mt_tags} = SOAP::Data->type(string => _encode_text_for_soap($tags, undef, ‘utf-8’));
}
}
push @res, $row;
}
\@res;
}
なんだかちゃんと$entry->idってのでエントリーIDを取得してますねー。
なるほど、
というわけでこんな感じにしてみました。
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 });
limit => 10000 });
my @res;
while (my $entry = $iter->()) {
my $co = sprintf "%04d%02d%02dT%02d:%02d:%02d",
unpack ‘A4A2A2A2A2A2’, $entry->authored_on;
my $row = { dateCr eated => SOAP::Data->type(dateTime => $co),
userid => SOAP::Data->type(string => $entry->author_id) };
$row->{ $param{page} ? ‘page_id’ : ‘postid’ } = SOAP::Data->type(string => $entry->id);
next if $entry->id != 611;
if ($class eq ‘blogger’) {
$row->{content} = SOAP::Data->type(string => _encode_text_for_soap($entry->text, undef, ‘utf-8’));
} else {
$row->{title} = SOAP::Data->type(string => _encode_text_for_soap($entry->title, undef, ‘utf-8’));
unless ($titles_only) {
require MT::Tag;
my $tag_delim = chr($author->entry_prefs->{tag_delim});
my $tags = MT::Tag->join($tag_delim, $entry->tags);
$row->{description} = SOAP::Data->type(string => _encode_text_for_soap($entry->text, undef, ‘utf-8’));
my $link = $entry->permalink;
$row->{link} = SOAP::Data->type(string => $link);
$row->{permaLink} = SOAP::Data->type(string => $link),
$row->{mt_basename} = SOAP::Data->type(string => _encode_text_for_soap($entry->basename, undef, ‘utf-8’));
$row->{mt_allow_comments} = SOAP::Data->type(int => $entry->allow_comments);
$row->{mt_allow_pings} = SOAP::Data->type(int => $entry->allow_pings);
$row->{mt_convert_breaks} = SOAP::Data->type(string => $entry->convert_breaks);
$row->{mt_text_more} = SOAP::Data->type(string => _encode_text_for_soap($entry->text_more, undef, ‘utf-8’));
$row->{mt_excerpt} = SOAP::Data->type(string => _encode_text_for_soap($entry->excerpt, undef, ‘utf-8’));
$row->{mt_keywords} = SOAP::Data->type(string => _encode_text_for_soap($entry->keywords, undef, ‘utf-8’));
$row->{mt_tags} = SOAP::Data->type(string => _encode_text_for_soap($tags, undef, ‘utf-8’));
}
}
push @res, $row;
}
\@res;
}
見たとおりですが、解説すると limit=> 10000は記事を強制的に10000個取得するようにしました。まあ自分の最大記事数より多くするという意味で適当に10000と指定しただけです。
next if $entry->id != 611;
の部分はエントリーID所謂記事番号が611じゃなかったら後の処理を飛ばして次のループにスキップするという処理なので10000個の記事を取得するように設定しましたが実際にはエントリーIDが一致した記事しか取得しないという事になるはず。
さてこれでうまくいくのでしょうか?
うまくいきました。欲しい記事だけ取得できるようになりました。しかも記事1件だけの取得なので早かったです。一瞬でした。
エントリーIDの調べ方は色々あると思いますが、下の画像の様にトラックバックのところをみてURLの末尾についている番号を指定してみたらうまくいきました。最初ページのURLのpost_299.htmlの299を試しましたがこれは違いました。
無事記事は修正して以下のようになりました。今度はリンク切れしないように固定の写真じゃなくて名前で検索して表示するようにしてるんですが、(写真というか楽天のアフィリエイトですが)すると好みの写真じゃないのが表示されてしまうんですがそれはしょうがないですね。リンク切れよりいいかな。
記事の修正が終わったらいじったMTのソースは元に戻します。
めんどうだけどそうそうやる作業でもないし今のところこれでいいかなーと。余裕があったらBlogWrite欲しい。
タグ : Movable Type, MT, Windows Live Writer