2013年1月14日月曜日

SeesaaブログへのXML-RPCによる投稿

SeesaaブログへXML-RPCを使って投稿する方法を調べたので、まとめておく。使用言語はPerl、ここではあえてXMLRPC::Lite等のXML-RPC用のモジュールは使用していない。


#! /usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Encode qw/decode encode/;
use utf8;
binmode STDERR, "encoding(utf8)";

my $requestbody = <<"EOHD";
#この部分にリクエスト本体を記入する
EOHD

my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new (POST => 'http://blog.seesaa.jp/rpc');
$request->content_type('text/xml');
$request->content(encode 'utf8', $requestbody);
my $response = $ua->request($request);
my $content = decode ('utf8', $response->content);
print encode 'utf8', $content;


「リクエスト本体」部分は例えば次のようになる。


そのサーバで提供されているXML-RPCの呼び出し方法を取得する

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>mt.supportedMethods</methodName>
</methodCall>


ブログの情報を取得する

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>blogger.getUsersBlogs</methodName>
<params>
<param>
<value><string>アプリケーションキー</string></value>
</param>
<param>
<value><string>ログインユーザーネーム</string></value>
</param>
<param>
<value><string>ログインパスワード</string></value>
</param>
</params>
</methodCall>
  • アプリケーションキー:無視されるので空文字もしくは任意の文字列でよい。
  • 返り値はブログのURL、ブログID、ブログ名である。


投稿する(Blogger API を使った場合)

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>blogger.newPost</methodName>
<params>
<param>
<value><string>アプリケーションキー</string></value>
</param>
<param>
<value><string>ブログID</string></value>
</param>
<param>
<value><string>ログインユーザーネーム</string></value>
</param>
<param>
<value><string>ログインパスワード</string></value>
</param>
<param>
<value><string>本文</string></value>
</param>
<param>
<value><boolean>公開/非公開</boolean></value>
</param>
</params>
</methodCall>
  • ブログID:blogger.getUsersBlogsを使って取得するか、もしくはSeesaaブログの「ブログ一覧」などでブログ名のリンクのなかに「blog_id=xxxxxxxx」という形で含まれているものを使用する。
  • 公開/非公開:1で「公開」、0で「非公開」。しかし私の環境では、Seesaaブログではいずれを設定してもなぜか公開になる(H25年1月27日の時点で確認)。
    (後日追記:Seesaaブログのサポートに「そのような仕様なのか?」と問い合わせたところ、「そのような仕様は設けていない」「こちらでも確認しXML-RPC経由の投稿で非公開の記事を保存することが可能であることを確認した」との回答であった。なおFC2ブログでは、全く同じスクリプトを使って非公開での投稿が可能であった。)
  • 記事タイトルは指定できない。Seesaaブログでは「no-title」となる。
  • カテゴリーの指定はできないので、必要であればmt.setPostCategoriesを使って設定しなおす(後述)。
  • 返り値は投稿に成功したら記事ID、失敗したらfaultである。


投稿する(metaWeblog APIを使った場合)

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>metaWeblog.newPost</methodName>
<params>
<param>
<value><string>ブログID</string></value>
</param>
<param>
<value><string>ログインユーザー名</string></value>
</param>
<param>
<value><string>ログインパスワード</string></value>
</param>
<param>
<value>
<struct>
<member>
<name>title</name>
<value><string>記事タイトル</string></value>
</member>
<member>
<name>description</name>
<value><string>記事本文</string></value>
</member>
<member>
<name>dateCreated</name>
<value><dateTime.iso8601>投稿日時</dateTime.iso8601></value>
</member>
<member>
<name>mt_allow_comments</name>
<value><int>コメント受付/非受付</int></value>
</member>
<member>
<name>mt_allow_pings</name>
<value><int>トラックバック受付</int></value>
</member>
<member>
<name>mt_convert_breaks</name>
<value><string>改行は<br/>タグに変換する</string></value>
</member>
<member>
<name>mt_text_more</name>
<value><string>追記</string></value>
</member>
<member>
<name>mt_excerpt</name>
<value><string>概要</string></value>
</member>
<member>
<name>mt_keywords</name>
<value><string>, キーワード1, キーワード2</string></value>
</member>
<member>
<name>mt_tb_ping_urls</name>
<value><array>トラックバックURL</array></value>
</member>
</struct>
</value>
</param>
<param>
<value><boolean>公開/非公開</boolean></value>
</param>
</params>
</methodCall>
  • 投稿日時:空文字にしておけばサーバ側で自動的に入力される。
  • カテゴリーの指定はできないので、必要であればmt.setPostCategoriesを使って設定しなおす(後述)。
  • 公開設定が反映されずすべて公開になること、またFC2ブログでは同じスクリプトで非公開での投稿が可能であったことは、Blogger APIと同様である(H25年1月27日の時点で確認)。

 以下はオプションなので省略可。

  • コメント受付/非受付:1で「受付/表示」、0で「受付しない/表示しない」。
  • トラックバック受付:1で「受付/表示」、0で「受付しない/表示しない」。
  • 改行は<br/>タグに変換する:1で「変換する」、0で「変換しない」。
  • 追記:追記機能とは、文章が長くなってしまう記事の場合に「追記の文言」をクリックすることで、追記部分の内容を読むことができるようにするための機能とのこと。ここではその「追記部分の内容」を記載する。ただし私自身はこの機能をどのようにして使うのか把握していない。
  • 概要:更新通知のトラックバック概要。
  • , キーワード2, キーワード3:htmlソースのmetaタグkeywords用のキーワード。Seesaaブログではブログ名が1つ目のキーワードとして自動挿入されるので、ここで指定したキーワードは2つ目以降のキーワードとなる。
  • トラックバックURL:トラックバックURL(Ping送信先URL)らしいが私が試みた限りでは反映されなかった。
  • 返り値は投稿に成功したら記事ID、失敗したらfaultである。


記事を編集する(既存の記事に上書き投稿する)

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>blogger.editPost</methodName>
<params>
<param>
<value><string>アプリケーションキー</string></value>
</param>
<param>
<value><string>記事ID</string></value>
</param>
<param>
<value><string>ログインユーザー名</string></value>
</param>
<param>
<value><string>ログインパスワード</string></value>
</param>
<param>
<value><string>記事本文(上書き)</string></value>
</param>
<param>
<value><boolean>公開/非公開</boolean></value>
</param>
</params>
</methodCall>
  • パラメータは新規投稿用のAPIと同じである。
  • metaWeblog APIでも同様にmetaWeblog.editPostで上書き可能である。

登録されているカテゴリーの一覧を取得する

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>mt.getCategoryList</methodName>
<params>
<param>
<value><string>ブログID</string></value>
</param>
<param>
<value><string>ログインユーザー名</string></value>
</param>
<param>
<value><string>ログインパスワード</string></value>
</param>
</params>
</methodCall>
  • 返り値はカテゴリーIDとカテゴリー名である。


記事のカテゴリーを変更する

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>mt.setPostCategories</methodName>
<params>
<param>
<value><string>記事ID</string></value>
</param>
<param>
<value><string>ログインユーザー名</string></value>
</param>
<param>
<value><string>ログインパスワード</string></value>
</param>
<param>
<value>
<array>
 <data>
<value>
<struct>
<member>
<name>categoryId</name>
<value><string>カテゴリーID</string></value>
</member>
<member>
<name>isPrimary</name>
<value><boolean>1</boolean></value>
</member>
</struct>
</value>
 </data>
</array>
</value>
</param>
</params>
</methodCall>
  • Movable Type XML-RPC API仕様では複数のカテゴリーの指定と、第1カテゴリの指定が可能だが、Seesaaブログで指定できるカテゴリーはひとつだけである。


参考リンク




変更履歴
・2016年1月6日:シンタックスハイライトを適用。その他字句や表記の細かい修正。
・2013年1月28日:公開設定についてSeesaaに問い合わせた件を追加。その他字句や表記の細かい修正。