職場ではWordPressでブログを用意しているのだが,やはりログインして書くのはめんどくさい。そこで,XML::RPCを使ってオフラインで書いたのをアップロードできるようにスクリプトを書いてみた。これで少しは職場ブログも更新頻度が上がるかな。
だいたいこんなコード。ぐぐるとPHPのコードは見つかるんだけど,Perlのがなかなか見つからなかった。
use RPC::XML;
use RPC::XML::Client;
my ($host,$user,$pass,$blogid,$client);
sub register_bloginfo($$$)
{
local ($url,$userid,$password) = @_;
$host = $url;
$user = RPC::XML::string->new($userid);
$pass = RPC::XML::string->new($password);
get_blogid();
}
sub get_blogid()
{
$client = RPC::XML::Client->new($host.'/xmlrpc.php');
$request = RPC::XML::request->new('wp.getUsersBlogs', $user, $pass);
$result = $client->send_request($request);
return 0 if !ref($result) || $result->is_fault;
foreach $v (@$result)
{
while(($a,$b) = each %$v)
{
$blogid = $1 if $a eq 'blogid' && $b->as_string =~ /(\d+)/;
}
}
return $blogid;
}
sub post($$$$$$$$$$)
{
# category と tag は配列のリファレンス
local ($title,$content,$year,$month,$day,$hour,$min,$sec,$category,$tag) = @_;
die "No blogid" if $blogid < 1;
$tags = RPC::XML::array->new(@$tag);
$categories = RPC::XML::array->new(@$category);
$title = RPC::XML::string->new($title);
$content = RPC::XML::string->new($content);
$date = RPC::XML::datetime_iso8601->new(
sprintf("%04d%02d%02dT%02d:%02d:%02d", $year,$month,$day,$hour,$min,$sec));
$request = RPC::XML::request->new(
'wp.newPost',
RPC::XML::int->new($blogid), $user, $pass,
RPC::XML::struct->new(
post_type => RPC::XML::string->new('post'),
post_status => RPC::XML::string->new('publish'),
post_title => $title,
post_content => $content,
post_date_gmt => $date,
terms_names => RPC::XML::struct->new(
category => $categories,
post_tag => $tags
)
)
);
$result = $client->send_request($request);
return 0 if !ref($result) || $result->is_fault;
return 1;
}
1;
コメントの受付は終了しました。