美文网首页
如何使用python pyautogui完成从印象笔记到Obsi

如何使用python pyautogui完成从印象笔记到Obsi

作者: 晓臣同学爱学习 | 来源:发表于2023-10-11 15:33 被阅读0次

    摘要:这篇文章通过使用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 可能也不是实现笔记迁移的最好方式,如各位有更好的方法,欢迎指点。

    相关文章

      网友评论

          本文标题:如何使用python pyautogui完成从印象笔记到Obsi

          本文链接:https://www.haomeiwen.com/subject/evzgbdtx.html