使用 Python 操做 Evernote API

本文做者: 伯樂在線 - LittleCoder 。未經做者許可,禁止轉載!
歡迎加入伯樂在線做者團隊php

Evernote自己就是很好的筆記應用,其API又賦予了咱們更多的自由,值得花點時間嘗試。html

本文將結合代碼和理論,介紹如何使用這些API。python

在閱讀完成本文後,你將可以完成相似PackMemo的程序。git

配置環境

配置Python

  • 本教程使用Python 2.7.11,別的版本若是有什麼奇怪的問題能夠聯繫我補進去好了(攤手)github

  • pip install evernote:Evernote的包能夠經過pip很容易的安裝編程

  • pip install requests:爲了使用OAuth,須要安裝requests包api

  • 記得在須要使用這兩個包的時候加上import evernote, requests安全

配置印象筆記開發環境

沙盒環境配置網絡

  • 這裏配置的沙盒和Token的具體介紹在後面系統結構一節中哦數據結構

  • 這裏配置的三樣東西建議拿個小notepad記一下

  • 進入沙盒登錄頁面建立帳戶便可

沙盒帳戶開發者Token獲取

  • 進入沙盒登錄頁面並登錄(網絡沒問題的話能夠忽略這一步)

  • 進入沙盒開發者Token獲取沙盒開發者Token(記得要複製全哦)

普通帳戶開發者Token獲取

  • 進入印象筆記官網登錄(其實也能夠忽略這一步,但下面的網址連接不太穩定)

  • 進入印象筆記開發者Token獲取開發者Token

進度確認

  • 那麼如今你應該已經配置好了全部環境並有一個記錄帳號的小本本

  • 關於環境,你應該可以在命令行裏可以運行並不產生錯誤提示:

    • python -c 'from evernote.api.client import EvernoteClient'

    • python -c 'import requests'

  • 以及記錄了沙盒帳戶及兩個開發者Token

系統結構

印象筆記存在兩種帳戶,以及每種帳戶相同的兩種受權方式

受權方式

想要使用印象筆記的API,確定須要先得到某個帳戶的受權(受權進入他的筆記,對於咱們來講就是受權本身使用啦)

印象筆記的受權方法有兩種

  • 一種是程序提交某一帳戶的開發者Token,顯示已經被受權,獲取受權。

 

 

1

2

3

4

from evernote.api.client import EvernoteClient

 

devToken = "沙盒或者普通帳戶的Token"

client = EvernoteClient(token = devToken)

  • 另外一種是程序提交帳號和密碼,用戶在特定的網頁端確認受權時間,獲取受權。

    • 這是一種較爲複雜的認證方法,官方在SDK中有給出普通的認證方式

    • 這種方式須要得到需申請的API Key

    • 我這裏給出了命令行認證方式(這不是正常的認證方法,也許哪一天就不能用了)

    • 輪子都造好了何須再去造一遍呢,因此有興趣或者問題的能夠郵件聯繫我

  • 若是認證失敗會出現失敗提示,因此沒有失敗這一部分就算完成了

  • 經過這兩種方法能夠獲取一個EvernoteClient類,這是以後一切的開始

值得注意的是,並不是全部受權都得到了全部的權限

  • 經過OAuth方式得到的普通帳戶受權,出於安全考慮是受到限制的。

  • 受限的方法會在API表中特別提示

後文用到的token變量即開發者Token受權方式的devToken或是OAuth方式獲取的token

帳戶

  • 帳戶分爲兩種,分別爲沙盒帳戶與普通帳戶

  • 沙盒帳戶只能經過網頁登錄

  • 沙盒帳戶和普通帳戶的各特殊功能網頁的網址之間都有着相同的區別,例如:

服務 地址
沙盒 https://sandbox.evernote.com/api/DeveloperToken.action
產品 https://app.yinxiang.com/api/DeveloperToken.action

數據結構

整體而言,各數據的獲取順序爲:UserStore, NoteStore -> Notebook -> Note -> Resource

關於筆記、筆記本的操做所有都是NoteStore類的方法,須要傳入指向須要操做的對象的guid

獲取Notebook、Note、Resource類用於讀取內容與獲取其guid

UserStore,用戶信息

  • 在獲取了EvernoteClient類的變量client後(見系統結構節),很容易的就能夠獲取UserStore類

  • 這個類裏面存儲了有關用戶信息、受權的內容(其實除了用戶信息其餘的都暫時用不到)

 

 

1

2

3

4

5

# 獲取類

userStore = client.get_user_store()

# 打印用戶名

print('Log in successfully as {}'.format(userStore.getUser().username))

if userStore.getUser().premiumInfo.premium: print('We are friends!')

NoteStore,筆記本倉庫

  • 在獲取了EvernoteClient類的變量client後(見系統結構節),很容易的就能夠獲取NoteStore類

  • 全部對筆記本、筆記進行的操做都須要經過該類完成,包括建立、刪除筆記、筆記本

 

 

1

2

3

4

# 獲取類

noteStore = client.get_note_store()

# 獲取筆記本數量

print('There are {} notebooks in your account'.format(len(noteStore.listNotebooks())))

Notebook,筆記本

  • 經過NoteStore類的listNotebooks方法能夠獲取一個包含全部筆記本的列表

  • 在客戶端視圖中存在筆記本的嵌套,但實際上數據存儲中全部筆記本都在同一層

  • 其下的筆記並不能經過該類的某個屬性或者方法獲取

  • 具體的屬性能夠參照這裏

 

 

1

2

3

4

5

# 打印每一個筆記本的名字與guid

for notebook in self.noteStore.listNotebooks():

    notebookName = notebook.name

    notebookGuid = notebook.guid

    print('{}: {}'.format(notebookName, notebookGuid))

Note,筆記

  • 獲取某一筆記本下的筆記較爲複雜

    • 須要先經過NoteFilter類設定一個篩選規則

    • 而後經過NoteStore類的方法獲取全部知足這一規則的筆記

  • 其內容(content)是ENML格式的文本

  • 具體的屬性能夠參照這裏

 

 

1

2

3

4

5

6

# 列出第一個筆記本中的全部筆記的標題

notebookGuid = noteStore.listNotebooks()[0]

f = NoteStore.NoteFilter()

f.notebookGuid = notebookGuid

for note in noteStore.findNotes(token, f, 0, 999).notes:

    print(note.title)

進度確認

  • 目前應當能夠經過命令行獲取四種主要的數據類型

  • 簡單的測試一下:以必定格式輸出某一個或某幾個特定名字的筆記本中的全部筆記

     

     

    1

    2

    3

    4

    5

    6

    # 格式爲

    筆記本1:

      筆記1

      筆記2

    筆記本2:

      筆記3

  • 如下爲實現代碼:

     

     

    1

    2

    3

    4

    5

    6

    7

    8

    def show_notes(noteStore, notebookList=[]):

      for nb in noteStore.listNotebooks():

          if nb in notebookList or not notebookList:

          print(nb.name + ':')

          f = noteStore.NoteFilter()

          f.notebookGuid = nb.guid

          for ns in noteStore.findNotes(self.token, f, 0, 999).notes:

              print(('' if notebook else '    ') + ns.title)

具體方法的使用示範

以刪除筆記操做(Function: NoteStore.deleteNote)爲例演示如何閱讀官方介紹,如下爲官方介紹:

Function: NoteStore.deleteNote

首先,因爲其爲NoteStore類的方法,因此調用的方式爲NoteStore.deleteNote(token, guid)

其次,token爲上述的開發者Token或者OAuth獲取到的token

再次,從圖中第七行能夠看出,guid的爲GUID of the note to delete,下面是Note的介紹

Note

那麼,只要獲取到Note,就能夠得到guid。

因此,最後一步,根據已經介紹過的印象筆記的數據結構,咱們知道若是獲取Note

如下爲代碼:

 

 

1

2

3

4

5

6

7

8

def find_note_guid(noteStore, noteName):

    for notebook in noteStore.listNotebooks():

        f = NoteStore.NoteFilter()

        f.notebookGuid = notebookGuid

        for note in noteStore.findNotes(token, f, 0, 999).notes:

            if note.title == noteName: return note.guid

 

noteStore.deleteNote(token, find_note_guid(noteStore, '要刪除的筆記的名字'))

其他的方法相差不大,也就不一一贅述,你能夠在這裏找到全部你須要的東西

一些基礎的方法我進行了必定的包裝與簡化,寫了一個簡單的EvernoteController,但願在你嘗試的時候可以給予你一些啓發。

你如今已經得到了完成文首處提到的PackMemo所須要的全部知識,能夠開始嘗試就本身的需求寫應用了!

結束語

但願讀完這篇文章能對你有幫助,有什麼不足之處萬望指正(鞠躬)。

有什麼想法或者想要關注個人更新,歡迎來GithubStar或者Fork

問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com 下載問啊APP,參與官方懸賞,賺百元現金。

QQ羣290551701 彙集不少互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

相關文章
相關標籤/搜索