Hatena::Groupnadesiko

そっとなでしこ RSSフィード


メインのブログに書くまでもない、なでしこ学習帳【記事一覧】 【このブログは何?】


特設!→【目次】なでしこ用Twitter 連携ライブラリ「なこったー」で遊ぶ


2012-05-23

はてなダイアリーAtomPubを使い、投稿日時を指定して記事を投稿する

| はてなダイアリーAtomPubを使い、投稿日時を指定して記事を投稿する - そっとなでしこ を含むブックマーク はてなブックマーク - はてなダイアリーAtomPubを使い、投稿日時を指定して記事を投稿する - そっとなでしこ

 はてなダイアリーAtomPub を使って日記エントリーを投稿する場合、投稿日時を指定することが可能であると、はてなが公開している技術者向け情報には書かれている。コレクションURIに対してリクエストXML文書をPOSTする際に、updated要素に投稿日時が指定できるのだ。

updated要素 日記エントリーを投稿する日時を指定します。この指定を行わなかった場合、投稿を行った日時が利用されます。


■投稿日時を指定したupdated要素が無視される不具合が…

 ところが、技術者向け情報ページに書かれているリクエストXML文書サンプルを実際にPOSTしても、投稿日時を指定したupdated要素が無視されてしまう不具合が発生する。

この要素は無視されます。必ず操作日時が投稿日時になるようです。


■原因は、サンプルのリクエストXML文書のXML名前URIが古いこと

 投稿日時が反映されない原因は、どうやら、はてなが公開している技術者向け情報に書かれたサンプルのリクエストXML文書のXML名前URIが古いこと、らしい。


teahut

新旧名前 (http://www.w3.org/2005/Atom, http://purl.org/atom/ns#) が混在してるからおかしなことになってるのかも.
(2008/02/22 )
link

したがって、サンプルのリクエストXML文書の

<entry xmlns="http://purl.org/atom/ns#">

<entry xmlns="http://www.w3.org/2005/Atom">

置換すればOK。

 リクエストXML文書のXML名前URIが古いと何故に投稿日時だけが反映されない不具合が発生するのか、の理屈はよく分らないけれどw

XML名前URIは、http://www.w3.org/2005/Atom となったようです。


嘘を嘘と見抜けないと(はてなのドキュメントを読むのは)難しい。

■「なでしこ」でのサンプル

 日本語プログラミング言語「なでしこ」 で書いた簡単なサンプルを提示する。

 実際に以下のサンプルを動かす場合は、「#設定」箇所で宣言されている3つの変数「user」「pass」「API」を各自の環境に応じて書き換える必要ある

  • 「user」…自分のはてなIDを記入する
  • 「pass」…自分のはてなIDのログインパスワードを記入する
  • API」…コレクションURI以下の書式で設定する
http://d.hatena.ne.jp/{はてなID}/atom/blog

※投稿先が、はてなダイアリープラスの複数ブログ機能 を利用したダイアリーの場合は、「{はてなID}」を「{はてなID}+{ブログID}」に置き換える。


#-----------------------------------------------------------------------
#設定
#-----------------------------------------------------------------------
userは「」
passは「」
APIは「http://d.hatena.ne.jp/mame-tanuki/atom/blog」

#-----------------------------------------------------------------------
#WSSEヘッダ
#-----------------------------------------------------------------------
userとpassからWSSEヘッダ生成
それをHEADに代入

#-----------------------------------------------------------------------
#メイン
#-----------------------------------------------------------------------
リクエストは、「<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
<title>[test]日記エントリータイトル</title>
<updated>1999-01-01T12:12:12+09:00</updated>
<content type="text/plain">
日記エントリー本文
- はてな
- 記法
</content>
</entry>」。

リクエストは、リクエストをUTF8N変換。
HEADとリクエストをAPIへHTTPポスト
SJIS変換
HTMLエンティティ復号
それを言う。
終わる。

■【要注意】投稿日時が秒単位まで同じ記事があると上書きが発生

 はてなダイアリーAtomPubを使い投稿日時を指定して記事を投稿する場合、一つ注意点がある

 はてなダイアリーに投稿した記事のエントリーIDは、投稿日時のUNIXを示す数字になっている。すると、投稿日時が秒単位まで同じ記事はエントリーIDが重複してしまう。

 エントリーIDが重複した場合どうなるのか?結論を言えば、後から投稿した記事に、既存の記事がタイトルも本文も上書きされてしまう。

 この問題については、また別の記事で詳述したい。


【関連記事】

2012-05-20

【目次】はてなダイアリーAtomPubを使ってみたのだが、もう俺は限界かもしれない(打ち切り予定)

| 【目次】はてなダイアリーAtomPubを使ってみたのだが、もう俺は限界かもしれない(打ち切り予定) - そっとなでしこ を含むブックマーク はてなブックマーク - 【目次】はてなダイアリーAtomPubを使ってみたのだが、もう俺は限界かもしれない(打ち切り予定) - そっとなでしこ

 ちょっとしたツールを作りかけて途中で放り出そうとしているのだけど、色々と得る事があったので約1年ぶりにこのブログを更新し、情報を残しておきたい。

【どんな人が対象?】

 これから書く一連の記事の対象となる読者は、以下のような極めてニッチな層である

 ただし、投稿日時を指定する機能の必要性が無い、つまり投稿日時が現在の日時と一緒で問題無いという場合は、はてなダイアリーAtomPubを使ったツールではなく、メール投稿するツールを作ることをオススメしたい。メール投稿の方が、同等の機能をずっとシンプルなプログラムで実現できると思う。

 また、投稿日時を指定する機能の必要性は無いけど、どうしても、はてなダイアリーAtomPubを「なでしこ」で使ってみたいという人は、kkk6さん のソースコードを参考にするのが近道。


 WSSE認証のシンプルなサンプルを見たい場合は、こちらの記事が参考になる。

【目次】

■はてなダイアリーAtomPubドキュメントの落し穴

 はてながHatena Developer Center で公開している「はてなダイアリーAtomPub」に関する技術文書は充分な管理がされておらず、内容の違い(投稿日時を指定した投稿etc)や説明不足、現状には即していない古い情報がある。はてなダイアリーAtomPubの利用者がつまづきそうな点(つまり、実際に私が悩まされたポイント)について、技術文書の内容を訂正したり、補足できる事をまとめ、記録に残しておきたい。

■「なでしこ」で、はてなダイアリーAtomPubを使う際の注意点