Showing posts with label Blogger. Show all posts
Showing posts with label Blogger. Show all posts

2013-06-05

Blogger フィードを取ってくる GAE/J アプリで RuntimeException

最近あまり手を付けていなかった GAE/J アプリ Japanese Bloggers Info で、$1.0 / day を超えて 503 Over Quota(サービス停止)が頻発するようになった。

503 Over Quota on GAE/J

タスクキューで呼ばれた Blogger ブログのフィードの確認用サーブレットが何度も止まり、キューがいっぱいになるのが原因らしい。スタックトレースを見るとこんな感じ。

java.lang.RuntimeException: Unable to complete the HTTP request
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getHeader
at com.google.gdata.client.http.HttpGDataRequest.isOAuthProxyErrorResponse
at com.google.gdata.client.http.HttpGDataRequest.checkResponse
at com.google.gdata.client.http.HttpGDataRequest.execute
at com.google.gdata.client.http.GoogleGDataRequest.execute
at com.google.gdata.client.Service.getFeed
at com.google.gdata.client.GoogleService.getFeed

何で、急にこんな例外が出るようになったのかは不明だけれども、とりあえず、

http://example.blogspot.com/feeds/posts/summary?max-results=1&redirect=false

とブログ直下のフィードにアクセスさせていたのを、

http://www.blogger.com/feeds/BLOGID/posts/summary?max-results=1&redirect=false

と、Blogger にブログ ID を使って問い合わせてフィードを得る方法に変えてみたら(参考)、RuntimeException が出なくなった。ブログを登録してもらったときに、フィード URL のほかにブログ ID も保存していてよかったーと思った瞬間。…で、気になるお値段、Billing History もこの通り。

Billing History on GAE/J

日々の課金がみるみる減って、今は元の水準の $0.15 以内で推移している。どうせ最低でも週に $2.10 はかかる仕組みなので(参考)、日に $0.30 以内は許容範囲。釈然としないものをかかえつつも、とりあえずはめでたしと。

2013-04-21

Google+ と Blogger の連携に思うこと


こんな記事を書いておいてアレだけれども。 Blogger ブログの管理を Blogger アカウントから Google+ アカウントに移行できるようになったのが 2011 年の 10 月。移行すると 30 日で元の Blogger アカウントは削除される仕組み(ヘルプ)。

それに加えて、今回の新機能。有効にすると Google+ ユーザー以外は Blogger ブログにコメントできなくなる。

アカウント移行もコメント欄も今のところオプションなのが救いだが、Blogger が着々と Google+ に組み込まれていっている気が…。

Blogger アカウントが Google アカウントと紐つけられた時のように(参考)、いずれ Google+ に移行していないブログは、記事を更新できなくなったりして。いろんな使い方ができないという意味で、別のサービス同士が密接につながりすぎると、かえって使い勝手が悪くなるように思ったり。

2012-05-27

Blogger ブログ移行用、MovableType 形式のエクスポートデータの日付を変換するツール

最近投稿のタイトルが長くなってきている気がするのだけれど、まあ、表題の通り。


このツールで自動的にしてくれること:
  • 日本標準時(JST)をグリニッジ標準時(GMT)に変換。 (例: 5/5 08:34 → 5/4 23:34)
  • 24 時間制の時刻を 12 時間表記に。 (例: 23:34 → 11:34 PM)
  • 0 時台は 12 時台へ書き換え(Blogger の仕様)。 (例: 0:12 AM → 12:12 AM)

他のブログサービスのブログデータを Blogger へ移行するときに使用する、エクスポートファイル変換ツール MovableType2Blogger へデータを送る前に、こちらで日時変換を行っておくのがいいかと。






ちなみに、けっこうどうでもいいことだけれど、このツールのコードはこちら。
<script type="text/javascript">
<!--
function getGMTDate(s) {
  var d = new Date(s);
  var h = d.getUTCHours();
  var a;
  if (h > 11) {
    a = "PM";
    h -= 12;    
  } else {
    a = "AM";
  }
  if (h == 0) {
    h = 12;
  }
  return getDecimalNumber(d.getUTCMonth() + 1) + "/" + getDecimalNumber(d.getUTCDate()) + "/" + d.getUTCFullYear() + " " + getDecimalNumber(h) + ":" + getDecimalNumber(d.getUTCMinutes()) + ":" + getDecimalNumber(d.getUTCSeconds()) + " " + a;
}
function getDecimalNumber(n) {
  if (n >= 0 && n < 10) {
    return "0" + n;
  } else {
    return "" + n;
  }
}
function changeDate() {
  var raw = document.getElementById("datechangerin").value;
  var rslt = raw.replace(/^DATE: (.*)$/gm, function(a, b) {return "DATE: " + getGMTDate(b);});
  document.getElementById("datechangerout").value = rslt;
}
function selectResult() {
  document.getElementById('datechangerout').select();
}
//-->
</script>
<form action="" onsubmit="changeDate();return false;">
  <textarea id="datechangerin" name="" rows="10" cols="30"></textarea>
  <input type="submit" value="変換" />
  <textarea id="datechangerout" name="" rows="10" cols="30" readonly="readonly"></textarea>
  <input type="button" onclick="selectResult();" value="全選択" />
</form>
何かの参考になれば幸い。

2012-05-06

Blogger のガジェット更新用 API と「クリボウ式 Blogger カレンダー」の話

ずっと以前(もう 5 年以上前 !?)に公開していたカレンダーガジェット がいつの間にか動かなくなっていたので、修正。

試験的にこのブログのサイドバーにも追加してみたので、いろいろ触ってみるといいかと。

どの日付に投稿が存在するかのデータをフィード(JSON)で取ってきて、カレンダー上にリンク表示するというところまでは問題なかったのだけれど、投稿があるとされる日付リンクをクリックしてもその投稿を表示できなくなっていた。

このガジェットの投稿の表示の仕方は、画面遷移なしにブログの投稿エリアのデータだけを動的に差し替えるというもの。Blogger 自体の、ガジェットを編集したときなんかに、リフレッシュなしにその変更が反映される仕組みをそのまま利用している。


Blogger のガジェット更新用 API

たとえば、このブログのカレンダーで 2012-04-30 の日付クリックすると、呼び出すようになっているのが次の URL。

http://kuribo-programming.blogspot.com/?action=nextposts&widgetId=Blog1&widgetType=Blog&responseType=js&path=http%3a%2f%2fkuribo%2dprogramming%2eblogspot%2ecom%2fsearch%3fupdated%2dmin%3d2012%2d04%2d30T00%253A00%253A00%252B09%253A00%26updated%2dmax%3d2012%2d04%2d30T23%253A59%253A59%252B09%253A00%26max%2dresults%3d500

説明のために、青字部分を URL デコードすると、こう。

http://kuribo-programming.blogspot.com/search?updated-min=2012-04-30T00%3A00%3A00%2B09%3A00&updated-max=2012-04-30T23%3A59%3A59%2B09%3A00&max-results=500

アクセスしてみると分かるけれども、2012-04-30 の 00:00 から 23:59 に投稿されたデータを最大 500 件取ってきて表示するという、Blogger ブログの検索ページの URL をそのまま渡している。

あとは赤字部分のパラメータ指定で、取得した投稿データを Blog1 という ID のウィジェット(投稿ウィジェット)に表示するための JavaScript コードが得られる。

実際にアクセスすると、返ってくるコードはこんな感じ。赤字部分に実際の投稿データが入る。

try {
_WidgetManager._HandleControllerResult('Blog1', 'nextposts',{'renderedData': '...'});
} catch (e) {
  if (typeof log != 'undefined') {
    log('HandleControllerResult failed: ' + e);
  }
}


変更点

カレンダーガジェットに話を戻すと…。

ここまで説明してきた Blogger のガジェット(ウィジェット)更新用 API は、これまでと変わらず正確に動くのだけれど、問題はその呼び出し方。カレンダーでは、POST メソッドでパラメータを送っていたのだけれど、いつの間にか

405 Method Not Allowed

になっていたみたい。しょうがないので、日付クリック時には JSONP 的に script タグをドキュメント末尾に追加するようにして、その src に最初の URL を指定することにした。

「動かないし!」とカレンダーに見切りをつけた人も、もう一度ブログにつけてもらえると嬉しかったり…。ガジェット追加は、最初に掲示したリンク先から。


自分の備忘録として記事にしてみたけれども、Blogger ブログの一部分のコンテンツを動的に変えたいプログラマな人は、参考にしてもらえるといいかと。

2012-03-18

blogspot.jp にリダイレクトされてしまう Blogger ブログを再び blogspot.com/ncr にリダイレクトするためのスクリプト

Blogger ブログの blogspot.jp へのリダイレクト騒動と、/ncr でリダイレクトを一時的に停止できる件については、こちらを読んでもらうとして…。 読者に /ncr パラメータをわざわざつけてもらうというのは不可能に近いので、スクリプトで対応したらどうか、と思った次第。 <head> のすぐあとに入れておくのがいいかと。

<script type="text/javascript"> if (!location.hostname.match(/blogspot\.com$/)) {   location.href = "http://" + location.host.replace(/blogspot\.[a-z]+/, "blogspot.com") + "/ncr" + location.pathname + location.search + location.hash } </script>

いや、こういうこともできるよ、という参考程度に考えてもらえるとありがたい。Blogger(Google)の方針とは完全に逆の方向なので、おとがめがあるかもしれず…、あくまで導入は自己責任で。

参考:
追記:

と思ったけれど、このスクリプトだと、Google ウェブ検索のキャッシュで表示されたときにもリダイレクトしてしまいますね…。失敗。

こっちの方がよさそう。
再追記(2012-03-24):

追記で載せたリンク先のスクリプトも、blogspot.ca など、ほかの国別ドメインへリダイレクトされたときに、スクリプトが止まらなくなって無限ループに陥ってしまう問題があるみたい。「今のホストが blogspot.com じゃなかったら、blogspot.jp を blogspot.com へ書き換えた URL へジャンプする」という流れで、書き換えが行われなくてもページ移動してしまうため。

で、僕も再びスクリプトを書き直し。blogspot.ca とかの国別ドメインでも、Google ウェブ検索のキャッシュでも問題ないようになったはず。
<script type='text/javascript'>
var hostName = location.hostname;
if (!hostName.match(/blogspot\.com$/) &amp;&amp; hostName.match(/blogspot\.[^.]+$/)) {  
  location.href = "http://" + location.host.replace(/blogspot\.[^.]+/, "blogspot.com") + "/ncr" + location.pathname + location.search + location.hash;
}
</script>

Blogger ブログの blogspot.jp リダイレクトに関連して

Blogger が、日本からアクセスすると blogpot.jp に強制リダイレクトされてしまう件。
これって、Blogger ユーザーもそうだけれど、Blogger と連携することを意図して作られているブログパーツの開発者なんかも知っておいたほうがいいよね。

とか考えていて、思い出したのが自身の Blogger ブログへのトラックバック受信システム。 各投稿で表示するトラックバック情報は投稿 URL に基づいて管理してたっけ?と調べてみると、ブログ ID と投稿 ID とで管理していた。ブログ上でもちゃんと動いていて、ひと安心。 おおもとの Japanese Bloggers Info 自体も、登録 Blogger ブログの情報を ユーザー ID とブログ ID、投稿 ID で管理しているので、なんとかセーフ。

Blogger ブログは、読者の国によってドメインがリダイレクトされてしまうので、URL に基づいてデータを管理するのは危険ということを、Blogger と連携するプログラムを組む人にはぜひ知っておいてもらいたいなと思ったり…。

2011-05-29

GAE/J で com.google.gdata.util.ParseException: Invalid root element とか

Blogger には、個別投稿フィードなるものがあるので、
GoogleService gs = new GoogleService("blogger", "kuribo-japanesebloggers-1");
URL feedUrl = new URL("http://www.blogger.com/feeds/6813881014503035656/posts/summary/552385261504346376");
Feed feed = gs.getFeed(feedUrl, Feed.class);
Entry entry = feed.getEntries().get(0);
GAE/J で GoogleService を使って Blogger の個別投稿フィードを読み込ませようとしたら、

com.google.gdata.util.ParseException: Invalid root element, expected (namespace uri:local name) of (http://www.w3.org/2005/Atom:feed), found (http://www.w3.org/2005/Atom:entry

とかって言われてへこむ。なんだなんだと調べてみると、Blogger の個別投稿フィードは、通常の投稿フィード
<feed>
  <id/>
  <updated/>
  <title/>
  <subtitle/>
  <link/>
  <author/>
  <generator/>
  <entry/>
</feed>
のような構成ではなく、上記 entry 部からいきなり始まる形で、その投稿以外のブログ情報が全く掲載されないようになっているみたい。

ブログ ID +ポスト ID で投稿のタイトルや URL を取得しようと思っていたのが、ちょっぴり挫折。URLFetch して、XML のパーサを使うか、正規表現でゴリゴリするか、迷い中…。

2010-08-15

GAE/J、AuthSub で AuthenticationException …

アクセス解析にて「Japanese Bloggers Info 登録できない」という検索フレーズを発見、「えっ」と を確認してみると、確かにアプリケーションにブログを登録できず…。

問題は Blogger に所有ブログを問い合わせる際の AuthSub 認証で
com.google.gdata.util.AuthenticationException
が出ていたこと。

Google に登録している証明書の期限が切れたのかな? SSL は?とチェックしてみるも問題なし。うんうんうなること 10 数分…。最終的に、Google 先生に教えてもらいました。
String token = AuthSubUtil.getTokenFromReply(req.getQueryString());
token = URLDecoder.decode(token, "UTF-8");
URLデコードしてやれば良いようです。
これまでちゃんと動いていたんだけど、いつからデコードが要るようになったんだろう(汗)?アクセス解析をつけていて良かったとひしひしと感じた今日この頃。

検索してくれた人、ありがとう。プラス、この間ブログを登録できなかった人、すみません。

2010-06-13

GAE/J の AuthSub で This website has not registered with Google to establish a secure connection for authorization requests. の警告をなくす方法

GAE アプリから、 AuthSub 認証を使って Blogger などのデータにアクセスする際に出る警告がこちら。
This website has not registered with Google to establish a secure connection for authorization requests. We recommend that you continue the process only if you trust the following destination:
(このウェブサイトは認証リクエストに対して保護された接続を確立するよう Google に登録されていません。次のサイトが信頼できる場合のみ処理を続行してください:)
これを出なくさせたいなと思って調べてみたら、こちらがヒット。 そのままズバリなので、これ以上書く必要もないのだけれど…まあ一応。

ウェブサイトの登録

まず にアクセスして、「Add a New Domain」で自分の GAE アプリのドメインを入力する。「Manage registration」に「Manage YOURAPP.appspot.com」のように、入力したドメインが表示されるので、それをクリック。

Google Accounts Authentication API - Terms and Conditions を確認して、「I agree to the Terms of Service」ボタンを押下。ウェブサイトの管理ページが開くので、「Target URL path prefix」に認証後のトークン送信先 URL を入力し「Save」を押すと、Google へのウェブサイト登録が完了。

(場合によっては、ウェブサイトの「所有権の確認」が要る場合も。メタタグをサイトに追加するか、指示されたファイルをアップロードするかして、ウェブサイトの所有権を確認。)

再び AuthSub 認証を使ってみると警告文が変わっているはず。
This website is registered with Google to make authorization requests, but has not been configured to send requests securely. We recommend that you continue the process only if you trust the following destination:
X.509 自己署名証明書

「Google に登録されてはいるけれど、セキュアじゃないよ。」に警告が変わったので、次はセキュアトークンを送ってもらうための準備。 を参考に、X.509 の Self-signing Certificate を取得。Java の keytool が便利だった。
# Generate the RSA keys and certificate
keytool -genkey -v -alias Example -keystore example
  -keyalg RSA -sigalg SHA1withRSA
  -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain  View, ST=CA, C=US"
  -storepass changeme -keypass changeme
keytool -export -rfc -keystore example -storepass changeme -alias Example -file mycert.pem
作成された PEM ファイルを、前節の Google アカウント情報「Upload new X.509 cert:」にアップロード。keystore は GAE の war に入れて、アップロード。しなきゃ認証時に java.io.FileNotFoundException が出ちゃう。

GAE 側の設定

Google Account Authentication API からセキュアトークンを受け取ったり、実際にデータをやりとりしたりする GAE のページを SSL に対応させる。

appengine-web.xml の appengine-web-app 要素内に
<ssl-enabled>true</ssl-enabled>
を追加。

お好みで web.xml に
<security-constraint>
 <web-resource-collection>
  <url-pattern>/authsub</url-pattern>
 </web-resource-collection>
 <user-data-constraint>
  <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 </user-data-constraint>
</security-constraint>
をつけ加え(/authsub アクセス時は常に https になる)。

プログラム

Google Accounts Authentication API へのアクセスを要求する場合、
String next = "https://YOURAPP.appspot.com/authsub";
String scope = "http://www.blogger.com/feeds/"; //blogger にアクセスする場合
boolean secure = true;
boolean session = true;
String authSubLogin = AuthSubUtil.getRequestUrl(next, scope, secure, session);
とすると、authSubLogin にログイン用の URL が入るので、それでページにリンクを作成してアクセスしてもらう。

セキュアトークンを受け取って、実際にデータにアクセスするには、
String query = req.getQueryString();
String token = AuthSubUtil.getTokenFromReply(query);
PrivateKey privateKey = AuthSubUtil.getPrivateKeyFromKeystore("example", "changeme", "Example", "changeme");
String sessionToken = AuthSubUtil.exchangeForSessionToken(token, privateKey);

GoogleService myService = new GoogleService("blogger", "APPLICATIONNAME");//blogger にアクセスする場合
myService.setAuthSubToken(sessionToken, privateKey);
という風にするといいみたい(例外処理は省略)。後はもう好きなように
URL feedUrl = new URL("http://www.blogger.com/feeds/default/blogs");
Feed resultFeed = myService.getFeed(feedUrl, Feed.class);
とかすると、ユーザーが管理している Blogger ブログ一覧のフィードが取得できたりするわけ。

あ、セキュアトークン受け取りの URL を https に変えると、Google アカウント情報に指定する「Target URL path prefix」も方も https に変えとかないとね。

これで警告がすべてなくなるはずなんだけれど…、少し前にやったのを思い出しながら書いたので、思い違いや書き忘れがあるかも。後はより詳しい人のツッコミに期待。

2010-02-28

Blogger ブログの ID ではまる

PubSubHubbub の使い方がなんとなく分かったので、Japanese Bloggers Info に導入しようと試行錯誤。意外と色々なところに手を入れなければいけないことに気づいたので、ついでにデータの保管の仕方も変えてしまう。

Blogger ブログはユーザーが自由にブログの URL を変えられるので、URL をキーにするより、ブログ ID をキーにした方がよさそうな気がして変更。当初あまり考えずにエンティティグループを作っていたのも、全部解除してバラバラに。

問題は、そのブログ ID。この値は、ユーザーのブログ一覧フィードから
tag:blogger.com,1999:user-875683517854.blog-13722714
のような形で取得できるのだけれど、実際のブログの投稿フィードの方から取得すると
tag:blogger.com,1999:blog-13722714
のようにユーザー情報が抜け落ちる。

ブログをアプリケーションに登録するときには、ブログ一覧をもとに上の方の ID をキーにしてエンティティを作るものの、PubSubHubbub の更新通知で送られてくるフィードに記載されているブログ ID は、下のユーザー情報が記載されていない方。

この違いに気づかず、ブログ情報のエンティティ読み出しで随分はまってしまった。ID の表記が複数あるとは思わなかったし。

結局、ブログ情報のエンティティのキーを登録時からユーザー情報抜きの形に加工するようにして、解決。

PubSubHubbub の更新通知のフィードには URL も記載されているので、前の URL をキーにエンティティを作っていたときの方が、連携が楽だった気もしたり…。

2010-02-14

GAE/J で PubSubHubbub

今回は、Google App Engine for Java で PubSubHubbub を利用する話。

Japanese Bloggers Info、1 月に公開してから、現在の登録ブログ数が 250 近く。まだまだブログ数は伸びそうだけど、すでに CPU Time が 60% ぐらいになってしまっているので、なんとかしなくちゃと思っているところ。

ブログ更新の確認のために、cron と TaskQueue で、5 分ごとに全ブログのフィードにアクセスさせているのだけど、そこがやはり最も CPU を使っている部分。

ポーリングをやめていっそのこと PubSubHubbub にしてみたらどうだろう?と思って調べてみた。Blogger は Publisher として PubSubHubbub に対応しているので、こちらで Subscriber を用意すればいいというわけ。参考にしたのは、PubSubHubbub の仕様 と、実際の Hub。今ごろ気づいたけれど、これも GAE で動いてるんだ…。 この
http://pubsubhubbub.appspot.com/subscribe
という URL に、GAE アプリケーションから POST で Subscription Request を送る(パラメータはこちらを確認)と、hub.callback パラメータで送った Subscriber の更新通知用の URL に、折り返し確認の GET アクセスが来る。受け取ったアクセスのパラメータを確認(こちらを参考に)したら、そのまま hub.challenge の内容を本文にして、200 番台のステータスコードで返してやると、Hub への Subscribe 登録が成功。

最初の購読希望の POST アクセスは、Hub のデバッグページ(というか、ここが実際の Subscription Request の送り先…) から、フォームで送信できるので、色々テストしてみるのがよさそう。

購読登録が終了したフィードに更新があると、自動的にその更新部分のみを Atom フィードにして、POST で Subscriber の更新通知用の URL に送りつけてくれる。受け取ったという印に 200 番台のステータスコードを返せとのことだが、202 Accepted だと認識されず、5 回までリトライ、Failure のまま終了してしまった。200 OK を返してみると 1 回で認識。実際の Subscription 失敗の詳細は、前掲のデバッグページ「Subscriber Diagnostics」から確認できる。

更新情報の Atom フィードは POST の本文として送られてくるので、
Feed feed = new Feed();
try {
  feed.parseAtom(new ExtensionProfile(), req.getInputStream());
} catch (ParseException e) {
  e.printStackTrace(System.err);
}
という形で Feed にパースできる。後は
Entry entry = feed.getEntries().get(0);
String title = entry.getTitle().getPlainText();
String content = entry.getTextContent().getContent().getPlainText();
なり、なんなりと。

ということで、これはなかなか使えそうな予感。とはいえ、なかなかまとまった時間が作れないので、いつこれを組み込めることやら…ううむ。

2010-01-09

GAE/J、Blogger フィードのコンテントが取れない

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 フィードの仕様が少し分かったので、まあよしとしよう。

2009-12-09

GAE/J、Blogger API で右往左往

Google App Engine for Java で、現在 Blogger API をいじっているところ。GData クライアントライブラリについては、以下のサイトから gdata-src.java-*.**.*.zip をゲット。 解凍した gdata-src.java-*.**.*/gdata/java/lib ディレクトリの
  • gdata-blogger-*.*.jar
  • gdata-blogger-meta-*.*.jar
  • gdata-client-*.*.jar
  • gdata-client-meta-*.*.jar
  • gdata-core-*.*.jar
を GAE/J アプリケーションの war/WEB-INF/lib につっこんだ後、ビルドパスに通してみる。これでいいかなと動かしてみると、

java.lang.NoClassDefFoundError: com/google/common/collect/Maps

というエラー…。同じく解凍フォルダ gdata-src.java-*.**.*/gdata/java/deps の方の
  • google-collect-***.jar
  • jsr***.jar
というのも要ったみたい。

その後、実際に Google アカウントに関連する Blogger ブログ一覧を取得して表示してみる。ローカルでは OK。コードはほぼこれのとおり。 これをデプロイして動かしてみたところ、今度は

java.security.AccessControlException: access denied (java.net.NetPermission getCookieHandler)

という例外。これは appengine-web.xml への記載忘れが原因だったよう。 この記載で、ひとまずちゃんと動いた。間違って web.xml の方に記載して、ウンウンうなっていたというのは、内緒の話。

Zenback - Everyone's Related Posts