|
import hashlib |
|
import hmac |
|
import json |
|
import time |
|
from datetime import datetime |
|
|
|
import requests |
|
|
|
from scripts.physton_prompt.get_lang import get_lang |
|
from scripts.physton_prompt.translator.base_tanslator import BaseTranslator |
|
|
|
|
|
class TencentTranslator(BaseTranslator): |
|
def __init__(self): |
|
super().__init__('tencent') |
|
|
|
def _get_config(self): |
|
secret_id = self.api_config.get('secret_id', '') |
|
secret_key = self.api_config.get('secret_key', '') |
|
region = self.api_config.get('region', 'ap-shanghai') |
|
if not secret_id: |
|
raise Exception(get_lang('is_required', {'0': 'Secret ID'})) |
|
if not secret_key: |
|
raise Exception(get_lang('is_required', {'0': 'Secret Key'})) |
|
if not region: |
|
raise Exception(get_lang('is_required', {'0': 'Region'})) |
|
return secret_id, secret_key, region |
|
|
|
def translate(self, text): |
|
if not text: |
|
return '' |
|
secret_id, secret_key, region = self._get_config() |
|
params = { |
|
'SourceText': text, |
|
'Source': self.from_lang, |
|
'Target': self.to_lang, |
|
'ProjectId': 0 |
|
} |
|
res = sign_tencent(secret_id, secret_key, region, params) |
|
response = requests.post(res['url'], json=params, timeout=10, headers=res['headers']) |
|
result = response.json() |
|
if 'Response' not in result: |
|
raise Exception(get_lang('no_response_from', {'0': 'Tencent'})) |
|
if 'TargetText' not in result['Response']: |
|
raise Exception(get_lang('no_response_from', {'0': 'Tencent'})) |
|
return result['Response']['TargetText'] |
|
|
|
def translate_batch(self, texts): |
|
if not texts: |
|
return [] |
|
secret_id, secret_key, region = self._get_config() |
|
params = { |
|
'SourceTextList': texts, |
|
'Source': self.from_lang, |
|
'Target': self.to_lang, |
|
'ProjectId': 0 |
|
} |
|
res = sign_tencent(secret_id, secret_key, region, params, 'TextTranslateBatch') |
|
response = requests.post(res['url'], json=params, timeout=10, headers=res['headers']) |
|
result = response.json() |
|
if 'Response' not in result: |
|
raise Exception(get_lang('no_response_from', {'0': 'Tencent'})) |
|
if 'TargetTextList' not in result['Response']: |
|
raise Exception(get_lang('no_response_from', {'0': 'Tencent'})) |
|
return result['Response']['TargetTextList'] |
|
|
|
|
|
def sign_tencent(secret_id, secret_key, regin, params, action="TextTranslate", version="2018-03-21"): |
|
host = 'tmt.tencentcloudapi.com' |
|
endpoint = "https://" + host |
|
|
|
service = "tmt" |
|
algorithm = "TC3-HMAC-SHA256" |
|
timestamp = int(time.time()) |
|
date = datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d") |
|
|
|
|
|
http_request_method = "POST" |
|
canonical_uri = "/" |
|
canonical_querystring = "" |
|
ct = "application/json; charset=utf-8" |
|
payload = json.dumps(params) |
|
canonical_headers = "content-type:%s\nhost:%s\nx-tc-action:%s\n" % (ct, host, action.lower()) |
|
signed_headers = "content-type;host;x-tc-action" |
|
hashed_request_payload = hashlib.sha256(payload.encode("utf-8")).hexdigest() |
|
canonical_request = (http_request_method + "\n" + |
|
canonical_uri + "\n" + |
|
canonical_querystring + "\n" + |
|
canonical_headers + "\n" + |
|
signed_headers + "\n" + |
|
hashed_request_payload) |
|
|
|
|
|
credential_scope = date + "/" + service + "/" + "tc3_request" |
|
hashed_canonical_request = hashlib.sha256(canonical_request.encode("utf-8")).hexdigest() |
|
string_to_sign = (algorithm + "\n" + |
|
str(timestamp) + "\n" + |
|
credential_scope + "\n" + |
|
hashed_canonical_request) |
|
|
|
|
|
|
|
def sign(key, msg): |
|
return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() |
|
|
|
secret_date = sign(("TC3" + secret_key).encode("utf-8"), date) |
|
secret_service = sign(secret_date, service) |
|
secret_signing = sign(secret_service, "tc3_request") |
|
signature = hmac.new(secret_signing, string_to_sign.encode("utf-8"), hashlib.sha256).hexdigest() |
|
|
|
|
|
authorization = (algorithm + " " + |
|
"Credential=" + secret_id + "/" + credential_scope + ", " + |
|
"SignedHeaders=" + signed_headers + ", " + |
|
"Signature=" + signature) |
|
|
|
return { |
|
"url": endpoint, |
|
"headers": { |
|
"Authorization": authorization, |
|
"Content-Type": ct, |
|
"Host": host, |
|
"X-TC-Action": action, |
|
"X-TC-Timestamp": str(timestamp), |
|
"X-TC-Version": version, |
|
"X-TC-Region": regin, |
|
}, |
|
} |
|
|