Blog Hacks サポートページ で追加情報や新 Hack の集約に使用しているスクリプトを適当に公開。Trackback Ping を受けて、その title, excerpt などを XML-RPC で Movable Type にポストしています。
#!/usr/local/bin/perl -w
use strict;
use CGI;
use Jcode;
use XMLRPC::Lite;
our $BlogCharset = "utf-8"; # XML-RPC is done in UTF-8
our %CategoryID = qw(bonus 60 hack 61);
our $DefaultCategoryId = 61;
our $XmlRpcURL = "http://example.com/mt/mt-xmlrpc.cgi";
our $BlogID = 19;
our $Username = "foobar";
our $Password = "blahblah";
my $q = CGI->new();
my $charset = $q->param('charset');
my %postdata = get_postdata($q, $charset);
my $category = $q->path_info() || "";
$category =~ s!^/!!;
my $category_id = $CategoryID{$category} || $DefaultCategoryId;
if ($postdata{title}) {
post_entry(\%postdata, $category_id);
# XXX no error handling
print $q->header('text/xml'), <<XML;
<?xml version="1.0" encoding="UTF-8"?>
<response>
<error>0</error>
</response>
XML
;
} else {
print $q->header('text/xml'), <<XML;
<?xml version="1.0" encoding="UTF-8"?>
<response><error>1</error><message>Invalid Trackback parameter</message></response>
XML
;
}
# get TrackBack parameters
sub get_postdata {
my($q, $charset) = @_;
my @keys = qw(blog_name url title excerpt);
return map { $_ => get_param($q, $_, $charset) } @keys;
}
# get parameter from CGI considering $charset and $BlogCharset
sub get_param {
my($q, $key, $charset) = @_;
my $data = $q->param($key);
my %code = ('euc-jp' => 'euc', 'utf-8' => 'utf8', 'Shift_JIS' => 'sjis');
my $code = ($charset && $code{$charset}) ? $code{$charset} : Jcode::getcode($data);
my $outcode = $code{$BlogCharset};
return Jcode->new($data, $code)->$outcode;
}
# Post entry using MT XML-RPC API
sub post_entry {
my($postdata, $category_id) = @_;
XMLRPC::Lite->import('trace' => 'debug');
my $entry_id = create_item($postdata);
set_category($entry_id, $category_id);
publish_item($entry_id);
}
sub create_item {
my $postdata = shift;
# create item data from Trackback data
my $item;
$item->{title} = "$postdata->{title} (via $postdata->{blog_name})";
$item->{description} = <<DATA
<blockquote>$postdata->{excerpt}</blockquote>
<p><a href="$postdata->{url}">Continue Reading "$postdata->{title}"</a></p>
DATA
;
my $publish = 0; # no publish here
my @args = ($BlogID, $Username, $Password, $item, $publish);
return XMLRPC::Lite->proxy($XmlRpcURL)->call("metaWeblog.newPost", @args)->result;
}
sub set_category {
my($entry_id, $category_id) = @_;
my @args = ($entry_id, $Username, $Password,
[ { categoryId => $category_id } ]);
XMLRPC::Lite->proxy($XmlRpcURL)->call("mt.setPostCategories", @args);
}
sub publish_item {
my $entry_id = shift;
my @args = ($entry_id, $Username, $Password);
XMLRPC::Lite->proxy($XmlRpcURL)->call("mt.publishPost", @args);
}
まあ特にコメントは必要ないかとおもいますが。XML-RPC でカテゴリをセットするためには、metaWeblog.newPost でエントリを publish=0 で作成したあと、mt.setPostCategories でカテゴリをセット、その後 mt.publishPost で公開というメンドウなステップを踏む必要ありです。