摘要:这篇文章通过使用python的pyautogui 命令,完成了从印象笔记到Obsidian的文本内容批量迁移。
最近因为工作需要,要把印象笔记里的笔记迁移到Obsidian软件里。印象笔记本身是有python的API的。
印象笔记云 API - Python 快速入门指南 - 印象笔记开发者dev.yinxiang.com/doc/start/python.php
但是,它里面的API绝大部分都是用来进行软件内操作的,如果要进行跨软件迁移,那就不太方便。所以我就第一时间想到了使用 pyautogui来控制电脑的GUI进而实现这个功能,相当于让电脑帮助我批量做许多次复制粘贴操作,而不需要我自己进行大量的ctrl+c,ctrl+v操作。
如何安装pyautogui 可以看这里
PyAutoGUI使用 - 清风软件测试开发 - 博客园www.cnblogs.com/111testing/p/10758817.html
我们要做的工作分为以下步骤:
1.打开印象笔记
2.选择笔记
3.复制笔记标题
4.打开Obsidian
5.新建笔记
6.粘贴笔记标题
7.再次打开印象笔记
8.再次选择笔记
9.复制笔记
10.切换到下一条笔记
10.再次打开Obsidian
11.粘贴笔记内容
然后重复以上操作。
1.打开印象笔记
我们如何让程序打开印象笔记或者Obsidian呢?
我们可以给按钮截一个图,然后pyautogui 就可以通过对比屏幕和按钮截图的方法来知道需要点击什么按钮,点击图标即可打开印象笔记或者Obsidian。
for pos in pyautogui.locateAllOnScreen(r'A:\xxxxxx\obst.png'):#这里要选择存放截图的位置
x,y = pyautogui.center(pos)
pyautogui.doubleClick(x,y)
print("has click obstian")
截图识别的办法有两个问题,1.找的慢。相对直接点击速度慢。2.找不准。当屏幕元素多或者图标过于简单时这个方法不能找到对应元素。3.杀毒软件拦截
所以要寻找其他方法实现,我们注意到win下面有一条任务栏,当点击任务栏中的图标时,也可以唤起程序。
因此可以先将印象笔记和Obsidian固定在任务栏,然后利用pyautogui 唤起和切换程序。注意:任务栏的交互比较有趣,点击一次任务栏的图标会打开窗口,但如果再点击一次就会把窗口最小化,所以不要点击多次,否则会把窗口唤起然后再最小化。唤起程序的方法如下:
notepos = 800 #这里位置因人而异,和屏幕分辨率有关
pyautogui.click(notepos, 2800)
print("has click eventnote")
2.选择笔记标题和内容并复制
在成功唤起印象笔记的程序之后,我们就需要选择笔记-》复制笔记-》选择下一条笔记。如果我们采用截图-》识别图片-》点击图片所在位置的方法,显然不好实现,一方面是因为前面提到的识别率和识别速度的问题。另一方面是因为印象笔记的侧面笔记列表内容不固定,截图没法识别笔记。
我使用另一种方法实现:印象笔记有很多快捷键。所以只要我们打开并选中了印象笔记,我们就可以使用快捷键完成上述一系列复杂操作。
如果我们一开始选中一条笔记:则只要使用'ctrl', 'enter'就可以打开一个新窗口;使用'f2'可以重命名,让鼠标聚焦于标题;使用'alt', 'f4'就可以关闭这个新窗口;使用'ctrl', 'a'和 'ctrl', 'c'就可以全选笔记,复制笔记;使用'down'(也就是键盘上的下箭头)就可以切换到下一条笔记。
需要注意的是,如果我们打开了一个印象笔记的新窗口而没有关闭(也就是说此时印象笔记任务栏对应两个窗口),当我们点击任务栏上的印象笔记图标时,就不能唤起印象笔记,而只会打开两个或者多个悬浮窗。因此我们用代码打开新窗口之后要记得关闭,不然结果就会不可控。
可见,印象笔记的快捷键够用。而我们只需要理清上述操作的顺序,就能够成功的一条条复制印象笔记中的标题和内容。
复制笔记标题的操作如下:
pyautogui.click(notepos) # 点击任务栏中的图标
pyautogui.hotkey('ctrl', 'enter') # 打开一个新的窗口
pyautogui.hotkey('f2') # 利用重命名快捷键把鼠标放到笔记标题
pyautogui.hotkey('ctrl', 'c') # 复制笔记标题
pyautogui.hotkey('alt', 'f4') # 关闭窗口
复制笔记内容的操作如下:
pyautogui.hotkey('ctrl', 'enter')
time.sleep(4) # 之所以要等4秒的时间,是需要等待印象笔记中的内容加载完成。
pyautogui.hotkey('ctrl', 'a')
time.sleep(3)
pyautogui.hotkey('ctrl', 'c')
time.sleep(3)
pyautogui.hotkey('alt', 'f4') # 使用f4切换到下一条笔记
3.在Obsidian中新建笔记并命名,然后粘贴上文复制的内容
我们只需要在任务栏点击Obsidian图标-》'ctrl', 'n'新建笔记-》重命名(把印象笔记中的命名作为新命名)即可
Obsidian中新建笔记并命名逻辑如下:
# 重命名
pyautogui.click(obspos)
print("has click obs")
pyautogui.hotkey('ctrl', 'n')
pyautogui.hotkey('backspace')
pyautogui.hotkey('ctrl', 'v')
在新建笔记并命名之后我们还需要把印象笔记里的内容粘贴到Obsidian中。这里使用回车键就可以让鼠标从Obsidian的标题切换到内容。
# 粘贴
pyautogui.click(obspos)
print("has click obs")
pyautogui.hotkey('enter')
pyautogui.hotkey('ctrl', 'v')
4.输出代码
我们已经调研出每一步骤的具体方法,接下来就是把每个步骤连起来,形成完整的代码。在这里,我写了一个非常非常简单的示意,代码写的很糟糕,只是作为一个示意。注意:不要把下面的代码复制粘贴直接在自己电脑上运行,obsidian和印象笔记在电脑的位置不一样,屏幕分辨率也不同,如果贸然复制,可能会出现很严重的后果。
'''
notepos 和 obspos 是在任务栏上印象笔记和obsidian的位置,千万别搞反了
'''
notepos = 800
obspos = 730
def copyeventnote():
# click note icon to open note
pyautogui.click(notepos, 2800)
print("has click eventnote")
# ---- copy name
pyautogui.hotkey('ctrl', 'enter') # open new window
time.sleep(1) # load name
pyautogui.hotkey('f2') # rename
pyautogui.hotkey('ctrl', 'c')
pyautogui.hotkey('alt', 'f4') # close note,stuck by windows
time.sleep(1)
# ---- copy done
# rename obs
create_rename_obs()
# click note icon again
pyautogui.click(notepos, 2800)
pyautogui.hotkey('ctrl', 'enter')
time.sleep(4)
pyautogui.hotkey('ctrl', 'a')
time.sleep(3)
pyautogui.hotkey('ctrl', 'c')
time.sleep(3)
pyautogui.hotkey('alt', 'f4')
time.sleep(3)#因为软件的反应会有延迟,所以每步都要停顿一段时间,如果太快,软件反应不过来
pyautogui.hotkey('down')
print("has paste")
time.sleep(1)
danger_to_obs()
def danger_to_obs(): # 这段代码谨慎运行,小心把之前obsidian里的东西覆盖
# 点击obs
pyautogui.click(obspos, 2800)
time.sleep(1)
print("has click obs")
pyautogui.hotkey('enter')
pyautogui.hotkey('ctrl', 'v')
time.sleep(1)
pyautogui.hotkey('ctrl', 'w') # 关闭OBS标签页
def create_rename_obs():
# 重命名obs
pyautogui.click(obspos, 2800)
print("has click obs")
不要直接运行这段代码,避免可能存在的风险
pyautogui.hotkey('ctrl', 'n')
pyautogui.hotkey('backspace')
pyautogui.hotkey('ctrl', 'v')
def for_loop():
for i in range(0, 1): # 这里只会运行一次,也就是复制粘贴1个笔记,可以改成多个
copyeventnote()
if __name__ == '__main__':
for_loop()
5.需要注意的问题:
首先就是要注意印象笔记偶尔会崩溃。所以代码里的运行次数不能运行过多,实测30,40次基本可以,如果200次以上风险就比较高了,而第二就是在代码运行时不能离开人,避免出现突发状况,造成严重后果。pyautogui 可能也不是实现笔记迁移的最好方式,如各位有更好的方法,欢迎指点。