dict-server/app/api/translator.py

117 lines
3.3 KiB
Python

from typing import Tuple
from wsgiref import headers
import httpx
import random
import json
from hashlib import md5
import requests
from fastapi import APIRouter, Depends, HTTPException
from app.models import User
from app.schemas.trans_schemas import TransResponse, TransRequest
from app.utils.security import is_admin_user, get_current_user
from scripts.md5 import make_md5
from settings import settings
translator_router = APIRouter()
# For list of language codes, please refer to `https://api.fanyi.baidu.com/doc/21`
from_lang = 'en'
to_lang = 'zh'
# endpoint = 'https://api.fanyi.baidu.com'
# path = '/api/trans/vip/translate'
# url = endpoint + path
#
# query = 'Hello World! This is 1st paragraph.\nThis is 2nd paragraph.'
#
# salt = random.randint(32768, 65536)
# sign = make_md5(appid + query + str(salt) + appkey)
#
# headers = {'Content-Type': 'application/x-www-form-urlencoded'}
# payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}
#
#
# # Send request
# r = requests.post(url, params=payload, headers=headers)
# result = r.json()
#
# # Show response
# print(json.dumps(result, indent=4, ensure_ascii=False))
async def baidu_translation(query: str, from_lang: str, to_lang: str):
url = "http://api.fanyi.baidu.com/api/trans/vip/translate"
appid = settings.BAIDU_APPID
appkey = settings.BAIDU_APPKEY
salt = str(random.randint(32768, 65536))
sign = make_md5(appid + query + salt + appkey)
payload = {
"q": query,
"from": from_lang,
"to": to_lang,
"appid": appid,
"salt": salt,
"sign": sign,
}
# print(payload)
#
# request = httpx.Request(
# "POST",
# url,
# data=payload,
# headers={"Content-Type": "application/x-www-form-urlencoded"}
# )
# print("完整请求内容:")
# print("URL:", request.url)
# print("Headers:", request.headers)
# print("Body:", request.content.decode("utf-8"))
async with httpx.AsyncClient(timeout=10) as client:
response = await client.post(
url,
data=payload,
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
if response.status_code != 200:
raise HTTPException(status_code=500, detail=response.text)
data = response.json()
print(json.dumps(data, indent=2, ensure_ascii=False))
if "trans_result" not in data:
raise HTTPException(status_code=500, detail=data.get("error_msg", "Unknown error"))
return "\n".join([item["dst"] for item in data["trans_result"]])
@translator_router.post('/translate', response_model=TransResponse)
async def translate(
translate_request: TransRequest,
user=Depends(get_current_user)
):
text = await baidu_translation(
query=translate_request.query,
from_lang=translate_request.from_lang,
to_lang=translate_request.to_lang,
)
return TransResponse(translated_text=text)
@translator_router.post('/translate/debug')
async def test_translate(
query: str,
from_lang: str = "auto",
to_lang: str = 'zh',
admin_user: Tuple[User, dict] = Depends(is_admin_user)
):
raw = await baidu_translation(query, from_lang, to_lang)
return TransResponse(translated_text=raw)