diff options
author | Kyomotoi <[email protected]> | 2020-06-04 22:18:10 +0800 |
---|---|---|
committer | Kyomotoi <[email protected]> | 2020-06-04 22:18:10 +0800 |
commit | 677a936f5393c4c5827135374c7cb80def13bec0 (patch) | |
tree | d40b8dd9dfe0bd4ef950b848a08ce62fba4c51ff /AyaBot/plugins/translate.py | |
parent | c5524efbdf524d037812f398578117cbad202641 (diff) | |
download | ATRI-677a936f5393c4c5827135374c7cb80def13bec0.tar.gz ATRI-677a936f5393c4c5827135374c7cb80def13bec0.tar.bz2 ATRI-677a936f5393c4c5827135374c7cb80def13bec0.zip |
Added function (translate)
Diffstat (limited to 'AyaBot/plugins/translate.py')
-rw-r--r-- | AyaBot/plugins/translate.py | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/AyaBot/plugins/translate.py b/AyaBot/plugins/translate.py new file mode 100644 index 0000000..b49aedd --- /dev/null +++ b/AyaBot/plugins/translate.py @@ -0,0 +1,178 @@ +import re +import requests +import demjson +from pprint import pformat, pprint +from urllib.parse import urlencode +from nonebot import on_command, CommandSession + +#FROM Joenothing-lst + + +def int_overflow(val): + maxint = 2147483647 + if not -maxint-1 <= val <= maxint: + val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1 + return val + +def ansii(a): + return a.encode('gbk') + +def kr(a:int, b): + c = 0 + b = ansii(b) + while c < len(b)-2: + d = b[c + 2] + d = d - 87 if ansii("a")[0] <= d else int(chr(d)) + d = a >> d if ansii("+")[0] == b[c + 1] else a << d + d = int_overflow(d) + a = a + d & 4294967295 if ansii("+")[0] == b[c] else a ^ d + c += 3 + return int_overflow(a) + +def mr(q, TKK): + e = q.encode() + d = str(TKK).split('.') + a = int(d[0]) + b = int(d[0]) + + for f in e: + a += f + a = kr(a, "+-a^+6") + a = kr(a, "+-3^+b+-f") + a &= 0xffffffff # 出错了,转回无符号 + a ^= (int(d[1]) or 0) + if 0 > a: + a = (a & 2147483647) + 2147483648 + a %= 1E6 + a = int(a) + + # c = '&tk=' + # return c + (str(a) + "." + str(a ^ b)) + return (str(a) + "." + str(a ^ b)) + + +""" +def Sr(a, TKK): + a = ''.join(a['a']['b']['q']) + return mr(a, TKK) +d = { + 'a':{ + 'a': ['q'], + 'b': { + 'q': ['me'] + }, + 'c': 1, + 'g': 1 + }, + 'b': 1, + 'c': None, + 'j': False, +} +TKK = '426151.3141811846' +tk = Sr(d, TKK) +print(tk) +""" + + +session = requests.session() + + +def translate(q='hello', source='en', to='zh-CN', tkk=None): + """ + 限制最大5000,按utf-8算,一个汉字算1个,1个英文算一个,超过会失败 + """ + if not tkk: + tkk = '426151.3141811846' + tk = mr(q, tkk) + params = { + 'client': 't', + 'sl': source, + 'tl': to, + 'hl': source, + 'dt': [ + 'at', 'qca', 'rw', 'rm', 'ss', 't' + ], + 'tk': tk, + 'ie': 'UTF-8', + 'oe': 'UTF-8', + 'pc': 1, + 'kc': 1, + 'ssel': 0, + 'otf': 1 + } + data = { + 'q': q + } + headers = { + 'Referer': 'https://translate.google.cn/', + 'Host': 'translate.google.cn', + } + resp = requests.post('https://translate.google.cn/translate_a/single', params=params, data=data, headers=headers) + if resp.status_code == 200: + resp.encoding = 'utf-8' + data = resp.json() + + result = [] + result.append(''.join(map(lambda x:x[0], data[0][:-1]))) + result.append(data[0][-1][-1]) + return result + else: + return None + + +def ref_words(q='hello', source='en', to='zh-CN'): + params = { + 'q': q, + 'client': 'translate-web', + 'ds': 'translate', + 'hl': source, + 'requiredfields': f'tl:{to}', + 'callback':'window.google.ref_words' + } + url = 'https://clients1.google.com/complete/search?' + headers = { + 'Referer': 'https://translate.google.cn/', + 'Host': 'clients1.google.cn', + } + resp = session.get(url, params=params, headers=headers) + if resp.status_code == 200: + resp.encoding = 'utf-8' + result = re.search(r'window.google.ref_words\((.*)\)', resp.text).group(1) + json_data = demjson.decode(result) + data_list = list(map(lambda x:x[0], json_data[1])) + return data_list + else: + return None + + +@on_command('ja_to_zh', aliases=('日语翻译',), only_to_me=False) +async def _(session: CommandSession): + if ' ' in session.ctx['raw_message']: + msg=session.ctx['raw_message'][5:] + re_msg = translate(msg[:4999], to='zh-CN', source='ja') + if re_msg[0]!='' and re_msg[0]!=msg: + await session.send(re_msg[0]) + +@on_command('ja_to_en', aliases=('英语翻译',), only_to_me=False) +async def _(session: CommandSession): + if ' ' in session.ctx['raw_message']: + msg=session.ctx['raw_message'][5:] + re_msg = translate(msg[:4999], to='zh-CN', source='en') + if re_msg[0]!='': + await session.send(re_msg[0]) + +@on_command('zh_to_ja', aliases=('翻译日语',), only_to_me=False) +async def _(session: CommandSession): + if ' ' in session.ctx['raw_message']: + msg=session.ctx['raw_message'][5:] + re_msg = translate(msg[:4999], to='ja', source='zh-CN') + if re_msg[0]!='': + await session.send(re_msg[0]) + +@on_command('zh_to_en', aliases=('翻译英语',), only_to_me=False) +async def _(session: CommandSession): + if ' ' in session.ctx['raw_message']: + msg=session.ctx['raw_message'][5:] + re_msg = translate(msg[:4999], to='en', source='zh-CN') + if re_msg[0]!='': + await session.send(re_msg[0])
\ No newline at end of file |