77 lines
2.4 KiB
Python
77 lines
2.4 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.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
|
|
|
|
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
|