文档章节

用python包装一个翻译工具

嘻嘻哥
 嘻嘻哥
发布于 2015/06/14 21:41
字数 1620
阅读 39
收藏 0

下面附上最近两个版本的改动,v0、v1就不上传了

v2版代码如下:

import urllib.request
import urllib.parse
import json
import random

"""V2 相比V1版本,增加伪装功能-->使用代理服务器"""
#当前不使用代理,可以跳过代理部分
bUseProxy = 0
ipLists = ['183.203.208.166:8118', '114.215.108.155:9999', '218.78.210.190:8080', '124.202.175.70:8118']

def testProxy():
    """测试代理ip是否生效"""
    bUseProxy = 1
    url = 'http://www.whatismyip.com.tw'
    response = openUrlByProxy(url)
    html = response.read().decode('utf-8')
    print(html)
    

def openUrlByProxy(url, data = None):
    """
    url(which can be a request object or a string)
    使用代理(如果使能)打开url地址,返回response对象
    """
    response = 0
    global bUseProxy
    if bUseProxy == 1:
        proxyIp = {"http" : random.choice(ipLists)}
        proxy_support = urllib.request.ProxyHandler(proxyIp)
        opener = urllib.request.build_opener(proxy_support)

        #这种方式是替换系统默认的opener,后续所有打印的url都是通过代理打开
        #urllib.request.install_opener(opener)
        #response = urllib.request.urlopen(url, data)

        #这种方式是由自己创建的代理opener来打开url,不会影响后续的非代理打开
        response = opener.open(url, data)
    else:
        response = urllib.request.urlopen(url, data)
    return response

def parseUrl(strurl, data = None):
    #修改header里的User-Agent,伪装成浏览器访问,下面两种方式均可以
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36"}
    req = urllib.request.Request(strurl, headers = header)
    #req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36")
    #print(req.headers)
    
    #也可以直接省去上面这句Request调用,直接将strurl传给urlopen替换参数req
    #response = urllib.request.urlopen(req, data)

    #v2版本增加了使用代理功能
    response = openUrlByProxy(req, data)
    
    #type(response)  <class 'http.client.HTTPResponse'>
    #print(response.info())#  查看信息
    html = response.read().decode('utf-8')
    #type(html) <class 'str'>
    return json.loads(html)

def baiduTranslate(content, _from_, _to_):
    if (_from_ == 'auto'):
        _from_ = ''
    if (_to_ == 'auto'):
        _to_ = 'zh' if content[0] < chr(127) else 'en'
    data = {}
    data['from'] = _from_
    data['to'] = _to_
    data['query'] = content
    data['transtype'] = 'trans'
    data['simple_means_flag'] = '3'

    data = urllib.parse.urlencode(data).encode('utf-8')

    target = parseUrl("http://fanyi.baidu.com/v2transapi", data)
    return target['trans_result']['data'][0]['dst']

def youdaoTranslate(content, _from_, _to_):
    data = {}
    data['type'] = 'AUTO' if _from_ == 'auto' else _from_ + "2" + _to_
    data['i'] = content
    data['doctype'] = 'json'
    data['xmlVersion'] = '1.6'
    data['keyfrom'] = 'fanyi.web'
    data['ue'] = 'UTF-8'
    data['typoResult'] = 'true'
    data = urllib.parse.urlencode(data).encode('utf-8')
    
    target = parseUrl("http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=http://www.youdao.com/", data)
    return target['translateResult'][0][0]['tgt']

def bingTranslate(content, _from_, _to_):
    """ 自动:auto, 中文:zh, 英文:en """
    if (_from_ == 'auto'):
        _from_ = ''
    if (_to_ == 'auto'):
        _to_ = 'zh' if content[0] < chr(127) else 'en'
        
    data = {}
    data['from'] = '"' + _from_ + '"'
    data['to'] = '"' + _to_ + '"'
    data['texts'] = '["'
    data['texts'] += content
    data['texts'] += '"]'
    data['options'] = "{}"
    data['oncomplete'] = 'onComplete_3'
    data['onerror'] = 'onError_3'
    data['_'] = '1430745999189'
    data = urllib.parse.urlencode(data).encode('utf-8')
    #appid需要去申请,暂时先用网上别人提供的
    strUrl = "http://api.microsofttranslator.com/v2/ajax.svc/TranslateArray2?" + data.decode() + "&appId=%223DAEE5B978BA031557E739EE1E2A68CB1FAD5909%22"

    response = urllib.request.urlopen(strUrl)
    #通过response.info()查看Content-Type: application/x-javascript
    #不能通过json.loads(),到时候查看如何解析,显示使用老土的方法
    str_data = response.read().decode('utf-8')
    tmp,str_data = str_data.split('"TranslatedText":')
    translate_data = str_data[1:str_data.find('"', 1)]
    return translate_data

def googleTranslate(content, _from_, _to_):
    """ 自动:auto, 中文:zh, 英文:en """
    if (_to_ == 'auto'):
        _to_ = 'zh' if content[0] < chr(127) else 'en'
    data = {}
    data['from'] = _from_
    data['to'] = _to_
    data['text'] = content
    data = urllib.parse.urlencode(data).encode('utf-8')

    target = parseUrl("http://brisk.eu.org/api/translate.php?" + data.decode())
    return target['res']

if __name__ == "__main__":
    select = int(input("请选择翻译工具:1.百度,2.有道,3.必应, 4.谷歌, 5.全部:"))
    content = input('请输入要翻译的内容:')
    data = {}

    """
    data字典里填的数据和url可以在具体的翻译网页,右键点击审查元素(inspect element),然后再点击网络(network)
    然后点击左右的列表项,看右边的预览(preview)是否有结果,如果有结果,则点击预览(preview)旁边的http头(headers)
    最开始的Request URL即我们需要传给urlopen的,然后下面的表单数据(from data)就是需要传给服务器的字典数据结构
    """

    if select == 1:
        print(baiduTranslate(content, 'auto', 'auto'))
    elif select == 2:
        print(youdaoTranslate(content, 'auto', 'auto'))
    elif select == 3:
        print(bingTranslate(content, 'auto', 'auto'))
    elif select == 4:
        print(googleTranslate(content, 'auto', 'auto'))
    elif select == 10000:
        print("百度:" + baiduTranslate(content, 'zh', 'en'))
        print("有道:" + youdaoTranslate(content, 'zh', 'en'))
        print("必应:" + bingTranslate(content, 'zh', 'en'))
        print("谷歌:" + googleTranslate(content, 'zh', 'en'))
    elif select == 10001:
        print("百度:" + baiduTranslate(content, 'en', 'zh'))
        print("有道:" + youdaoTranslate(content, 'en', 'zh'))
        print("必应:" + bingTranslate(content, 'en', 'zh'))
        print("谷歌:" + googleTranslate(content, 'en', 'zh'))
    else:
        print("百度:" + baiduTranslate(content, 'auto', 'auto'))
        print("有道:" + youdaoTranslate(content, 'auto', 'auto'))
        print("必应:" + bingTranslate(content, 'auto', 'auto'))
        print("谷歌:" + googleTranslate(content, 'auto', 'auto'))

最新版上增加了界面操作,代码如下(需要import v2版的包,界面也是边学边用,以前写过其它界面代码,所以学起来比较快)

import tkinter as tk
import TranslateEngine.translation_v2 as te
import threading

class myTranslator:
    def __init__(self, root):
        self.typeList = []
        self.typeVal = 0
        self.inputEntry = 0

        self.baiduText = ""
        self.youdaoText = ""
        self.googleText = ""
        self.bingText = ""
        
        self.root = root
        self.root.geometry("500x500+700+300")
        self.root.minsize(width=500, height=500)
        self.root.title('富哥的翻译器')
        self.initInputLayout()
        self.initDisplayLayout()
    
    #界面代码同步调用会卡死,加入多线程处理
    def __AsyncCallTranslate(self, *args, **kwargs):
        if (kwargs['name'] == 'baidu'):
            self.baiduText.set(te.baiduTranslate(*args))
        elif (kwargs['name'] == 'youdao'):
            self.youdaoText.set(te.youdaoTranslate(*args))
        elif (kwargs['name'] == 'bing'):
            self.bingText.set(te.bingTranslate(*args))
        elif (kwargs['name'] == 'google'):
            self.googleText.set(te.googleTranslate(*args))
    
    def TranslateButtonCallback(self):
        selectedType = self.typeVal.get()
        _from_, to = ('auto', 'auto') if selectedType[0] == '自' else ('en', 'zh') if selectedType[0] == '英' else ('zh', 'en')
        content = self.inputEntry.get()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'baidu'}).start()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'youdao'}).start()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'bing'}).start()
        threading.Thread(target=self.__AsyncCallTranslate, args=(content, _from_, to), kwargs={'name':'google'}).start()
        #self.baiduText.set(te.baiduTranslate(content, _from_, to))
        #self.youdaoText.set(te.youdaoTranslate(content, _from_, to))
        #self.bingText.set(te.bingTranslate(content, _from_, to))
        #self.googleText.set(te.googleTranslate(content, _from_, to))

    def EnterReturnCallback(self, event):
        self.TranslateButtonCallback()

    def initInputLayout(self):
        self.inputFrame = tk.Frame(self.root, height=50)

        self.typeList = ['自  动', '中->英', '英->中']
        self.typeVal = tk.StringVar()
        self.typeVal.set(self.typeList[0])
        tk.OptionMenu(self.inputFrame, self.typeVal, *self.typeList).pack(fill='y', side='left', ipadx=10)

        self.inputEntry = tk.Entry(self.inputFrame)
        self.inputEntry.bind('<Key-Return>', self.EnterReturnCallback)
        self.inputEntry.pack(fill='both', side='left', expand=1)
        self.inputEntry.focus_set()
            
        tk.Button(self.inputFrame, text="翻译", bg='green', command=self.TranslateButtonCallback).pack(fill='y', side='right', ipadx=10)
        self.inputFrame.pack(fill='x')


    def initDisplayLayout(self):
        displayFrame = tk.Frame(self.root)

        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x', pady=5)

        tk.Label(displayFrame, text="百度翻译:", height=1, anchor='w').pack(fill='x')
        self.baiduText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.baiduText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        tk.Label(displayFrame, text="有道翻译:", height=1, anchor='w').pack(fill='x')
        self.youdaoText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.youdaoText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        tk.Label(displayFrame, text="谷歌翻译:", height=1, anchor='w').pack(fill='x')
        self.googleText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.googleText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        tk.Label(displayFrame, text="必应翻译:", height=1, anchor='w').pack(fill='x')
        self.bingText = tk.StringVar()
        tk.Label(displayFrame, textvariable = self.bingText, anchor='nw', fg='blue').pack(fill='both', expand=1)
        #添加分割线
        tk.Frame(displayFrame, height=2, bd=1, relief='sunken').pack(fill='x')

        displayFrame.pack(fill='both', expand=1)


if __name__ == '__main__':
    root = tk.Tk()
    myTranslator(root)
    tk.mainloop()

最后的效果如下:

© 著作权归作者所有

共有 人打赏支持
嘻嘻哥
粉丝 0
博文 6
码字总数 8981
作品 0
厦门
高级程序员
深入了解Python与黑客的关系,另赠Python黑客视频教程!

网络爱好者总是要掌握编程语言的,这里推荐:python。下面,一文了解黑客们会用到哪些Python技术!尾部免费送教程! 1、为什么是python Python已经成为漏洞开发领域的行业标准,读者会发现大...

Python新世界
07/27
0
0
6个最高效的语言处理Python库,你用过几个?

最近一段时间Python已经成为数据科学行业中大火的编程语言,今天技术学派收集了一些较为高效的语言处理Python库。下面分享给大家。 1.NLTK NLTK是构建Python程序以处理人类语言数据的领先平台...

Python燕大侠
06/05
0
0
Python 开发者节省时间的 10 个方法

Python 是一个美丽的语言,可以激发用户对它的爱。所以如果你试图加入程序员行列,或者你有点厌倦C++,Perl,Java 和其他语言,我推荐你尝试Python. Python有很多吸引程序员的功能 ,它易学,...

shezjl
2015/08/16
0
0
国际化复数形式的支持与pygettext的补丁

国际化复数形式的支持与pygettext的补丁 今天把plugs中的论坛进行了一些优化,其中想使用uliweb中早就内置的timesince.py模块。这块需要i18n的支持。于是使用: uliweb i18n -l zh_CN --uli...

zhengyijie
2012/10/08
0
0
Python 国际化(i18n) 支持

python使用gettext来实现i18n支持。具体参数信息请看gettext module帮助。 python中对于国际化的字符串,只需要外加_()即可。 如: print(('hello world')) 然后根据user选择的语言,创建tra...

用户名已存在
2012/03/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
1
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0
Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
3
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部