专栏首页月小水长Python 实现一个自动化翻译和替换的工具

Python 实现一个自动化翻译和替换的工具

点击上方蓝字,长按关注不迷路。

一个可能你似曾相识的场景

阅读内容包含大量英文的 PPT、Word、Excel 或者记事本时,由于英语不熟悉,为了流利地阅读,需要打开浏览器进入谷歌翻译的主界面,然后把英文复制到谷歌翻译的输入框中,最后又把翻译结果复制回 PPT、Word 和 Excel。

要是一个两个单词还好,要是发现有 100 个单词不认识,就必须复制粘贴 200 次,如此机械性重复性的工作,应该交给程序来做,这就是我设计下面这个自动化翻译工具的初衷。

提升办公效率的法宝

如上图所示,运行程序并保持后台运行,在电脑上的任何一个软件中选择一段文本,并 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

谷歌翻译爬虫的主要代码如下:

def translate(tk, content):
    if len(content) > :
        print("too long to translate")
        return

    param = {'tk': tk, 'q': content}

    result = requests.get("""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""", params=param)

    data = result.json()
    print(data[][][])

返回结果是 json 形式的,翻译结果保存在结果的第一个元组中。

Python 操作系统剪贴板

将读取剪贴板的内容的代码封装成函数如下:

def getText():#读取剪切板
    # 打开剪贴板
    w.OpenClipboard()
    # 读取剪贴板的内容
    d = w.GetClipboardData(win32con.CF_TEXT)
    # 关闭剪贴板
    w.CloseClipboard()
    try:
        return d.decode('utf-8')
    except:
        return d.decode('gbk')

返回值 d 是字节类型的,需要解码,中文按 gbk 格式解码,英文按 utf-8 解码。

类似地,写入剪贴板的代码如下:

def setText(aString):#写入剪切板
    # 打开剪贴板
    w.OpenClipboard()
    # 清空剪贴板
    w.EmptyClipboard()
    # 写入剪贴板
    w.SetClipboardText(aString)
    # 关闭剪贴板
    w.CloseClipboard()

实现将翻译结果自动替换原文的逻辑的代码如下:

while(True):
        # 如果剪贴板正在被占用
        try:
            cs = getText()
        except:
            time.sleep()
            cs = getText()
        print('cs',cs)
        if cs and cs != ls:
            print('准备翻译')
            content = getText()
            tk = js.getTk(content)
            res = translate(tk, content)
            setText(res)
            time.sleep()
            ls = res

值得注意的是,系统剪贴板对象是单例模式的,在操作系统范围内只有一个,而且读写剪贴板都是互斥的,在读(写)剪贴板的同时不允许任何对剪贴板的写(读)操作。试想这样一种情景,我们在其他软件中 Ctrl + C 写入剪贴板,而此时我们的程序代码正好执行到读剪贴板那一行,毫无疑问会报错,我的解决办法是使用 try…except 语句延时 1 s再读取,这样可以大大降低读写碰撞的概率,但无疑消耗了程序性能。最好的办法是判断剪贴板对象句柄是否被占用,其实我一直在寻找是否存在判断剪贴板对象句柄是否被占用的 API,但是一直没有找到,如果有人知道的话,欢迎评论区留言。

源代码获取

关注公众号 月小水长,后台回复,自动替换的翻译软件 即可获取所有源代码。

往期精选 Python 打造自由 DIY 群聊机器人 Python 获取微信好友地区、性别、签名信息并将结果可视化

点击下方好看,或者转发,谢谢资瓷

本文分享自微信公众号 - 月小水长(inspurer),作者:BuyiXiao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 历年高考录取分数线查询

    再过几天就要高考了,想起来,我是 2016 年参加的高考,不经意间已经 3 年了。

    月小水长
  • 数据分析利器 pandas 系列教程(二):强大的 DataFrame

    dataframe 是表格型的数据结构,由一组有序的列组成,可以看成是由 Series 组成的字典,举个例子:

    月小水长
  • Java系列 | 十分钟学会JAVA IO

    不知道大家在学JAVA IO的时候,有没有被各种五花八门的构造函数之间的组合和嵌套弄得头昏脑涨,比如BufferedReader br=new Buff...

    月小水长
  • 抓取Android APP崩溃和无响应日志的小工具

    在Android APP的测试过程中经常遇到crash和anr,开发人员习惯通过eclipse或者eclipse的ddms组件进行捕抓日志,测试人员常通过在do...

    张树臣
  • 构造优质上传漏洞Fuzz字典

    上传漏洞的利用姿势很多,同时也会因为语言,中间件,操作系统的不同,利用也不同。比如有:大小写混合,.htaccess,解析漏洞,00截断,.绕过,空格绕过,::...

    FB客服
  • substr_replace如何替换多个字符串不同位置不同长度的子串

    都知道substr_replace可以替换指定位置的子串。比如substr_repace("Hello Test",'xxxx',1,4)替换成Hxxxx Te...

    写PHP的老王
  • opencv3.4+contribute编译及官方自带samples编译

    圣诞前夕,opencv悄悄发布了3.4版本,和3并没有很大的区别,听说是优化了DNN,这个还没用过,正好换了电脑,新电脑上还没来得及配置opencv,昨天下午闲...

    和蔼的zhxing
  • 【利用Python进行金融数据分析】数据的筛选和选取

    pd.set_option("display.width",1000) url ="https://raw.githubusercontent.com/jok...

    光点神奇
  • NDK学习笔记(2)——C与java之间的互相调用

    用户1665735
  • tkinter -- Pack

    pack_salves 打印当前组件包拥有的子组件,通过这个函数可以查看各个组件是否有包含关系

    用户2398817

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动