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)為例演示如何閱讀官方介紹格了,以下為官方介紹:
首先,由于其為NoteStore類的方法徽鼎,所以調(diào)用的方式為NoteStore.deleteNote(token, guid)
其次盛末,token為上述的開發(fā)者Token或者OAuth獲取到的token
再次,從圖中第七行可以看出纬傲,guid的為GUID of the note to delete
满败,下面是Note的介紹
那么,只要獲取到Note叹括,就可以獲得guid算墨。
所以,最后一步汁雷,根據(jù)已經(jīng)介紹過的印象筆記的數(shù)據(jù)結(jié)構(gòu)净嘀,我們知道如果獲取Note
- 通過NoteStore.listNotebooks獲取Notebook列表,找到需要的Notebook的guid(和Note的guid不同)
- 通過NoteStore.findNotes設(shè)置特定筆記本的NoteFilter侠讯,通過NoteStore.findNotes獲取Note列表挖藏,找到需要的Note
- 調(diào)用NoteStore.deleteNote方法即可以生效
以下為代碼:
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)注我的更新谷扣,歡迎來Github上Star或者Fork。
160308
LittleCoder
EOF