API

2010年05月25日

Evernoteから簡単にノートを取り出すスクリプトをバージョンアップした。
動作環境の準備については、前のエントリを参照していただくとして。

使い方は、以下のとおり。
キーワードを1つ引数で指定し、そのキーワードにマッチするノートのリストを得る。 そして、最初にヒットしたノートの本文を表示する。
キーワードと工夫し、よく参照するノート固有のキーワードをタグなどでつけておけば、webやクライアントを起動することなくノートの内容を簡単に参照できる。

$ ruby note.rb KEYWORD

以下のオプションを追加した。

-gノートの識別子GUIDを直接してしてノートを取り出す。GUIDは、キーワードサーチしたときのノートリストにタイトルと共に表示している。
-rノートを表示するときに、
タグを外したり、アンパサンドや不等号マークなどを変換して表示しているが、このオプションを付けると、そうした変換をせず、そのまま表示する。

-gオプションをつけて、GUIDを直接指定する場合は、以下のようになる。

$ ruby note.rb -g aaaaa-bbbbb-cccccc-ddddd-eeeeeeeee

ソースコード

note.rb
#!/usr/bin/ruby
#
# Evernote Simple note searcher
# ver.1.4 2010-05-25 Yasuki
#
require 'rubygems'
require 'optparse'
require 'pp'
require "thrift"
require "Evernote/EDAM/user_store"
require "Evernote/EDAM/user_store_constants.rb"
require "Evernote/EDAM/note_store"
require "Evernote/EDAM/limits_constants.rb"

#
# 引数チェック
if (ARGV.size==0)
puts "Usase: note.rb <SearchWord>"
puts "Usase: note.rb -g <GUID>"
exit 1
end

#
# 初期値
guid=""
raw=0
username="LOGINNAME"
password="LOGINPASSWORD"
consumerKey = "CONSUMERKEY"
consumerSecret = "CONSUMERSECRETKEY"
userStoreUrl = "https://sandbox.evernote.com/edam/user"
noteStoreUrlBase = "http://sandbox.evernote.com/edam/note/"
#userStoreUrl = "https://www.evernote.com/edam/user"
#noteStoreUrlBase = "http://www.evernote.com/edam/note/"

userStoreTransport = Thrift::HTTPClientTransport.new(userStoreUrl)
userStoreProtocol = Thrift::BinaryProtocol.new(userStoreTransport)
userStore = Evernote::EDAM::UserStore::UserStore::Client.new(userStoreProtocol)

#
# 認証
authResult = userStore.authenticate(username, password,
consumerKey, consumerSecret)
user = authResult.user
authToken = authResult.authenticationToken
puts "Authentication was successful for #{user.username}"

#
# ノート取得準備
noteStoreUrl = noteStoreUrlBase + user.shardId
noteStoreTransport = Thrift::HTTPClientTransport.new(noteStoreUrl)
noteStoreProtocol = Thrift::BinaryProtocol.new(noteStoreTransport)
noteStore = Evernote::EDAM::NoteStore::NoteStore::Client.new(noteStoreProtocol)

#
# オプション解析
opt=OptionParser.new
opt.banner="This program is easy evernote searcher."
opt.version="1.4"

opt.on("-g GUID","--guid", "note id.") { |v|
guid = v.to_s
}
opt.on("-r","--raw", "Don't replace specific charactors") { |v|
raw = 1
}
opt.on_tail("-h", "--help", "Show this message.") { |v|
puts opt
exit 1
}
opt.on_tail("-v", "--version", "Show version.") { |v|
puts opt.version
exit 1
}
searchword=opt.parse!(ARGV).to_s

# ノートの検索
if searchword.size >= 1 then
search = Evernote::EDAM::NoteStore::NoteFilter.new
search.words = searchword
res = noteStore.findNotes(authToken, search, 0, 100)
# 検索リストの表示
puts "------------------------"
puts "Find note: " + searchword
puts "------------------------"
res.notes.each do |note|
printf("%s %s\n", note.title, note.guid)
end
guid=res.notes[0].guid
end

# ノート本文の取得
noteEdam=noteStore.getNote(authToken, guid, 1,0,0,0)

#
# ノートの表示
puts "------------------------"
puts noteEdam.title
puts "------------------------"
c=noteEdam.content
bodyHead="<en-note>"
bodyEnd="</en-note>"
body=c[ c.index(bodyHead)+bodyHead.length .. c.index(bodyEnd)-1 ]
if raw==0 then
brTag='<br clear="none"/>'
body.gsub!(brTag,"\n")
body.gsub!("<div>","")
body.gsub!("</div>","")
body.gsub!("&quot;",'"')
body.gsub!("&lt;","<")
body.gsub!("&gt;",">")
end
puts body


sylphide_ffr31mr at 21:48コメント(0)トラックバック(0) 

2010年05月15日

EvernoteのAPI KEYが届いたので、サンプルプログラムをまねして、APIをいじってみた。
API KEYは、申請から7時間後に届いた。(夕方に申請したので、米国が活動時間だったと思う)

1.準備

(1)API KEYの申請

以下のフォームに必要事項を記入して申し込む。

http://www.evernote.com/about/developer/api/

メールで、consumer keyとconsumer secretが送られてくるので、それをプログラムに埋め込む。
最初の段階では、実験用システム(sandbox)にしか登録されないので、デバッグ等をそのシステムで行う。
本番システムのAPI KEYをもらうには、再度申請が必要。その場合も、同じフォームでよい、と思う。案内のメールには、本番用の申請方法は書いてなかった。
sandboxのシステムには、本番と同じくwebアクセスをして、自分でuser IDとパスワードを再登録しないといけない。
ノートも空っぽなので、実験用のノートも新たに作っておかなければならない。

(2)Evernote APIのライブラリをダウンロードする。

$ cd ~/ruby
$ wget http://evernote.s3.amazonaws.com/api/evernote-api-1.15.zip
$ unzip evernote-api-1.15.zip

(3)展開したライブラリにPATHを通す

ふたつのパスを設定することに注意。

$ export RUBYLIB=$RUBYLIB:~ruby/evernote-api-1.15/lib/ruby:~/ruby/evernote-api-1.15/lib/ruby/Evernote/EDAM

2.サンプルプログラム

サンプルプログラムは、以下を使った。というか、rubyはこれしかない。
認証系は、ほぼサンプルのまま。

~/ruby/evernote-api-1.15/sample/ruby/EDAMTest.rb

3.作成するプログラム機能

キーワードを1つ引数で指定し、そのキーワードにマッチするノートのリストを得る。
そして、最初にヒットしたノートの本文を表示する。
キーワードと工夫し、よく参照するノート固有のキーワードをタグなどでつけておけば、webやクライアントを起動することなくノートの内容を簡単に参照できる。

$ ruby note.rb KEYWORD

4.ソースコード


最新バージョンはこちら


note.rb
#!/usr/bin/ruby
#
# Evernote Simple note searcher
# ver.1.1 2010-05-14 Yasuki
#
require 'rubygems'
require 'pp'
require "thrift"
require "Evernote/EDAM/user_store"
require "Evernote/EDAM/user_store_constants.rb"
require "Evernote/EDAM/note_store"
require "Evernote/EDAM/limits_constants.rb"

#
# 初期値
username="LOGINNAME"
password="LOGINPASSWORD"
consumerKey = "CONSUMERKEY"
consumerSecret = "CONSUMERSECRETKEY"
userStoreUrl = "https://sandbox.evernote.com/edam/user"
noteStoreUrlBase = "http://sandbox.evernote.com/edam/note/"

userStoreTransport = Thrift::HTTPClientTransport.new(userStoreUrl)
userStoreProtocol = Thrift::BinaryProtocol.new(userStoreTransport)
userStore = Evernote::EDAM::UserStore::UserStore::Client.new(userStoreProtocol)

#
# Version Check
versionOK = userStore.checkVersion("Ruby EDAMTest",
Evernote::EDAM::UserStore::EDAM_VERSION_MAJOR,
Evernote::EDAM::UserStore::EDAM_VERSION_MINOR)
if (!versionOK)
puts "Is my EDAM protocol version up to date? #{versionOK}"
exit(1)
end

#
# 認証
authResult = userStore.authenticate(username, password,
consumerKey, consumerSecret)
user = authResult.user
authToken = authResult.authenticationToken
puts "Authentication was successful for #{user.username}"
#puts "Authentication token = #{authToken}"

noteStoreUrl =
noteStoreUrlBase + user.shardId
noteStoreTransport = Thrift::HTTPClientTransport.new(noteStoreUrl)
noteStoreProtocol = Thrift::BinaryProtocol.new(noteStoreTransport)
noteStore = Evernote::EDAM::NoteStore::NoteStore::Client.new(noteStoreProtocol)

#
# ノートの検索
search = Evernote::EDAM::NoteStore::NoteFilter.new
search.words = ARGV[0]
res = noteStore.findNotes(authToken, search, 0, 100)

#
# ノートリストの表示
puts "------------------------"
puts "Find note: " + ARGV[0]
puts "------------------------"
res.notes.each do |note|
printf("%s %s\n", note.title, note.guid)
end

#
# ひとつめのノートの表示
bodyHead="<en-note>"
bodyEnd="</en-note>"
brTag='<br clear="none"/>'

guid=res.notes[0].guid
noteEdam=noteStore.getNote(authToken, guid, 1,0,0,0)

puts "------------------------"
puts noteEdam.title
puts "------------------------"
c=noteEdam.content
# puts c
# puts "=============================="
body=c[ c.index(bodyHead)+bodyHead.length .. c.index(bodyEnd)-1 ]
body.gsub!(brTag,"\n")
body.gsub!("<div>","")
body.gsub!("</div>","")
body.gsub!("&quot;",'"')
body.gsub!("&lt;","<")
body.gsub!("&gt;",">")
puts body


5.出力例

$ ruby note.rb tv
Authentication was successful for LOGINNAME
------------------------
Find note: tv
------------------------
TV予約 aaaaa-bbbbb-cccccc-ddddd-eeeeeeeee

------------------------
TV予約
------------------------
[テレビ予約リスト]
ハートキャッチプリキュア 日  8:30 テレビ朝日
花咲ける青少年           日 23:00 NHK BS2
ふしぎ大好き    月  9:00 NHK教育
ドラえもん      金 19:00 テレビ朝日

[ 放送終了]
シュガーバーニーズ 金  8:00 kidsチャネル
とある科学                 土 1:30 MX
キディーガーランド   土 2:30 MX
ささめきこと    木  2:20 テレビ東京
涼宮ハルヒの憂鬱  土  2:30 Tokyo MX
グインサーガ    日 23:29 NHK BS2
ジパング      木 22:30 アニマックス
戦場のヴァルキリア 火 14:00 アニマックス
鉄のラインバレル  水 00:00 Kidsチャネル
電脳コイル     火 20:00 NHK BS2
東京マグニチュード 金  0:45 フジテレビ
夏目友人帳     月 17:30 テレビ東京
亡念のサムド 水 23:30 MX
Monster 金 2:00 Animax
東のエデン 金 00:45 フジ
デスノート   火   23:00 アニマックス
エウレカ 木 23:00 キッズステーション



sylphide_ffr31mr at 20:30コメント(0)トラックバック(0) 
記事検索
最新コメント
livedoor プロフィール
月別アーカイブ
  • ライブドアブログ