Python 小工具配合 Evernote 完成每周工作安排 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
NxnXgpuPSfsIT
V2EX    Python

Python 小工具配合 Evernote 完成每周工作安排

  •  
  •   NxnXgpuPSfsIT
    littlecodersh 2016-05-17 20:08:24 +08:00 3388 次点击
    这是一个创建于 3487 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因:

    近期看 Evernote API 的时候发现印象笔记对 Python 非常友好,就试了一下各类操作。

    刚好一直觉得用过的那些备忘、代办软件功能太乱还不如拿记事本或者短信记。就用印象笔记写一个,反正摆脱不了印象笔记,就干脆都存在里面。

    用过一段时间以后发现备份和检索功能还不错,也可以把一些文档做链接放进去。

    其实身边的 API 都可以通过 Python 用起来,简单的利用也会有不错的效果。

    有什么想法或者问题,欢迎和分享!

    演示用的软件可以在我的Github,或者360 云盘(0fe0)上下载。

    演示视频

    我把简单的演示放在了优酷上,如果对演示感兴趣可以看下去。

    演示中没有示范如何安装 evernote 的包,pip install evernote一下就好了。

    演示主要分为配置 Secret Key 、使用、配置快捷启动,具体的文字说明我写在了后面。

    用途

    • 该玩具将会将上周的 Memo (在 Memo 笔记本组中)备份到 S-Memo 笔记本组(如果有的话)
    • 用一份空白 Memo 替代旧 Memo

    配置

    配置 Python 及程序

    • pip install evernote:安装 evernote 包
    • pip install requests:如需要使用 Oauth ,安装 requests 包
    • Memo 样式可以通过修改模板文件content.enex调整
    • 存放位置与工作安排的名字可以通过修改PackMemo.py 4-6 行配置

    配置 Secret Key

    • 进入印象笔记官网登陆(其实也可以忽略这一步,但下面的网址链接不太稳定)
    • 进入印象笔记开发者 Token获取开发者 Token
    • 将获取到的开发者 Token 添加到 EvernoteController.py 第 21 行单引号内(->21 DEV_TOKEN = '')

    使用

    • python PackMemo.py:将会自动登录完成日志创建与存储
    • Win+R pm <CR>: Windows 系统内配置好快捷启动后即可使用

    配置快捷启动

    • Win+R %systemroot%/system32 <CR>:打开文件夹
    • PackMemo.bat创建快捷方式并重命名为pm
    • pm拖入文件夹

    程序细节

    EvernoteController.py

    • 示例程序:基本的笔记操作
    e = EvernoteController() e.create_notebook('Notebook1') e.create_note('Hello', '<en-note>Hello, world!</en-note>', 'Notebook1') e.create_notebook('Notebook2') e.show_notes() e.move_note('Notebook1/Hello', 'Notebook2') e.show_notes() e.delete_note('Notebook2/Hello') # deleting notebook can only be available when you use developer token for your own evernote e.delete_notebook('Notebook1') e.delete_notebook('Notebook2') e.show_notes() 
    • 可以选择是否开启本地存储与 Oauth 验证(就是账号密码登陆)
    • 笔记指定方式通过myfile方法确定为Notebook/Note
    • 删除操作仅在使用开发者 Token 时可以使用,否则仅能移入已删除的文件文件夹( API 限制)
    • 完整版 EvernoteControler.py 包含其余组件,如果感兴趣可以再做研究

    Memo.py

    • 通过替换将日期周数等内容
    • 关于 enex 的文档格式,文档的内容都在<en-note>标签里面
    • 建议有什么需要的格式自己导出一份研究就可以了,这里是扩展阅读

    PackMemo.bat

    • 虽然演示视频中把快捷方式直接放到了%systemroot%/system32 下面,但还是得说,这不是一个好习惯
    • 建议确定一个别的文件夹,专门用来放各类快捷启动,然后把这个文件夹加入环境变量
    • 没准就有人觉得有用呢(摊手)

    API

    快速入门

    • 官方对于 Python 很友善,读完这里就能有个大致的了解
    • 整个 API 的框架分为 OAuth (使用开发者 Token 的话直接获取 EvernoteClient 即可)和常用方法
    • 仅是小应用的话可以不用了解 OAuth
    • OAuth 原意不是通过命令行实现,但还是可以通过一定的方法实现,官方文档见这里

    权限

    印象笔记有两种权限类型,开发者权限和普通权限。

    • 开发者权限:沙盒内与使用开发者 Token (仅能操作本人账号)时的权限,可以使用所有的方法
    • 普通权限:用户可以通过输入账号密码和点击确认给予用授权,可以使用绝大部分方法,具体操作见Oauth.py

    获得授权后会获得一个 Token ,在各种方法中都会使用到

    通过这个 Token 即可获取 EvernoteClient, userStore, noteStore

    if SANDBOX: client = EvernoteClient(token=self.token) else: client = EvernoteClient(token=self.token, service_host=SERVICE_HOST) userStore = client.get_user_store() noteStore = client.get_note_store() 

    基本方法

    Function: NoteStore.deleteNote为例演示如何使用 API ,以下为官方介绍:

    Function: NoteStore.deleteNote

    首先,由于其为 NoteStore 类的方法,所以调用的方式为NoteStore.deleteNote(token, guid)

    其次, token 为上述的开发者 Token 或者有兴趣的话为 OAuth 获取到的 token

    再次,从图中第七行可以看出, guid 的为GUID of the note to delete,下面是Note的介绍

    Note

    那么,只要获取到 Note ,就可以获得 guid 。

    所以,最后一步,这里牵扯到印象笔记的数据结构,了解即可

    • 通过NoteStore.listNotebooks获取 Notebook 列表,找到需要的 Notebook 的 guid (和 Note 的 guid 不同)
    • 通过NoteStore.findNotes设置特定笔记本的NoteFilter获取 Note 列表,找到需要的 Note
    • 调用 NoteStore.deleteNote 方法即可以生效

    值得一提的是,某些操作需要特殊的权限, sandbox 中和使用开发者 Token 时可以使用不代表外部可以使用

    结束语

    希望读完这篇文章能对你有帮助,有什么不足之处万望指正(鞠躬)。

    有什么想法或者想要关注我的更新,欢迎来GithubStar或者Fork

    160517

    LittleCoder

    EOF

    mongost3t
        1
    mongost3t  
       2016-05-18 18:27:38 +08:00
    evernote 包不支持 python3 ,创建 note 还得手动加 en-note 的 tag ,一大堆 thrift ,不知道友好在哪……

    倒是挺稳定,申请 production api 也会给批
    NxnXgpuPSfsIT
        2
    NxnXgpuPSfsIT  
    OP
       2016-05-18 21:12:31 +08:00
    @mongost3t
    py3 的 sdk 可以用这个 https://github.com/evernote/evernote-sdk-python3 ,我用下来基础操作没什么问题,可以一试。
    说友好是因为入门的介绍和例程都给的很到位,过渡到 api 表完全没有瓶颈。
    <en-note>是别人的文件内容嘛,为了区分自家的标记和普通的标记。
    多了一个<en-note>我感觉还是好处多一点,就最常见的,文章里的附件、图片什么的只要写<en-media>就行。
    看来是同道中人,之后开发可以多交流:)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1248 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 17:17 PVG 01:17 LAX 09:17 JFK 12:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86