Git Product home page Git Product logo

free-google-translate's Introduction

Free Google Translator

GitHub license Documentation Status made-with-python made-with-javascript Ask Me Anything !

Free Google Translate is a tool for google free translation API, the main idea of the repo is coming from the web https://translate.google.cn translation, we use a hacking way to access the web translation api for translating text.

The Do's and Don'ts

  • 1.You will get 429 Too many requests error if you request so many times simultaneously
    • Suggested Solution: To avoid requests in just one IP address, you can put the requesting code in every client (app on device), then it will bypass the IP restriction
  • 2.The api service is unavailable if you send large amount of requests at the same time.

For Python Example

text = "Hello world"
GoogleTrans().query(text, lang_to='zh-CN') 

You pass a string of plain text with target language code, then you will get the translated text after requested. the request api will recognize the source language of the text automatically for you.

The output will be:

Before translating: "Hello world" with target lange code en
After translating: "你好,世界"


For Objective-C Example on iOS

NSString *content = @"Hello world";
NSString *targetLanguage = @"zh-CN";
YLGoogleTranslate *googleTrans = [[YLGoogleTranslate alloc] init];
[googleTrans translateWithText:content targetLanguageCode:targetLanguage completion:^(NSString * _Nullable originalText, NSString * _Nullable originalLanguageCode, NSString * _Nullable translatedText, NSString * _Nullable targetLanguageCode, NSString * _Nullable error) {
    if ([error length] > 0) {
        NSLog(@"The Request returned error! Error Message: %@", error); 
    } else {
        NSLog(@"The Request returned success!!!!!!");
    }
}];

The response data is as same as aforementioned python code.







free-google-translate

Free Google Translator API 免费的Google翻译,其中的破解思路主要来源于将 https://translate.google.cn 的web访问方式模拟成全部代码的形式来控制api的访问

注意事项

  • 1.大量的相同IP请求会导致Google翻译接口返回 429 Too many requests
    • 建议处理方案:每一个app客户端自己去请求此接口,就可以避免只有一个IP的服务器去请求
  • 2.大量的请求也会使此接口的服务不可用

Python使用

text = "Hello world"
GoogleTrans().query(text, lang_to='zh-CN') 

传入一段待翻译的文本,和目标翻译语言code,然后你就会得到翻译结果,该接口会自动识别输入的语言code

输出结果是:

翻译前:Hello world,翻译前code:en
翻译后:你好,世界, 翻译后code:zh-CN


iOS Objective-C使用

NSString *content = @"Hello world";
NSString *targetLanguage = @"zh-CN";
YLGoogleTranslate *googleTrans = [[YLGoogleTranslate alloc] init];
[googleTrans translateWithText:content targetLanguageCode:targetLanguage completion:^(NSString * _Nullable originalText, NSString * _Nullable originalLanguageCode, NSString * _Nullable translatedText, NSString * _Nullable targetLanguageCode, NSString * _Nullable error) {
    if ([error length] > 0) {
        NSLog(@"调用Google翻译接口返回错误:%@ ", error); 
    } else {
        NSLog(@"调用Google翻译接口返回成功!");
    }
}];

传入一段待翻译的文本,和目标翻译语言code,然后你就会得到翻译结果,该接口会自动识别输入的语言code

free-google-translate's People

Contributors

ggttyyy avatar m-bonjour avatar qiangzhang2021 avatar victorzhang2014 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

free-google-translate's Issues

对Python版本的一些小魔改

python版本带了一个js脚本用来计算ttk
但是需要跟一个js运行库
所以我尝试将那个js脚本翻译成Python脚本并且融合到同一个脚本中
代码如下

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import urllib.request
import urllib.parse
import json
import re
import ssl
import ctypes
ssl._create_default_https_context = ssl._create_unverified_context


class GoogleTrans(object):
    def __init__(self):
        self.url = 'https://translate.google.cn/translate_a/single'
        self.TKK = "434674.96463358"  # 随时都有可能需要更新的TKK值
        
        self.header = {
            "accept": "*/*",
            "accept-language": "zh-CN,zh;q=0.9",
            "cookie": "NID=188=M1p_rBfweeI_Z02d1MOSQ5abYsPfZogDrFjKwIUbmAr584bc9GBZkfDwKQ80cQCQC34zwD4ZYHFMUf4F59aDQLSc79_LcmsAihnW0Rsb1MjlzLNElWihv-8KByeDBblR2V1kjTSC8KnVMe32PNSJBQbvBKvgl4CTfzvaIEgkqss",
            "referer": "https://translate.google.cn/",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
            "x-client-data": "CJK2yQEIpLbJAQjEtskBCKmdygEIqKPKAQi5pcoBCLGnygEI4qjKAQjxqcoBCJetygEIza3KAQ==",
        }
        
        self.data = {
            "client": "webapp",  # 基于网页访问服务器
            "sl": "auto",  # 源语言,auto表示由谷歌自动识别
            "tl": "vi",  # 翻译的目标语言
            "hl": "zh-CN",  # 界面语言选中文,毕竟URL都是cn后缀了,就不装美国人了
            "dt": ["at", "bd", "ex", "ld", "md", "qca", "rw", "rm", "ss", "t"],  # dt表示要求服务器返回的数据类型
            "otf": "2", 
            "ssel": "0",
            "tsel": "0",
            "kc": "1",
            "tk": "",  # 谷歌服务器会核对的token
            "q": ""  # 待翻译的字符串
        }
    class js_fun():
        def rshift(self, val, n): return (val % 0x100000000) >> n
        def Number(self, val):
            try:
                return eval(val, {}, {})
            except:
                return 0
        class Undefined:
            def __init__():
                pass
        class js_array():
            def __init__(self, outer, init=[]):
                self.outer = outer
                self.storage = list(init).copy()
            def __getitem__(self, key):
                if (type(key).__name__ != 'int'):
                    if (type(key).__name__ == 'float') and int(key) != key:
                        return 0
                    try:
                        key = int(key)
                    except:
                        return 0
                if len(self.storage)<=key or key<0:
                    return 0
                return self.storage[key]
            def __setitem__(self, key, value):
                if (type(key).__name__ != 'int'):
                    if (type(key).__name__ == 'float') and int(key) != key:
                        return 0
                    try:
                        key = int(key)
                    except:
                        return 0
                if key<0:
                    return 0
                while key >= len(self.storage):
                    self.storage.append(0)
                self.storage[key] = value
                return
            def __len__(self):
                return len(self.storage)
            def __str__(self):
                return self.storage.__str__()
            def __repr__(self):
                return self.storage.__repr__()
        def array(self, init = []):
            return self.js_array(self, init)
        def uo(self, a, b):
            for c in range(0, len(b)-2, 3):
                d = b[c+2]
                if 'a' <= d:
                    d = ord(d)-87
                else:
                    d = self.Number(d)
                if '+' == b[c+1]:
                    d = self.rshift(a, d)
                else:
                    d = a<<d
                if b[c] == "+":
                    a = a + d & 4294967295
                else:
                    a = a ^ d
            return a
        def wo(self, a, tkk):
            d = self.array(init = tkk.split("."))
            b = self.Number(d[0])
            e = self.array()
            f = 0
            g = 0
            while g < len(a):
                h = ord(a[g])
                if 128 > h:
                    e[f] = h
                    f += 1
                else:
                    if 2048 > h:
                        e[f] = h >> 6 | 192
                        f += 1
                    else:
                        if (55296 == (h & 64512)) and (g + 1 < len(a)) and (56320 == (ord(a[g+1]) & 64512)):
                            h = 65536 + ((h & 1023) << 10) + (ord(a[g+1]) & 1023)
                            g += 1
                            e[f] = h >> 18 | 240
                            f += 1
                            e[f] = h >> 12 & 63 | 128
                            f += 1
                        else:
                            e[f] = h >> 12 | 224
                            f += 1
                            e[f] = h >> 6 & 63 | 128
                            f += 1
                    e[f] = h & 63 | 128
                    f += 1
                g += 1
            a = b
            
            for f in range(0, len(e)):
                a += e[f]
                a = ctypes.c_long(a).value
                a = self.uo(a, '+-a^+6')
            a = self.uo(a, '+-3^+b+-f')
            a ^= self.Number(d[1])
            if 0 > a:
                a = (a & 2147483647)+2147483648
            a %= 10**6
            return str(a)+'.'+str(a^b)
        
        # 构建完对象以后要同步更新一下TKK值
        # self.update_TKK()  
    
    
    def update_TKK(self):
        url = "https://translate.google.cn/"
        req = urllib.request.Request(url=url, headers = self.header)
        page_source = urllib.request.urlopen(req).read().decode("utf-8")
        self.TKK = re.findall(r"tkk:'([0-9]+\.[0-9]+)'", page_source)[0]
        
        
    def construct_url(self):
        base = self.url + '?'
        for key in self.data:
            if isinstance(self.data[key], list):
                base = base + "dt=" + "&dt=".join(self.data[key]) + "&"
            else:
                base = base + key + '=' + self.data[key] + '&'
        base = base[:-1]
        return base
    
    def query(self, q, lang_to=''): 
        self.data['q'] = urllib.parse.quote(q)
        self.data['tk'] = self.js_fun().wo(q, self.TKK)
        self.data['tl'] = lang_to
        url = self.construct_url()
        req = urllib.request.Request(url=url, headers=self.header)
        response = json.loads(urllib.request.urlopen(req).read().decode("utf-8"))
        targetText = response[0][0][0]
        originalText = response[0][0][1]
        originalLanguageCode = response[2]
        print("翻译前:{},翻译前code:{}".format(originalText, originalLanguageCode))
        print("翻译后:{}, 翻译后code:{}".format(targetText, lang_to))
        return originalText, originalLanguageCode, targetText, lang_to


if __name__ == '__main__':
    text = "Hello world"
    originalText, originalLanguageCode, targetText, targetLanguageCode = GoogleTrans().query(text, lang_to='zh-CN')  
    print(originalText, originalLanguageCode, targetText, targetLanguageCode)

怎么获得TKK

您好 请问一下TKK是怎么获得的?
我尝试了无论是在java的代码还是python的代码,调用update_TKK()都会出现问题
在网上找了找,说TKK是在 translate.google.cn 这个网页源代码中有,但我在网页源代码并没有找到

以及Android可以webView控件调用本地html文件,在html内嵌js来调用wo()来获取tk(算是种笨方法)。
以及Android的sendGet()方法似乎有错误,会报错no protocol。我直接改用okhttp来获取到数据

Wrong URL for get the token

I have implemented the Android code. So after translate it getting some errors. Once I go through the code I found out that there is a method to get the token from getTKK method. It's concat wrong url to the search query. Could you check the code.

public String getTKK(String q) {
        try {
            String tkkUrl = "http://xxx" + q;
            String req = sendGet(tkkUrl);
            tkk = new JSONObject(req).getString("token");
        } catch (Exception e) {
            Log.e(TAG, "=====update_TKK======" + e.toString());
        }
        return tkk;
}

oc版本执行报错

错误信息: "The data couldn’t be read because it isn’t in the correct format."

是不是参数已经改了?

一些小问题及建议

1.建议对输入的源文本的符号进行处理(python)
原因:部分半角符号会导致谷歌翻译的结果被切割成两部分,但targetText = response[0][0][0]只选取的第一部分,导致翻译结果不齐全。出于无法信任用户输入的基础上,建议对输入的源文本的半角句号用半角逗号代替,其他符号完全去除。(另外,输入的源文本包含html的转义字符,可能导致生成谷歌翻译url无法访问,不是"&"这个符号导致的该错误,但";"可能会导致解析出错)
2.关于TKK(不是TK)
见之前的Issues
3.不建议使用 URLEncoder.encode来转码(java)
URLEncoder.encode会把空格符号转码为“+”号而不是"%20" 例:i+have
通过搜索资料可知这是因为URL规范的,RFC-1738和RFC-2396差异导致的
解决方式可以通过Uri.encode()转码或者对字符串替换也可以
4.不建议在不启用进程或线程或服务的方式就调用网络请求(java)
这可能会导致安卓oom的发生 而且Java的代码sendGet()似乎有点问题
5.如果你不想通过网络请求的方式获取tk,建议通过安卓的组件webView来访问本地html来获取tk
网上可以找到介绍,我fork里改的安卓也是通过该方式来访问本地html来获取tk

A server with the specified hostname could not be found.,

Hi,

Translation is not working now. Earlier it was working.

I am trying in iOS Objective C

  • (void)getTokenWithText:(NSString *)text completion:(void (^)(NSString * _Nullable tokenData, NSString * _Nullable error))completionHandler

Above function returns error.

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.