はてなダイアリーとEvernote
最近使ってるEvernoteが結構使い勝手がいい。
が、容量制限があったりと腹立たしいので、ここからはてなにアウトプットする。
やりたいこと
- 何らかの方法で判別されるノート(タイトルやタグに"はてな"がふくまれるとか)について
それが判別された時点ではてなダイアリーに投稿される
(あるいは、判別しかつ末尾に任意の識別子が見つかったら、それは書き終わったとされ、投稿される。
こっちのほうがいいな)
- 投稿済みのノートになんらかの修正が加わった場合、はてなダイアリー側の記事も修正される
(記事の識別、記事-ノートのバインド<-投稿日時を必ず追記、編集)
はてなダイアリー from Ruby
はてなダイアリーAtomPubとかいうのを使うとRubyからはてなダイアリーの記事をいじくれるらしい。
詳しくはここ参照
http://d.hatena.ne.jp/keyword/%a4%cf%a4%c6%a4%ca%a5%c0%a5%a4%a5%a2%a5%ea%a1%bcAtomPub
http://rubyist.g.hatena.ne.jp/d4-1977/?word=*%5BRuby%5D
http://atomutil.rubyforge.org/rdoc/
なにはともあれ
> gem install atomutil
新しい記事の追加
これを使ってはてなダイアリーにアクセスする場合、上記のページにもあるように以下のような
クラスを定義する必要がある
module Atompub class HatenaClient < Client def publish_entry(uri) @hatena_publish = true update_resource(uri, ' ', Atom::MediaType::ENTRY.to_s) ensure @hatena_publish = false end private def set_common_info(req) req['X-Hatena-Publish'] = 1 if @hatena_publish super(req) end end end
これは定型で挟む必要のあるものなのでメモ。
あとの処理は参考ページに準じ、これで新しいエントリを追加することができる。
このとき、最後に:updated=>Time.nowとしているが、ここで事前にTime.nowを取得、
ノートに埋め込み、:updatedにもこれを指定する。
既存の記事の取得
client.methodsを調べると以下のようになった。
irb(main):061:0> client.methods => ["inspect", "clone", "public_methods", "display", "agent", "instance_variable _defined?", "to_yaml_properties", "update_media", "equal?", "freeze", "use_proxy ", "agent=", "to_yaml", "taguri", "resource", "methods", "respond_to?", "create_ media", "taguri=", "dup", "get_entry", "dclone", "instance_variables", "delete_e ntry", "request", "__id__", "method", "eql?", "create_entry", "to_yaml_style", " id", "publish_entry", "singleton_methods", "send", "get_categories", "update_ent ry", "taint", "frozen?", "instance_variable_get", "res", "__send__", "instance_o f?", "to_a", "type", "object_id", "instance_eval", "protected_methods", "==", "= ==", "req", "instance_variable_set", "rc", "extend", "kind_of?", "response", "de lete_media", "to_s", "get_service", "class", "hash", "private_methods", "=~", "t ainted?", "get_feed", "untaint", "nil?", "get_media", "is_a?"]
この中でエントリの取得に関係有りそうなのはget_entry,get_categories,get_media
get_entryについて
collection_uriを引数にすればいけるかなぁとおもったらだめで。
RDocをみてみると
def get_entry(entry_uri) get_resource(entry_uri) unless @rc.instance_of?(Atom::Entry) raise ResponseError, "Response is not Atom Entry" end @rc end
となっていて、ほしい記事のURIがきちんと必要らしい。
はてなのページを参考にすると
という形式で日記エントリを取得している
つまりclient.get_entry('http://d.hatena.ne.jp/kayn_koen/atom/blog/{data}/{entry_id}')
とすればいいらしい。
このエントリが結構曲者のようで上記ページの説明では
となっている。
日付はともかくとしてentry_IDはよくわからない。
結局今のところ、一度client.get_media(collection_uri)をすると
どうやらすべての記事がXML形式で入手できるようでこの構造は
<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <updated>2009-03-25T03:05:27+09:00</updated> <id>tag:d.hatena.ne.jp,2008:diary-kayn_koen</id> <title>Title</title> <author> <name>kayn_koen</name> </author> <link rel="self" href="http://d.hatena.ne.jp/kayn_koen/atom/blog"/> <link rel="next" href="http://d.hatena.ne.jp/kayn_koen/atom/blog?page=2"/> <entry> <updated>2009-03-25T03:05:27+09:00</updated> <published>2009-03-25T03:05:27+09:00</published> <app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T03:05:27+09:00</app:edited> <id>tag:d.hatena.ne.jp,2009:diary-kayn_koen-20090325-1237917927</id> <link rel="edit" href="http://d.hatena.ne.jp/kayn_koen/atom/blog/20090325/1237917927"/> <link rel="alternate" type="text/html" href="http://d.hatena.ne.jp/kayn_koen/20090325/1237917927"/> <author> <name>kayn_koen</name> </author> <title>Test Ent</title> <content type="html"> <div class="section"> <p>This is the test content</p> <p>here you see that what i have written?</p> <p>hello?</p> </div> </content> </entry> 以下<entry>〜</entry>が続く </feed>
このentryノードがそれぞれの記事。
このノード内の
に現れるhrefのuriがget_entryで必要な引数の値になる。
のでまぁ最悪これをいちいち引っ張ってくればいいんだが・・・めんどいし賢いやり方じゃないなぁ
エントリのURIだけを引っこ抜いてくるような機能は無いものか