如何使用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 可能也不是实现笔记迁移的最好方式,如各位有更好的方法,欢迎指点。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容