如何使用python pyautogui完成从印象笔记到Obsidian的笔记迁移

摘要:这篇文章通过使用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.选择笔记标题和内容并复制

在成功唤起印象笔记的程序之后,我们就需要选择笔记-》复制笔记-》选择下一条笔记。如果我们采用截图-》识别图片-》点击图片所在位置的方法,显然不好实现,一方面是因为前面提到的识别率和识别速度的问题。另一方面是因为印象笔记的侧面笔记列表内容不固定,截图没法识别笔记。

在这里插入图片描述

印象笔记侧面笔记列表选框形状颜色不固定,不能作为图片给pyautogui识别

我使用另一种方法实现:印象笔记有很多快捷键。所以只要我们打开并选中了印象笔记,我们就可以使用快捷键完成上述一系列复杂操作。

如果我们一开始选中一条笔记:则只要使用’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 可能也不是实现笔记迁移的最好方式,如各位有更好的方法,欢迎指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值