GoogleTranslate-TUI/GoogleTranslator.py

81 lines
2.6 KiB
Python

import requests
import re
from urllib.parse import quote
class GoogleTranslator():
def __init__(self, fr, to):
# set up
self.languageCode = {}
self.fr = fr
self.to = to
self.inputLanguage = ""
self.outputLanguage = ""
self.loadLanguageCode()
self.URL = "https://translate.google.com.tw/_/TranslateWebserverUi/data/batchexecute?\
rpcids=MkEWBc&\
f.sid=4622116653376551039&\
bl=boq_translate-webserver_20210414.13_p0&\
hl=zh-TW&\
soc-app=1&\
soc-platform=1&\
soc-device=1&\
_reqid=1737851&\
rt=c"
self.HEADER = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:86.0) Gecko/20100101 Firefox/86.0',
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
}
# can't sure whether it works for everyone, token in this URL might been blocked.
self.DATA = "f.req=%5B%5B%5B%22MkEWBc%22%2C%22%5B%5B%5C%22{}%5C%22%2C%5C%22{}%5C%22%2C%5C%22{}%5C%22%2Ctrue%5D%2C%5Bnull%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D&at=AD08yZn6jdbpV8qLjfergSwRT4IO%3A1618543754261&"
def loadLanguageCode(self):
with open('LanguageCode.csv') as fp:
data = fp.readlines()
data = [line.replace('\n', '') for line in data]
for line in data:
country, code = line.split(',')
self.languageCode[country] = code
if code==self.fr: self.inputLanguage = country
if code==self.to: self.outputLanguage = country
def translate(self, text):
'''
return a string which translate from self.fr to self.to
'''
# send request
text = quote(text)
response = requests.post(
self.URL,
data=self.DATA.format(text, self.fr, self.to),
headers=self.HEADER
)
lines = response.text.split('\n')
targetLine = ""
for i in range(2, len(lines)):
targetLine += lines[i]
# replace useless char
# change JSON format to Python format because we will use this string to generate Python code
replaceDict = {
'\\n': '',
'null': 'None',
'true': 'True',
'false': 'False'
}
for item in replaceDict:
targetLine = targetLine.replace(item, replaceDict[item])
# get information block
data = eval(targetLine)
data = eval(data[0][2])
ans = []
for i in data[1][0][0][5]:
ans.append(i[0])
return ans