Perl で昔に書いた
Japanese Blogger Update Info の後継として、Blogger ブログの更新情報を掲載する GAE/J アプリを製作中。
Google アカウントと結び付けられた Blogger ブログを登録してもらって、トップページで時系列の更新情報を紹介。cron で一定時間(今のところ 5 分間隔)で Update というサーブレットが起動されるようにしていて、そこからまた TaskQueue で、各ブログのフィードへアクセスして更新を確認する Check サーブレットを複数起動する。全部チェックし終わったら更新されたブログのリスト(HTML)を作って、Memcache へ格納。トップページでそのキャッシュを表示、のようなことをしているのだけれど…。
ブログの投稿フィードのコンテント取得で一晩はまる。
GoogleService myService = new GoogleService("blogger", "kuribo-example-1");
Feed resultFeed = myService.getFeed("http://kuribo-programming.blogspot.com/feeds/posts/summary?max-results=1&redirect=false", Feed.class);//フィード取得。実際のフィード URL は Datastore から取得。
Entry entry = resultFeed.getEntries().get(0);//フィード記載の第 1 エントリ
String title = entry.getTitle().getPlainText();//タイトル
String url = entry.getLink("alternate", "text/html").getHref();//URL
String content = entry.getTextContent().getContent().getPlainText();//コンテント
のようにしていたところ、タイトルや URL は取れるが、コンテント(ブログ投稿の本文)が取れない。結局なんだったかというと、アクセスするフィード URL が悪かった。
Blogger のブログ投稿フィードは full(全文)、summary(冒頭)、default(ブログオーナーが設定している全文・冒頭のどちらか)の 3 種類でアクセスできるが、summary でアクセスした場合本文は <content type='html'> に入らずに <summary type='text'> に入るということが判明。そりゃ取れないや。
通信量を減らそうと summary にしていたのがアダとなったみたい。
http://kuribo-programming.blogspot.com/feeds/posts/full?max-results=1&redirect=false
にアクセスすれば、問題なしにコンテントが取れた。ううむ。まだまだ Blogger 研究が足りない。
追記(2010-01-11):
と思っていたんだけれど…、full ではエラーが出るフィードがあることに、
アプリを公開してから気づく。
Blogger でフィードの公開設定を「完全」でなく「先頭のみ」にしていると、full では取れない…。「完全」の場合は、full でも summary でもフィードを取れるので、勘違いしていた。
…ということで、default でタイトルや URL などの情報をまず取得しておいて、コンテントが null だった場合にはまた別の処理(代替の方法が今思いつかないけど)を加えるのがよさそう。
追記(2010-01-11):
…って、
String summary = entry.getSummary().getPlainText();
で、サマリー取れるじゃないか、と今さら気づく。今までなんだったんだと思いつつ、おかげで知らなかった Blogger の Atom フィードの仕様が少し分かったので、まあよしとしよう。