EvernoteAPIを利用したEvernoteのノート検索

evernote_oauthパッケージを用いたEvernoteAPIの初歩的な利用について紹介します。

EvernoteAPIではNoteStoreを取得し、
そのNoteStoreに実装されているメソッドを利用することで
対象とするEverenoteアカウントの情報(ノートブック、ノート、ノート本文など)
を取得することができます。
さらに、検索フィルターを設定することで
条件に合致する情報に絞って取得することも可能です。
なお、EvernoteAPIの仕様はこちらのWebページにまとめられています。


下記のサンプルコードは
1:対象とするノートブック名を入力し、
2:そのノートブック内のノートの一覧から任意のノート名(またはその一部)を入力し、
3:そのノートの本文を取得する
というものです。
なお、トークン取得はこちらのblogを参考にさせていただきました。

# -*- coding: utf-8 -*-
require "evernote_oauth"

#NoteStore取得 クライアントはsandboxアカウントを利用
token      = "ここはトークンIDを記述する"
client     = EvernoteOAuth::Client.new(:token => token, :sandbox => true)
note_store = client.note_store

#ノートブック取得
notebooks = note_store.listNotebooks(token)

puts "ノートブック一覧"
notebooks.each { |notebook| puts "  * #{notebook.name}"}

notebooksguid = 0
begin
    print "利用するノートブックの名前を入力してください:"
    notebook_name = gets.chomp
    
    # GUIDをとりたいノートブックの名前
    note_store.listNotebooks.select do |notebook|
        if notebook.name == notebook_name then
            notebooksguid = notebook.guid
        end
    end

 
rescue Exception => e
    puts e.message
    print notebook_name + "を含むノートは見つかりませんでした\n"
    retry
end        


# 検索条件として、検索語なし、指定したノートブック、更新日順ソートを指定
filter              = Evernote::EDAM::NoteStore::NoteFilter.new
filter.notebookGuid = notebooksguid
filter.order        = Evernote::EDAM::Type::NoteSortOrder::UPDATED
	
# 検索結果として、タイトル名のみを指定
resultSpec = Evernote::EDAM::NoteStore::NotesMetadataResultSpec.new 
	
# noteList にノート 10 件のタイトルを取得
noteMetaList = note_store.findNotesMetadata(token,filter,0,10,resultSpec)
	
#各ノートのタイトルを表示
noteMetaList.notes.each { | note |
 noteEdam = note_store.getNote(token, note.guid, 1,0,0,0)
    puts noteEdam.title
}

#対象ノートブックの中から任意の検索語によるノートを検索
print  "ノートブック:" + notebook_name + "\n"
print  "ノート検索(end=>fin):"
spec         = Evernote::EDAM::NoteStore::NotesMetadataResultSpec.new 
filter.words = ""

while (1)

    #見つからなかった時の例外処理
    begin
        if (filter.words = gets.chomp) == "end" then
            break
        end
    
        guid     = note_store.findNotesMetadata(token, filter, 0, 1,spec).notes[0].guid
        noteEdam = note_store.getNote(token, guid, 1,0,0,0)
        content  = noteEdam.content

        bodyHead = "<en-note>"
        bodyEnd  = "</en-note>"
        body     = content[ content.index(bodyHead)+bodyHead.length .. content.index(bodyEnd)-1 ]
    rescue Exception => e
        print filter.words + "を含むノートは見つかりませんでした\n"
        print  "ノート検索(end=>fin):"
        retry
    end        
        
    brTag = '<br clear="none"/>'
    body.gsub!(brTag,"\n")
    body.gsub!("<div>","")
    body.gsub!("</div>","")
    body.gsub!("&quot;",'"')
    body.gsub!("&lt;","<")
    body.gsub!("&gt;",">")

    print  "タイトル:" + noteEdam.title + "\n"
    puts   body
    print   "\nノート検索(end=>fin):"

end