はてなダイアリーとEvernote

最近使ってるEvernoteが結構使い勝手がいい。
が、容量制限があったりと腹立たしいので、ここからはてなにアウトプットする。


やりたいこと

  • 何らかの方法で判別されるノート(タイトルやタグに"はてな"がふくまれるとか)について

それが判別された時点ではてなダイアリーに投稿される
(あるいは、判別しかつ末尾に任意の識別子が見つかったら、それは書き終わったとされ、投稿される。
こっちのほうがいいな)

  • 投稿済みのノートになんらかの修正が加わった場合、はてなダイアリー側の記事も修正される

(記事の識別、記事-ノートのバインド<-投稿日時を必ず追記、編集)

新しい記事の追加

これを使ってはてなダイアリーにアクセスする場合、上記のページにもあるように以下のような
クラスを定義する必要がある

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がきちんと必要らしい。
はてなのページを参考にすると

GET /{はてなID}/atom/blog/{date}/{entry_id}

という形式で日記エントリを取得している
つまりclient.get_entry('http://d.hatena.ne.jp/kayn_koen/atom/blog/{data}/{entry_id}')
とすればいいらしい。


このエントリが結構曲者のようで上記ページの説明では

  • はてなID
  • date:
    • 意味:日記の日付
    • 書式:YYYYMMDD (例: 20080101)
  • entry_id:
    • 意味:エントリのID
    • 書式:epochを表す数値 (例: 1227232862) または、英数字文字列

となっている。

日付はともかくとして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">
                &lt;div class="section"&gt;
                        &lt;p&gt;This is the test content&lt;/p&gt;
                        &lt;p&gt;here you see that what i have written?&lt;/p&gt;
                        &lt;p&gt;hello?&lt;/p&gt;
                &lt;/div&gt;
      </content>
    </entry>
以下<entry></entry>が続く
</feed>

このentryノードがそれぞれの記事。
このノード内の

に現れるhrefのuriがget_entryで必要な引数の値になる。
のでまぁ最悪これをいちいち引っ張ってくればいいんだが・・・めんどいし賢いやり方じゃないなぁ
エントリのURIだけを引っこ抜いてくるような機能は無いものか