File size: 2,279 Bytes
9dce458
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

# -*- coding: utf-8 -*-
from functools import cached_property
import uuid
import hmac, base64
import aiohttp
import time
import requests
import re

from .common import CommonTranslator, InvalidServerResponse

class PapagoTranslator(CommonTranslator):
    _LANGUAGE_CODE_MAP = {
        'CHS': 'zh-CN',
        'CHT': 'zh-TW',
        'JPN': 'ja',
        'ENG': 'en',
        'KOR': 'ko',
        'VIN': 'vi',
        'FRA': 'fr',
        'DEU': 'de',
        'ITA': 'it',
        'PTB': 'pt',
        'RUS': 'ru',
        'ESP': 'es',
        'THA': 'th',
        'IND': 'id'
    }
    _API_URL = 'https://papago.naver.com/apis/n2mt/translate'

    async def _translate(self, from_lang, to_lang, queries):
        data = {}
        data['honorific'] = "false"
        data['source'] = from_lang
        data['target'] = to_lang
        data['text'] = '\n'.join(queries)
        result = await self._do_request(data, self._version_key)
        if "translatedText" not in result:
            raise InvalidServerResponse(f'Papago returned invalid response: {result}\nAre the API keys set correctly?')
        result_list = [str.strip() for str in result["translatedText"].split("\n")]
        return result_list

    @cached_property
    def _version_key(self):
        script = requests.get('https://papago.naver.com')
        mainJs = re.search(r'\/(main.*\.js)', script.text).group(1)
        papagoVerData = requests.get('https://papago.naver.com/' + mainJs)
        papagoVer = re.search(r'"PPG .*,"(v[^"]*)', papagoVerData.text).group(1)
        return papagoVer

    async def _do_request(self, data, version_key):
        guid = uuid.uuid4()
        timestamp = int(time.time() * 1000)
        key = version_key.encode("utf-8")
        code = f"{guid}\n{self._API_URL}\n{timestamp}".encode("utf-8")
        token = base64.b64encode(hmac.new(key, code, "MD5").digest()).decode("utf-8")
        headers = {
            "Authorization": f"PPG {guid}:{token}",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Timestamp": str(timestamp),
        }
        async with aiohttp.ClientSession() as session:
            async with session.post(self._API_URL, data=data, headers=headers) as resp:
                return await resp.json()