|
from scripts.physton_prompt.translator.base_tanslator import BaseTranslator |
|
from datetime import datetime |
|
from wsgiref.handlers import format_date_time |
|
from time import mktime |
|
import hashlib |
|
import base64 |
|
import hmac |
|
from urllib.parse import urlencode |
|
import json |
|
import requests |
|
from scripts.physton_prompt.get_lang import get_lang |
|
|
|
|
|
class IflytekV2Translator(BaseTranslator): |
|
def __init__(self): |
|
super().__init__('iflytekV2') |
|
|
|
def translate(self, text): |
|
if not text: |
|
return '' |
|
app_id = self.api_config.get('app_id', '') |
|
if not app_id: |
|
raise Exception(get_lang('is_required', {'0': 'APP ID'})) |
|
api_secret = self.api_config.get('api_secret', '') |
|
if not api_secret: |
|
raise Exception(get_lang('is_required', {'0': 'API Secret'})) |
|
api_key = self.api_config.get('api_key', '') |
|
if not api_key: |
|
raise Exception(get_lang('is_required', {'0': 'API Key'})) |
|
|
|
response = translate(text, From=self.from_lang, To=self.to_lang, APPId=app_id, APISecret=api_secret, APIKey=api_key) |
|
if response.status_code != 200: |
|
raise Exception(get_lang('request_error', {'0': 'iflytekV1'})) |
|
if not response.text: |
|
raise Exception(get_lang('response_is_empty', {'0': 'iflytekV1'})) |
|
result = json.loads(response.content.decode()) |
|
if 'header' not in result: |
|
raise Exception(get_lang('no_response_from', {'0': 'iflytekV1'})) |
|
result = json.loads(response.content.decode()) |
|
if 'code' not in result['header']: |
|
raise Exception(get_lang('no_response_from', {'0': 'iflytekV1'})) |
|
if result['header']['code'] != 0: |
|
raise Exception(result['header']['message']) |
|
restul_decode = base64.b64decode(result['payload']['result']['text']).decode() |
|
result_json = json.loads(restul_decode) |
|
if 'trans_result' not in result_json: |
|
raise Exception(get_lang('no_response_from', {'0': 'iflytekV1'})) |
|
return result_json['trans_result']['dst'] |
|
|
|
class Url: |
|
def __init__(self, host, path, schema): |
|
self.host = host |
|
self.path = path |
|
self.schema = schema |
|
pass |
|
|
|
|
|
def sha256base64(data): |
|
sha256 = hashlib.sha256() |
|
sha256.update(data) |
|
digest = base64.b64encode(sha256.digest()).decode(encoding='utf-8') |
|
return digest |
|
|
|
def parse_url(requset_url): |
|
stidx = requset_url.index("://") |
|
host = requset_url[stidx + 3:] |
|
schema = requset_url[:stidx + 3] |
|
edidx = host.index("/") |
|
if edidx <= 0: |
|
raise Exception("invalid request url:" + requset_url) |
|
path = host[edidx:] |
|
host = host[:edidx] |
|
u = Url(host, path, schema) |
|
return u |
|
|
|
|
|
def assemble_ws_auth_url(requset_url, method="POST", api_key="", api_secret=""): |
|
u = parse_url(requset_url) |
|
host = u.host |
|
path = u.path |
|
now = datetime.now() |
|
date = format_date_time(mktime(now.timetuple())) |
|
signature_origin = "host: {}\ndate: {}\n{} {} HTTP/1.1".format(host, date, method, path) |
|
signature_sha = hmac.new(api_secret.encode('utf-8'), signature_origin.encode('utf-8'), |
|
digestmod=hashlib.sha256).digest() |
|
signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8') |
|
authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % ( |
|
api_key, "hmac-sha256", "host date request-line", signature_sha) |
|
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8') |
|
values = { |
|
"host": host, |
|
"date": date, |
|
"authorization": authorization |
|
} |
|
|
|
return requset_url + "?" + urlencode(values) |
|
|
|
def translate(Text, From, To, APPId, APISecret, APIKey, Host="itrans.xf-yun.com"): |
|
RequestUri = "/v1/its" |
|
url="https://"+Host+RequestUri |
|
|
|
body = { |
|
"header": { |
|
"app_id": APPId, |
|
"status": 3, |
|
}, |
|
"parameter": { |
|
"its": { |
|
"from": From, |
|
"to": To, |
|
"result": {} |
|
} |
|
}, |
|
"payload": { |
|
"input_data": { |
|
"encoding": "utf8", |
|
"status": 3, |
|
"text": base64.b64encode(Text.encode("utf-8")).decode('utf-8') |
|
} |
|
} |
|
} |
|
|
|
request_url = assemble_ws_auth_url(url, "POST", APIKey, APISecret) |
|
|
|
headers = {'content-type': "application/json", 'host': 'itrans.xf-yun.com', 'app_id': APPId} |
|
|
|
response = requests.post(request_url, data=json.dumps(body), headers=headers) |
|
return response |
|
|