├── README.md
└── tool.py
/README.md:
--------------------------------------------------------------------------------
1 | # EvernoteDup
2 |
3 | ## 简介
4 | 将印象笔记账户中的笔记复制到evernote账户中
5 | 如果需要将evernote账户中的笔记转移到印象笔记账户中或在印象笔记账户之间转移请使用[NoteDup](https://appcenter.yinxiang.com/app/notedup/windows/)
6 |
7 | ## 使用方法
8 | 1. 安装python2.7
9 | 2. 安装evernote sdk `pip install evernote`
10 | 3. 获取两个账户的token
11 | 获取方法
12 | * 生成开发者token
13 | **需要向客服申请权限**
14 | * [印象笔记账户token获取](https://app.yinxiang.com/api/DeveloperToken.action)
15 | * [evernote账户token获取](https://www.evernote.com/api/DeveloperToken.action)
16 | * 从浏览器中获取
17 | 1. 登陆网页版
18 | * [印象笔记网页版](https://app.yinxiang.com/Login.action)
19 | * [evernote网页版](https://www.evernote.com/Home.action?login=true)
20 | 2. 打开浏览器开发者模式后刷新主页
21 | 
22 | 将图中auth后的内容分别保存
23 | 4. 将获得的token填写在相应的位置
24 | 
25 | 5. 运行程序
26 | 
27 |
28 | ## 效果
29 | * 可以复制笔记本的名称,对应的笔记本组,**不能**复制笔记本的分享等属性
30 | * 可以复制笔记的所有内容,包括附件和标签到对应名称的笔记本
31 | * 可以复制所有标签和其上下级关系
32 |
33 | ## 参考
34 | * [印象笔记API使用_豆瓣](https://www.douban.com/note/578622628/)
35 | * [使用Python操作Evernote API_简书](https://www.jianshu.com/p/bda26798f3b3)
36 | * [印象笔记开发者文档](https://dev.yinxiang.com/doc/)
37 | * [sdk-python-demo](https://github.com/evernote/evernote-sdk-python/blob/master/sample/client/EDAMTest.py)
38 |
--------------------------------------------------------------------------------
/tool.py:
--------------------------------------------------------------------------------
1 | from evernote.api.client import EvernoteClient
2 | from evernote.edam.notestore import NoteStore
3 | import evernote.edam.type.ttypes as Types
4 | '''
5 | 将印象笔记中的笔记转移到evernote中
6 | 1.初始化两个账户
7 | 2.复制笔记本列表
8 | 3.复制标签列表
9 | 4.复制笔记
10 | '''
11 | #两个账户的token
12 | source_dev_token = 'source account token'
13 | dest_dev_token = 'destination account token'
14 | #获取某一个笔记本下的全部笔记
15 | def getNotesByNotebookGuid(noteStore,notebookGuid):
16 | f = NoteStore.NoteFilter()
17 | f.notebookGuid = notebookGuid
18 | return noteStore.findNotes(f, 0, 999).notes
19 | #按名查找笔记本
20 | def findNotebookByName(notebooksList,notebookName):
21 | for notebook in notebooksList:
22 | if notebook.name == notebookName:
23 | return notebook
24 | #将传入的笔记本列表中的对象在账户中创建
25 | def createAllNotebooks(noteStore,notebooksList):
26 | for notebook in notebooksList:
27 | try:
28 | newNotebook = Types.Notebook()
29 | newNotebook.name = notebook.name
30 | newNotebook = noteStore.createNotebook(newNotebook)
31 | except Exception as e:
32 | pass
33 | else:
34 | pass
35 | finally:
36 | pass
37 | #设置笔记本的笔记本组
38 | def setNotebookStack(source_notebooksList, dest_notebooksList):
39 | for source_notebook in source_notebooksList:
40 | if source_notebook.stack == None:
41 | continue
42 | dest_notebook = findNotebookByName(dest_notebooksList, source_notebook.name)
43 | dest_notebook.stack = source_notebook.stack
44 | #将设置笔记本组后的笔记本对象在账户中进行更新
45 | def updateNotebooks(noteStore, notebooksList):
46 | for notebook in notebooksList:
47 | noteStore.updateNotebook(notebook)
48 | #按名查找标签
49 | def findTagByName(tagsList,tagName):
50 | for tag in tagsList:
51 | if tag.name == tagName:
52 | return tag
53 | #按guid查找标签
54 | def findTagByGuid(tagsList,tagGuid):
55 | for tag in tagsList:
56 | if tag.guid == tagGuid:
57 | return tag
58 | #将传入的标签列表的对象在账户中进行创建
59 | def createAllTags(noteStore,tagsList):
60 | for tag in tagsList:
61 | try:
62 | newTag = Types.Tag()
63 | newTag.name = tag.name
64 | newTag.updateSequenceNum = tag.updateSequenceNum
65 | noteStore.createTag(newTag)
66 | except Exception as e:
67 | pass
68 | else:
69 | pass
70 | finally:
71 | pass
72 | #设置标签的上下级关系
73 | def setParentTag(source_tagsList,dest_tagsList):
74 | for source_tag in source_tagsList:
75 | if source_tag.parentGuid == None:
76 | continue
77 | dest_tag = findTagByName(dest_tagsList, source_tag.name)
78 | parentTag = findTagByName(dest_tagsList, findTagByGuid(source_tagsList, source_tag.parentGuid).name)
79 | dest_tag.parentGuid = parentTag.guid
80 | #将更新上下级关系后的标签对象在账户中进行更新
81 | def updateTags(noteStore,tagsList):
82 | for tag in tagsList:
83 | noteStore.updateTag(tag)
84 | #获取包括资源等信息的完整笔记
85 | def getFullNote(noteStore,noteGuid):
86 | return noteStore.getNote(noteGuid, True, True, True, True)
87 | #将传入的笔记对象在账户中进创建
88 | def createNote(noteStore,note):
89 | noteStore.createNote(note)
90 | #依次复制每个笔记本中的所有笔记
91 | def copyAllNotes(source_noteStore,dest_noteStore,source_notebooksList,dest_notebooksList,source_tagsList,dest_tagsList):
92 | for notebook in source_notebooksList :
93 | print 'copying notebook:' + notebook.name
94 | notesList = getNotesByNotebookGuid(source_noteStore, notebook.guid)
95 | for note in notesList:
96 | print ' copying note ' + note.title
97 | newNote = getFullNote(source_noteStore, note.guid)
98 | newNote.guid = None
99 | newNote.notebookGuid = findNotebookByName(dest_notebooksList, notebook.name).guid
100 | if newNote.tagGuids != None:
101 | for i in range(len(newNote.tagGuids)):
102 | tagGuid = newNote.tagGuids[i]
103 | newNote.tagGuids[i] = findTagByName(dest_tagsList, findTagByGuid(source_tagsList,tagGuid).name).guid
104 | createNote(dest_noteStore, newNote)
105 | #源账户初始化
106 | source_client = EvernoteClient(token=source_dev_token,sandbox=False,china=True)
107 | source_userStore = source_client.get_user_store()
108 | source_user = source_userStore.getUser()
109 | source_noteStore = source_client.get_note_store()
110 | #目标账户初始化
111 | dest_client = EvernoteClient(token=dest_dev_token,sandbox=False,china=False)
112 | dest_userStore = dest_client.get_user_store()
113 | dest_user = dest_userStore.getUser()
114 | dest_noteStore = dest_client.get_note_store()
115 | #读取源账户的笔记本列表,并在目标账户中创建相同的笔记本,再更新笔记本的笔记本组
116 | source_notebooksList = source_noteStore.listNotebooks()
117 | createAllNotebooks(dest_noteStore, source_notebooksList)
118 | dest_notebooksList = dest_noteStore.listNotebooks()
119 | setNotebookStack(source_notebooksList, dest_notebooksList)
120 | updateNotebooks(dest_noteStore, dest_notebooksList)
121 | #读取源账户的标签列表,在目标账户中创建相同的标签,再更新标签的上下级关系
122 | source_tagsList = source_noteStore.listTags()
123 | createAllTags(dest_noteStore, source_tagsList)
124 | dest_tagsList = dest_noteStore.listTags()
125 | setParentTag(source_tagsList, dest_tagsList)
126 | updateTags(dest_noteStore,dest_tagsList)
127 | #复制笔记
128 | copyAllNotes(source_noteStore, dest_noteStore, source_notebooksList, dest_notebooksList, source_tagsList, dest_tagsList)
129 |
--------------------------------------------------------------------------------