Python写的翻译工具

功能介绍:程序自动读取剪贴板字符串,如果字符串为非中文,均翻译为中文,如果字符串为中文,则翻译为英文,如果字符串为网址,则不进行任意操作,tkk代码部分取自github,脚本支持http/https代理,非代理请求google.cn,代理则请求google.com,使用代理模式时,脚本会创建proxy.ini,可以修改该文件来修改代理地址,格式:127.0.0.1:8080

下面是完整代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests
import os
import random
import win32clipboard as wc
import time
import tkinter as tk
import ctypes


proxies = {}
root=tk.Tk()
root.withdraw()
baseurl = ["https://translate.google.com/translate_a/single?client=gtx&dt=t&dj=1&ie=UTF-8&sl=auto&tl=","http://translate.google.cn/translate_a/single?client=gtx&dt=t&dj=1&ie=UTF-8&sl=auto&tl="]
s = ""
pd = 0 #proxies id
pl = [] #proxies list

def select_proxy():
    global proxies
    while True:
        id = input("是否启用代理(默认不启用)?Y/N")
        if id == "Y" or id == "y":
            check()
            os.system("title 【当前使用代理翻译】")
            return
        elif id == "N" or id == "n":
            proxies = {}
            os.system("title 【当前使用直连翻译】")
            return
        else:
            proxies = {}
            os.system("title 【当前使用直连翻译】")
            return


ua = ["Mozilla/5.0 (iPhone 84; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 MQQBrowser/7.8.0 Mobile/14G60 Safari/8536.25 MttCustomUA/2 QBWebViewType/1 WKType/1",
      "Mozilla/5.0 (Linux; Android 7.0; STF-AL10 Build/HUAWEISTF-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.2.0_730_YYB_D QQ/7.2.0.3270 NetType/4G WebP/0.3.0 Pixel/1080",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.18 NetType/WIFI Language/en",
    "Mozilla/5.0 (Linux; Android 5.1.1; vivo Xplay5A Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1.1)",
    "Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; STF-AL00 Build/HUAWEISTF-AL00) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/7.9 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; Android 6.0; LEX626 Build/HEXCNFN5902606111S) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/35.0.1916.138 Mobile Safari/537.36 T7/7.4 baiduboxapp/8.3.1 (Baidu; P1 6.0)",
    "Mozilla/5.0 (iPhone 92; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.0 MQQBrowser/7.7.2 Mobile/14F89 Safari/8536.25 MttCustomUA/2 QBWebViewType/1 WKType/1",
    "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; ZUK Z2121 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.8.952 Mobile Safari/537.36",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 MicroMessenger/6.5.17 NetType/WIFI Language/zh_HK",
    "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; SM-C7000 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.2.948 Mobile Safari/537.36",
    "MQQBrowser/5.3/Mozilla/5.0 (Linux; Android 6.0; TCL 580 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Mobile Safari/537.36",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92 MicroMessenger/6.5.16 NetType/WIFI Language/zh_CN",
    "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; MI 4S Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.1.3",
    "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; SM-G9550 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; Android 5.1; m3 note Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1)"]

def int_overflow(val):
    maxint = 2147483647
    if not -maxint-1 <= val <= maxint:
        val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1
    return val

def unsigned_right_shitf(n,i):
    # 数字小于0,则转为32位无符号uint
    if n<0:
        n = ctypes.c_uint32(n).value
    # 正常位移位数是为正数,但是为了兼容js之类的,负数就右移变成左移好了
    if i<0:
        return -int_overflow(n << abs(i))
    return int_overflow(n >> i)

def google_TL(src):
    a = src.strip()
    b = 406644
    b1 = 3293161072

    jd = "."
    Sb = "+-a^+6"
    Zb = "+-3^+b+-f"

    e = []
    for g in range(len(a)):
        m = ord(a[g])
        if 128 > m:
            e.append(m)
        else:
            if 2048 > m:
                e.append(m >> 6 | 192)
            else:
                if 55296 == (m & 64512) and g + 1 < len(a) and 56320 == (a[g+1] & 64512):
                    g += 1
                    m = 65535 + ((m & 1024) << 10) + (a[g] & 1023)
                    e.append(m >> 18 | 240)
                    e.append(m >> 12 & 63 | 128)
                else:
                    e.append(m >> 12 | 224)
                    e.append(m >> 6 & 63 | 128)
                e.append(m & 63 | 128)
    a = b
    for f in range(len(e)):
        a += int(e[f])
        a = google_RL(a, Sb)
    a = google_RL(a, Zb)
    if b1:
        a ^= b1
    else:
        a ^= 0
    if 0 > a:
        a = (a & 2147483647) + 2147483647
    a %= 1E6
    return str(int(a)) + jd + str(int(a) ^ b)

def google_RL(a,b):
    t = 'a'
    Yb = '+'
    for c in range(0, len(b)-2, 3):
        d = b[c+2]
        if d >= t:
            d = ord(d[0]) - 87
        else:
            d = int(d)
        if b[c+1] == Yb:
            d = unsigned_right_shitf(a,d)
        else:
            d = int(a) << d
        if b[c] == Yb:
            a = int(a) + d & 4294967295
        else:
            a = int(a) ^ d
    return a

def check():
    global proxies,pl
    if not os.path.exists("proxy.ini"):
        f=open("proxy.ini","w",encoding="utf-8")
        f.close()
        
    f = open("proxy.ini","r",encoding="utf-8")
    line = f.readline()
    while line:
        pl.append(line)
        line = f.readline()
    f.close()
    if pl != None:
        line = str(pl[pd]).rstrip('\n')
        proxies = {"http":line,"https":line}
    else:
        print("代理格式:\"127.0.0.1:7890\"")
        os.system("notepad.exe proxy.ini")
        os.system("pause")
        check()


def fanyi(s,tl,tkk):
    try:
        global proxies,ua,baseurl,pd
        s = s.replace(" & "," and ")
        s_ = s
        tl_ = tl
        url = ""
        if proxies == {}:
            url = baseurl[1]+tl+"&tk="+tkk
        else:
            url = baseurl[0]+tl+"&tk="+tkk
        data = {
            "q":s_
        }
        
        rua = random.choice(ua)
        hdr = {
        "User-Agent": rua,
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        
        }

        r = requests.post(url,proxies=proxies,data=data,headers=hdr).json()
        
        i = 0
        temp = r['sentences']
        k = ""
        while i < len(temp):
            k += temp[i]['trans']
            i += 1
        print(k)
        return
    except: 
        if proxies != {}:
            if pd == 0:
                pd = 1
                line = str(pl[pd]).rstrip('\n')
                proxies = {"http":line,"https":line}
            elif pd == 1:
                pd = 0
                line = str(pl[pd]).rstrip('\n')
                proxies = {"http":line,"https":line}                
                
        time.sleep(3)
        fanyi(s_,tl_,tkk)
        pass
    

def is_contains_chinese(s):
    for i in s:
        if u'\u4e00' <= i <= u'\u9fff':
            return True   
        
        
if __name__ == '__main__':
    select_proxy()
    os.system('cls')
    while True:
        try:
            time.sleep(2)
            s = root.clipboard_get()
            if s == "":
                time.sleep(2)
                continue                   
            elif str(s).startswith('https://') or str(s).startswith('http://'):
                time.sleep(2)
                continue
        except:
            continue
   
        if is_contains_chinese(s):
            tl="en"
            s = str(s).replace("\r\n"," ").replace("\n"," ")
            print(s)
            tkk = google_TL(s)
            print("\n")
            fanyi(s,tl,tkk)
            print("\n")
            wc.OpenClipboard()
            wc.EmptyClipboard()
            wc.CloseClipboard()                       

        else:
            tl="zh"
            s = str(s).replace("-\r\n","").replace("-\n","")
            s = str(s).replace("\r\n"," ").replace("\n"," ")
            print(s)
            tkk = google_TL(s)
            print("\n")
            fanyi(s,tl,tkk)
            print("\n")
            wc.OpenClipboard()
            wc.EmptyClipboard()
            wc.CloseClipboard()                       
            
    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值