话不多说,先看下效果
其实差不多就相当于个划词什么的扩展,不过鉴于goldenDict或者goldenDict-ng本身的功能,特别是支持海量的mdx词典和其它可定义的一些扩展功能么,功能上也不输一些划词扩展,因为是在本地环境么,所以响应时间还要快些。
本来goldenDict本身有个按复制快捷键就可以弹出查词对话框的功能,不过对于懒人来说还是略麻烦了些,虽然还有个取词模式也挺方便么,但容易误触发,加上之前写过或者说改过一个日语的划词词典脚本么,所以就想着通过油猴脚本来实现直接调用两次系统复制快捷键ctrl+c 来触发goldenDict。
在开发的时候开头还以为挺简单,以为只要在弹出图标加个点击事件,在点击事件中模拟按下按键的事件,也就是KeyboardEvent 再document.dispatchEvent 一下就行了,结果么显然没效果。js的这些事件只对浏览器自身有效,相当于是让浏览器以为按了这些键而已,操作系统或者其它程序不知道。后面搜了下么这种似乎就类似于啥按键精灵的操作,说是一般用ptyhon可以实现之类的,然后找到个相关的demo,大概瞅了下代码么,发现js和pyhton用了个socket交互,原来模拟按键的操作么是python调用的库触发的。所以就搜了下golang有没类似的库,比较用pyhton还得装相关的环境略麻烦些,还真找到个这种类型的库名叫robotgo,试了下还真的能用,就是编译的依赖略麻烦些,用到了cgo,底层就是调用的c的一些大概是系统级的库类吧。
js 划词后复制选中的词,然后调用golang的接口:
navigator.clipboard.writeText(text).then(r => { GM_xmlhttpRequest({ method: "POST", url: 'http://127.0.0.1:9999', headers: { "Content-Type": "application/x-www-form-urlencoded" }, }) })
golang的httpserver接口触发goldenDict 查词:
err := robotgo.KeyTap("c", "ctrl") if err != nil { return err } err = robotgo.KeyTap("c", "ctrl") if err != nil { return err }
然后由此么也想到umi-ocr,之前搜到过用goldenDict与于联动的文章,原理也是通过快捷键,按umi-ocr的截图快捷键,获取解析的文本后复制,再调用goldenDict的快捷键来查词,就是一完整的ocr翻译操作了。然后在golang上找到了监听剪切板的库,中间判断下万一ocr没有解析得出来,也通过油猴脚本实现了只点击下就触发完成ocr翻译的操作。
golang触发umi-ocr截图:
err := robotgo.KeyTap("c", "alt") if err != nil { return err }
这一顿操作感觉效果还是可以,挺像那么回事儿,只是油猴脚本触发ocr的位置在脚本扩展菜单那儿得多点两下,没办法是想弄到右键菜单始终没弄出来,然后本来想再弄个快捷键的设置因为不同系统有些快捷键是不一样,但要现手写个表单加样式嫌麻烦就懒得弄了,遇到直接改脚本好了。真正唯一麻烦点都得手动先在终端执行go程序,也就是一个httpserver服务,想弄成systemd这种开机后台服务会报Could not open main display什么的错,感觉可能跟操作系统底层机制相关吧,这个确实就不晓得该怎么处理了。
最后附一个成品代码,见 github,肯定比上面的代码复杂得多就是。
最后的最后么,实在忍不住得吐槽下这个所谓的前端娱乐圈,之前在论坛听到这过词本来都以为是自嘲啥的,这次在加了个浏览器自带的tts发音功能,想找个言语识别的库,费了老大的劲儿硬是差点儿没找到个油猴脚本能用的,基本全是npm import 方式,要么就是<script type="module">xxx</script>这种,这个之前真没接触过,都不晓得去哪儿下载那个库的。这个本来都没啥,但没法引入到油猴脚本里啊。npm也是,开头找了npm写油猴脚本的绞手架和最热门的一个库是改成npm这种要编译生成的方式引入了,但是编译后会生成混淆的代码也就是算了,那语言识别库的效果么就。。。。。。后面再试了下其它几个也是用npm的导入库,结果还不能编译,报什么can't dynamic import不能动态导入的错误,关键词应该是这,简直无语。。。。。。。。原来前端现在都进化到都嫌弃最原始的script标签加src属性的引入方式 了啊?还好最后还是找到了这么个能用的库哟。虽然前端是写得比较少么,但现在这个引入个库都这么多花样都不知道该说啥了,虽然也可能是本身油猴脚本身有些限制吧。。。。。。。。。。