2007年12月31日月曜日

Eclipseからブログを投稿して気づいたこと

数日前にJava Testなるブログを書いたけど、あれはEclipseから書いたものです。BloggerがAPIを公開していて、ugoさんが投稿できるというので試してみたのです。

Blogger Data API

#そうそう、すいません、最近、技術的なことも書いてしまっているので
#分からない人にはさっぱり分からないと思います。
#すっ飛ばしてください。

やってみると、超簡単でした。
基本、サンプルの通りだけど、投稿日は以下で設定できました。



 entry.setPublished(new DateTime(日付, TimeZone.getTimeZone("Asia/Tokyo")));



なんでこんなことをするか。
移行の下調べです。以前のページ、newlifeをBloggerに移行しようとしています。


手順はこんなです。

1.newlifeの日記を解析して、XMLにする

これエクセルマクロでやりました。エクセル上のデータを扱うわけではないのでマクロでやるメリットはほとんどないです。DOMなどのXMLパーサも使ってないです。プレインテキストを解析して、読みやすいXMLにします。

2.1のXMLをパースしてBlogger Data APIに渡す

ここはJavaですね。

以上。

の予定でした。

二つ問題がありました。

一つ目は1.で解析した結果、日記の文章をそのままというタグで囲ってしまったことです。年月をかけ、散々手書きしてきた不規則なHTMLを、マクロで自動解析し切れなかったため、細かい手作業が多く発生していました。これは仕方ないのだけど、2.で読もうとした時、日記中の本文のHTMLタグをXMLパーサが単純なテキストではなく、XMLエレメントとして認識してしまったのです。

あああそっか~!!(T0T)

既にかなりの手作業をしていたので後戻りできませんでした。

多分、簡単にXMLエレメントをXMLテキストに戻す手もあるんだろうけど、俺はよく分からないので、違うんだろうなあと思いつつ以下の間抜けなコードを書いて対応しました。


private String getText(Node node){
StringBuffer a = new StringBuffer();
for (int i = 0; i < node.getChildNodes().getLength(); i++){
Node n = node.getChildNodes().item(i);

switch (n.getNodeType()){
case Node.ELEMENT_NODE:
a.append(reverse(n));
break;
default:
a.append(n.getTextContent());
}
}
return a.toString();
}

private String reverse(Node node){
String text = "<" + node.getLocalName();
for (int i = 0; i < node.getAttributes().getLength(); i++){
Node n = node.getAttributes().item(i);
text += " " + n.getNodeName() + "=\"" + n.getNodeValue() + "\"";
}
if (getText(node).equals("")){
text += " />";
}else{
text += ">";
text += getText(node);
text += "</" + node.getLocalName() + ">";
}

System.out.println(text);
return text;
}


#は~。簡潔な方法教えてください。

なので、日記のHTMLタグは、

 HTMLタグ(テキスト)→XMLエレメント(オブジェクト)→HTMLタグ(テキスト)

となっていて、最終的なHTMLタグは最初とちょっと違っちゃってる、という事態を招いています。

つまり、XML記述をしているHTMLテキストをXML中でそのままテキストとして扱うなら、エスケープしておかなければならなかった、ということです。


二つ目は、連続投稿した結果、Bloggerが文字の確認を要求するようになってしまったこと。スパムとの区別がつかなくなったんでしょう。



結果、APIからの投稿ができなくなりました。例外は返してくれません。何事もなく通り抜けて、ブログが投稿できていない。確かに、抽出・登録・更新・削除等、こんなにDBライクに触れてサーバの負荷はええんかいな、という感覚はありましたが。

いつ解除されるんでしょう。

#どうやら、50件の連続投稿で文字の確認を要求されるようになります。
#1時間以上かけての連続投稿も駄目でした。
#それから、文字の確認は、数日(1日?)で要求されなくなりました。

0 件のコメント: