作者 |月小水长
出处 |月小水长公众号
一个可能你似曾相识的场景
阅读内容包含大量英文的PPT、Word、Excel或者记事本时,由于英语不熟悉,为了流利地阅读,需要打开浏览器进入谷歌翻译的主界面,然后把英文复制到谷歌翻译的输入框中,最后又把翻译结果复制回PPT、Word和Excel。
要是一个两个单词还好,要是发现有100个单词不认识,就必须复制粘贴200次,如此机械性重复性的工作,应该交给程序来做,这就是我设计下面这个自动化翻译工具的初衷。
提升办公效率的法宝
如上图所示,运行程序并保持后台运行python替换,在电脑上的任何一个软件中选择一段文本,并Ctrl+C复制到系统剪贴板中,程序就会自动帮助我们完成翻译,并将翻译结果自动复制到系统剪贴版中,只需Ctrl+V,就完成了翻译结果对原文的替换。
编码实现
程序主要分为两部分,第一部分为谷歌翻译爬虫,第二部分就是实现这个将翻译结果自动替换的业务逻辑。
谷歌翻译爬虫
通过浏览器F12开发者工具,很容易定位到翻译请求的URL:http://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&clearbtn=1&otf=1&pc=1&srcrom=0&ssel=0&tsel=0&kc=2
这个请求接受两个参数,一个就是我们要翻译的字符串q,另一个是用于用户认证的tk(token),其中q很容易构造,tk的构造就需要花费一番心力了,需要我们调试js代码,这里参考Github上大神的轮子:https://github.com/cocoa520/Google_TK
谷歌翻译爬虫的主要代码如下:
1def translate(tk, content):
2 if len(content) > 4891:
3 print("too long to translate")
4 return
5
6 param = {'tk': tk, 'q': content}
7
8 result = requests.get("""http://translate.google.cn/translate_a/single?client=t&sl=en
9 &tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss
10 &dt=t&ie=UTF-8&oe=UTF-8&clearbtn=1&otf=1&pc=1&srcrom=0&ssel=0&tsel=0&kc=2""", params=param)
11
12 data = result.json()
13 print(data[0][0][0])
返回结果是json形式的,翻译结果保存在结果的第一个元组中。
Python 操作系统剪贴板
将读取剪贴板的内容的代码封装成函数如下:
1def getText():#读取剪切板
2 # 打开剪贴板
3 w.OpenClipboard()
4 # 读取剪贴板的内容
5 d = w.GetClipboardData(win32con.CF_TEXT)
6 # 关闭剪贴板
7 w.CloseClipboard()
8 try:
9 return d.decode('utf-8')
10 except:
11 return d.decode('gbk')
返回值d是字节类型的,需要解码,中文按gbk格式解码,英文按utf-8解码。
类似地,写入剪贴板的代码如下:
1def setText(aString):#写入剪切板
2 # 打开剪贴板
3 w.OpenClipboard()
4 # 清空剪贴板
5 w.EmptyClipboard()
6 # 写入剪贴板
7 w.SetClipboardText(aString)
8 # 关闭剪贴板
9 w.CloseClipboard()
实现将翻译结果自动替换原文的逻辑的代码如下:
1while(True):
2 # 如果剪贴板正在被占用
3 try:
4 cs = getText()
5 except:
6 time.sleep(1)
7 cs = getText()
8 print('cs',cs)
9 if cs and cs != ls:
10 print('准备翻译')
11 content = getText()
12 tk = js.getTk(content)
13 res = translate(tk, content)
14 setText(res)
15 time.sleep(1)
16 ls = res
值得注意的是,系统剪贴板对象是单例模式的,在操作系统范围内只有一个,而且读写剪贴板都是互斥的,在读(写)剪贴板的同时不允许任何对剪贴板的写(读)操作。试想这样一种情景,我们在其他软件中Ctrl+C写入剪贴板,而此时我们的程序代码正好执行到读剪贴板那一行,毫无疑问会报错,我的解决办法是使用try…except语句延时1s再读取,这样可以大大降低读写碰撞的概率,但无疑消耗了程序性能。
最好的办法是判断剪贴板对象句柄是否被占用python替换,其实我一直在寻找是否存在判断剪贴板对象句柄是否被占用的API,但是一直没有找到,如果有人知道的话,欢迎评论区留言。
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688