もう、こなったら、iphone用livedoorアプリの出力するXML見て、自前でXML組み立てるかな。

誰か助けてください。(切実)

俺日記 : [HELP ME!]perlでlivedoorに投稿するときのカテゴリ設定方法

誰か助けてください、とのことなのでお助けします。…と、その前に一つ注釈というか弁明というかしておくと、実はそのAPI、AtomPubの仕様が完全に固まる前に実験的に作られたもので(まだAtomPPとか呼ばれてたはず)、色んなところがすごく古いです。

結果は惨敗。生成されたXMLを見てみると、ちゃんとcategory要素が追加されてるんだけどなー。

<?xml version="1.0" encoding="utf-8"?>

<entry xmlns="http://www.w3.org/2005/Atom">
  <title>ちょっとテスト(すぐ消します)</title>
  <content type="xhtml">
    <div xmlns="http://www.w3.org/1999/xhtml">いっぱいのつぶやき</div>

  </content>
  <category term="カテゴリ"/>
</entry>
俺日記 : [HELP ME!]perlでlivedoorに投稿するときのカテゴリ設定方法

AtomAPIの仕様を確認したら、atom:categoryじゃなくてdc:subjectを見ていた。どうも当時、2004年くらいはカテゴリーを表す仕様がなかったようで、dc:subjectで代用していたらしい。良く見たらXML::Atom::EntryのUsageにもそんな例が書いてある。ということで、dc:subjectのエレメントを作ってつっこんでやればカテゴリが追加されます。

です、が。AtomAPIはもともと正式にサポートしているものでないブログのQ&A:APIのURLは? - livedoor ヘルプ)上、見ての通り古いものなのでそのうちふさがれます。livedoor Blogで正式に公開してるAPIは今現在はAtomPubAPIの方なので、今AtomAPIでうまく動かないとか、今後Blogと連携するアプリを作りたいとかの場合は、こっちを使って下さい。ちなみにiPhoneアプリはこれを使ってる。

AtomPub APIの方を使って元記事のコードを書くとこんな感じ。あと、AtomPub APIは認証方式がWSSEなので、XML::Atom::ClientじゃなくてAtompub::Clientを使う。

#!/usr/bin/env perl

use strict;
use warnings;
use Atompub::Client;
use XML::Atom::Entry;

my $client = Atompub::Client->new;
$client->username('username');
$client->password('apikey');

my $service     = $client->getService("http://livedoor.blogcms.jp/atom/");
my $article_url = $service->workspace->collection->href;

# ブログが一個しかない場合は↑のコードでarticle collectionのURLが取れるけど、
# (workspaceの一個目がメインブログで、collectionの一個目がarticle collectionだから)
# ちゃんとやる場合は以下のように全部列挙したりして必要なのを選んでください。
# my @workspaces = $service->workspaces;
# for my $ws (@workspaces) {
#     my @collections = $ws->collections;
#     for my $c (@collections) {
#         print $c->title . "\n";
#         print $c->href . "\n";
#     }
# }

my $entry    = XML::Atom::Entry->new;
my $category = XML::Atom::Category->new;
$category->term('つぶやき');
$entry->title('これは、訓練ではない。');
$entry->content('繰り返す、これは訓練ではない。');
$entry->category($category);
$client->createEntry( $article_url, $entry );

あと他にもいくつか独自要素があるとか、実はlivedoor以外のBlogger Allianceのブログでも使えるとか、iPhoneアプリの絡みでときどきアップデートされるとか、あんま使い過ぎるとスパム判定されるのでほどほどにしてね、とかあるけど、その辺は追い追いどっかにちゃんと書きますんで、Wikiとか見てて貰えると。