使用Python操作Evernote API

標(biāo)題圖

Evernote本身就是很好的筆記應(yīng)用帘腹,其API又賦予了我們更多的自由,值得花點(diǎn)時(shí)間嘗試许饿。

本文將結(jié)合代碼和理論阳欲,介紹如何使用這些API。

在閱讀完成本文后陋率,你將能夠完成類似PackMemo的程序球化。

配置環(huán)境

配置Python

  • 本教程使用Python 2.7.11,別的版本如果有什么奇怪的問題可以聯(lián)系我補(bǔ)進(jìn)去好了(攤手)
  • pip install evernote:Evernote的包可以通過pip很容易的安裝
  • pip install requests:為了使用OAuth瓦糟,需要安裝requests包
  • 記得在需要使用這兩個(gè)包的時(shí)候加上import evernote, requests

配置印象筆記開發(fā)環(huán)境

沙盒環(huán)境配置

  • 這里配置的沙盒和Token的具體介紹在后面系統(tǒng)結(jié)構(gòu)一節(jié)中哦
  • 這里配置的三樣?xùn)|西建議拿個(gè)小notepad記一下
  • 進(jìn)入沙盒登陸頁面創(chuàng)建賬戶即可

沙盒賬戶開發(fā)者Token獲取

  • 進(jìn)入沙盒登陸頁面并登陸(網(wǎng)絡(luò)沒問題的話可以忽略這一步)
  • 進(jìn)入沙盒開發(fā)者Token獲取沙盒開發(fā)者Token(記得要復(fù)制全哦)

普通賬戶開發(fā)者Token獲取

  • 進(jìn)入印象筆記官網(wǎng)登陸(其實(shí)也可以忽略這一步筒愚,但下面的網(wǎng)址鏈接不太穩(wěn)定)
  • 進(jìn)入印象筆記開發(fā)者Token獲取開發(fā)者Token

進(jìn)度確認(rèn)

  • 那么現(xiàn)在你應(yīng)該已經(jīng)配置好了所有環(huán)境并有一個(gè)記錄賬號(hào)的小本本
  • 關(guān)于環(huán)境,你應(yīng)該能夠在命令行里能夠運(yùn)行并不產(chǎn)生錯(cuò)誤提示:
    • python -c 'from evernote.api.client import EvernoteClient'
    • python -c 'import requests'
  • 以及記錄了沙盒賬戶及兩個(gè)開發(fā)者Token

系統(tǒng)結(jié)構(gòu)

印象筆記存在兩種賬戶菩浙,以及每種賬戶相同的兩種授權(quán)方式

授權(quán)方式

想要使用印象筆記的API巢掺,肯定需要先獲得某個(gè)賬戶的授權(quán)(授權(quán)進(jìn)入他的筆記,對(duì)于我們來說就是授權(quán)自己使用啦)

印象筆記的授權(quán)方法有兩種

  • 一種是程序提交某一賬戶的開發(fā)者Token劲蜻,顯示已經(jīng)被授權(quán)陆淀,獲取授權(quán)。
from evernote.api.client import EvernoteClient

devToken = "沙盒或者普通賬戶的Token"
client = EvernoteClient(token = devToken)
  • 另一種是程序提交賬號(hào)和密碼先嬉,用戶在特定的網(wǎng)頁端確認(rèn)授權(quán)時(shí)間轧苫,獲取授權(quán)。
    • 這是一種較為復(fù)雜的認(rèn)證方法疫蔓,官方在SDK中有給出普通的認(rèn)證方式
    • 這種方式需要獲得需申請(qǐng)的API Key
    • 我這里給出了命令行認(rèn)證方式(這不是正常的認(rèn)證方法含懊,也許哪一天就不能用了)
    • 輪子都造好了何必再去造一遍呢,所以有興趣或者問題的可以郵件聯(lián)系我
  • 如果認(rèn)證失敗會(huì)出現(xiàn)失敗提示衅胀,所以沒有失敗這一部分就算完成了
  • 通過這兩種方法可以獲取一個(gè)EvernoteClient類岔乔,這是之后一切的開始

值得注意的是,并非所有授權(quán)都獲得了所有的權(quán)限

  • 通過OAuth方式獲得的普通賬戶授權(quán)拗小,出于安全考慮是受到限制的。
  • 受限的方法會(huì)在API表中特別提示

后文用到的token變量即開發(fā)者Token授權(quán)方式的devToken或是OAuth方式獲取的token

賬戶

  • 賬戶分為兩種樱哼,分別為沙盒賬戶與普通賬戶
  • 沙盒賬戶只能通過網(wǎng)頁登陸
  • 沙盒賬戶和普通賬戶的各特殊功能網(wǎng)頁的網(wǎng)址之間都有著相同的區(qū)別哀九,例如:
服務(wù) 地址
沙盒 https://sandbox.evernote.com/api/DeveloperToken.action
產(chǎn)品 https://app.yinxiang.com/api/DeveloperToken.action

數(shù)據(jù)結(jié)構(gòu)

總體而言剿配,各數(shù)據(jù)的獲取順序?yàn)椋篣serStore, NoteStore -> Notebook -> Note -> Resource

關(guān)于筆記阅束、筆記本的操作全部都是NoteStore類的方法呼胚,需要傳入指向需要操作的對(duì)象的guid

獲取Notebook、Note息裸、Resource類用于讀取內(nèi)容與獲取其guid

UserStore蝇更,用戶信息

  • 在獲取了EvernoteClient類的變量client后(見系統(tǒng)結(jié)構(gòu)節(jié)),很容易的就可以獲取UserStore類
  • 這個(gè)類里面存儲(chǔ)了有關(guān)用戶信息呼盆、授權(quán)的內(nèi)容(其實(shí)除了用戶信息其他的都暫時(shí)用不到)
# 獲取類
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后(見系統(tǒng)結(jié)構(gòu)節(jié)),很容易的就可以獲取NoteStore類
  • 所有對(duì)筆記本访圃、筆記進(jìn)行的操作都需要通過該類完成厨幻,包括創(chuàng)建、刪除筆記腿时、筆記本
# 獲取類
noteStore = client.get_note_store()
# 獲取筆記本數(shù)量
print('There are {} notebooks in your account'.format(len(noteStore.listNotebooks())))

Notebook况脆,筆記本

  • 通過NoteStore類的listNotebooks方法可以獲取一個(gè)包含所有筆記本的列表
  • 在客戶端視圖中存在筆記本的嵌套,但實(shí)際上數(shù)據(jù)存儲(chǔ)中所有筆記本都在同一層
  • 其下的筆記并不能通過該類的某個(gè)屬性或者方法獲取
  • 具體的屬性可以參照這里
# 打印每個(gè)筆記本的名字與guid
for notebook in self.noteStore.listNotebooks():
    notebookName = notebook.name
    notebookGuid = notebook.guid
    print('{}: {}'.format(notebookName, notebookGuid))

Note批糟,筆記

  • 獲取某一筆記本下的筆記較為復(fù)雜
    • 需要先通過NoteFilter類設(shè)定一個(gè)篩選規(guī)則
    • 然后通過NoteStore類的方法獲取所有滿足這一規(guī)則的筆記
  • 其內(nèi)容(content)是ENML格式的文本
  • 具體的屬性可以參照這里
# 列出第一個(gè)筆記本中的所有筆記的標(biāo)題
notebookGuid = noteStore.listNotebooks()[0]
f = NoteStore.NoteFilter()
f.notebookGuid = notebookGuid
for note in noteStore.findNotes(token, f, 0, 999).notes:
    print(note.title)

進(jìn)度確認(rèn)

  • 目前應(yīng)當(dāng)可以通過命令行獲取四種主要的數(shù)據(jù)類型
  • 簡(jiǎn)單的測(cè)試一下:以一定格式輸出某一個(gè)或某幾個(gè)特定名字的筆記本中的所有筆記
# 格式為
筆記本1:
    筆記1
    筆記2
筆記本2:
    筆記3
  • 以下為實(shí)現(xiàn)代碼:
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類的方法徽鼎,所以調(diào)用的方式為NoteStore.deleteNote(token, guid)

其次盛末,token為上述的開發(fā)者Token或者OAuth獲取到的token

再次,從圖中第七行可以看出纬傲,guid的為GUID of the note to delete满败,下面是Note的介紹

Note

那么,只要獲取到Note叹括,就可以獲得guid算墨。

所以,最后一步汁雷,根據(jù)已經(jīng)介紹過的印象筆記的數(shù)據(jù)結(jié)構(gòu)净嘀,我們知道如果獲取Note

以下為代碼:

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, '要?jiǎng)h除的筆記的名字'))

其余的方法相差不大,也就不一一贅述厢漩,你可以在這里找到所有你需要的東西

一些基礎(chǔ)的方法我進(jìn)行了一定的包裝與簡(jiǎn)化膜眠,寫了一個(gè)簡(jiǎn)單的EvernoteController,希望在你嘗試的時(shí)候能夠給予你一些啟發(fā)。

你現(xiàn)在已經(jīng)獲得了完成文首處提到的PackMemo所需要的所有知識(shí)宵膨,可以開始嘗試就自己的需求寫應(yīng)用了架谎!

結(jié)束語

希望讀完這篇文章能對(duì)你有幫助,有什么不足之處萬望指正(鞠躬)辟躏。

有什么想法或者想要關(guān)注我的更新谷扣,歡迎來GithubStar或者Fork

160308

LittleCoder

EOF

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捎琐,一起剝皮案震驚了整個(gè)濱河市会涎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瑞凑,老刑警劉巖末秃,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拨黔,居然都是意外死亡蛔溃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門篱蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贺待,“玉大人,你說我怎么就攤上這事零截◆锶” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵涧衙,是天一觀的道長(zhǎng)哪工。 經(jīng)常有香客問我,道長(zhǎng)弧哎,這世上最難降的妖魔是什么雁比? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮撤嫩,結(jié)果婚禮上偎捎,老公的妹妹穿的比我還像新娘。我一直安慰自己序攘,他們只是感情好茴她,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著程奠,像睡著了一般丈牢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞄沙,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天己沛,我揣著相機(jī)與錄音慌核,去河邊找鬼。 笑死申尼,一個(gè)胖子當(dāng)著我的面吹牛遂铡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晶姊,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伪货!你這毒婦竟也來了们衙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤碱呼,失蹤者是張志新(化名)和其女友劉穎蒙挑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愚臀,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忆蚀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姑裂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋袜。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舶斧,靈堂內(nèi)的尸體忽然破棺而出欣鳖,到底是詐尸還是另有隱情,我是刑警寧澤茴厉,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布泽台,位于F島的核電站,受9級(jí)特大地震影響矾缓,放射性物質(zhì)發(fā)生泄漏怀酷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一嗜闻、第九天 我趴在偏房一處隱蔽的房頂上張望蜕依。 院中可真熱鬧,春花似錦泞辐、人聲如沸笔横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吹缔。三九已至,卻和暖如春锯茄,著一層夾襖步出監(jiān)牢的瞬間厢塘,已是汗流浹背茶没。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晚碾,地道東北人抓半。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像格嘁,于是被迫代替她去往敵國和親笛求。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容