文本翻译


Step1: 制作签名

文本翻译API接口签名方法需遵循“AWS API 2.0 签名规范”。

需要将签名字段按照如下方法进行拼接,并按照指定Hash算法计算后,以base64编码方式进行编码。


签名地址字段


字段 格式要求 说明 可选值
POST\n 大写、以换行\n结束 HTTP请求方法 必选
mosapi.meituan.con\n 小写,以换行\n结束 API服务主机名 必选
/mcs/v2\n\n 小写,以换行\n结束 请求绝对路径 必选

注:将所有签名地址字段拼接成string类型的字符串

例如:

POST\nmosapi.meituan.com\n/mcs/v2\n


签名参数字段


字段 类型 说明 可选值
Action string TextTranslation 必选
AWSAccessKeyId string

访问API请求的ACCESS KEY ID

(用户在美团云控制台"API秘钥"可找到该值)

必选
SignatureVersion string 2 必选
Timestamp string 请求时间戳,iso8601格式:YYYY-MM-DDTHH:MM:SS.MMMZ 必选
SignatureMethod string

数字签名的Hash算法,可能的值为"HmacSHA256"和"HmacSHA1",分别对应SHA256和SHA1算法

必选
Format string json 必选
source string utf8编码待翻译文本 必选
text_from string 翻译原语言(为“en”或“zh”之一) 必选
text_to string 翻译目标语言(为“en”或“zh”之一) 必选

注:所有签名参数按照参数名称的 字典顺序进行排序,并以 x-www-form-urlencoded 编码拼接在一起:

为了保证认证通过请务必对请求参数进行URI编码,参数中的空格务必编码为%20。将空格编码为+会导致认证不通过。

例如:


AWSAccessKeyId=8b5ad48388a347c185b6b7b0ba9e6225&Action=GetBalance&Format=json&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-11-14T03%3A10%3A55.000Z
                    


签名内容拼接


将签名地址、签名参数(字典序排序后)以 拼接成string类型的字符串

例如:


POST\nmosapi.meituan.com/mcs/v2\nAWSAccessKeyId=8b5ad48388a347c185b6b7b0ba9e6225&Action=GetBalance&Format=json&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-11-14T03%3A10%3A55.000Z



生成签名


用SECRET KEY作为秘钥对拼接后的签名内容以HmacSHA256算法进行Hash加密,并进行base64编码,最终获得签名:

例如:

xOnd5MauvUn8Kx8225Nh7tSYnuIB0oi5H2Jb00UU788=

Step2: 接口调用

接口:https://mosapi.meituan.com/mcs/v2

方法:POST


请求参数


参数名 类型 说明 可选项
Action string TextTranslation 必选
AWSAccessKeyId string

访问API请求的ACCESS KEY ID

(用户在美团云控制台"API秘钥"可找到该值)

必选
SignatureVersion string 数字签名算法版本,该值为2 必选
Timestamp string 请求时间戳,iso8601格式:YYYY-MM-DDTHH:MM:SS.MMMZ 必选
SignatureMethod string 数字签名的Hash算法,可能的值为"HmacSHA256"和&"HmacSHA1",分别对应SHA256和SHA1算法 必选
Signature string 请求内容的数字签名,具体签名生成算法见上文的数字签名生成方法 必选
Format string 返回内容的编码格式,值为json 必选
注:以上为HTTP请求包body中对应值,需要以 x-www-form-urlencoded 编码拼接在一起后才可进行HTTP请求
为了保证认证通过请务必对请求参数进行URI编码,参数中的空格务必编码为%20。将空格编码为+会导致认证不通过。


返回参数


返回类型:json

参数名 类型 说明
source string 源文本
target string 翻译后文本
err_code int 错误返回码
err_msg string 错误返回信息

返回示例:


{
    'source': 'Welcome to China', 
    'target': '欢迎来到中国', 
    'err_code': '0'
    'err_msg':''
}


错误码说明


err_code err_msg 说明
0 正常返回
AuthFailed 认证失败
1002 requests too often 请求太频繁!请稍后重试
412002000 invalid parameter 参数不正确
406001000 insufficient account balance 账户余额不足
406001001 billing request failed 请求计费失败
415009000 language type unsupported 不支持的语言类型
415010000 text out of range 文本过长(单次传输文本长度<2000字符)
503001000 Service Unavailable 服务不可用


示例代码

Python示例代码


  • 示例代码采用Python3版本
  • action字段内容对应Action内容
  • access_key、secret_key对应控制台中的Access Key ID、Access Key Secret

#! /usr/bin/env python3
#-*- coding:utf-8 -*-

import base64
import datetime
import hmac
import hashlib
import urllib
import urllib.parse
import requests
import json

access_key = ''  # Access Key ID
secret_key = ''  # Secret Key

action = 'TextTranslation'
url = 'https://mosapi.meituan.com/mcs/v2'
source = ''#待翻译文本

def get_utf8_value(value):
    if not isinstance(value, str): #and not isinstance(value, unicodedata):#(python2版本需要此句)
        value = str(value)
    if isinstance(value, str): #unicode):#(python2版本需要此句)
        return value.encode('utf-8')
    else:
        return value

def sign(params):
    pairs = []
    for key in params.keys():
        val = get_utf8_value(params[key])
        val = urllib.parse.quote(val, safe='-_~')
        pairs.append(urllib.parse.quote(key, safe='') + '=' + val)
    query = '&'.join(sorted(pairs))
    msg = ('POST\nmosapi.meituan.com\n/mcs/v2\n%s' % query)
    content = hmac.new(secret_key.encode('utf-8'), msg.encode('utf-8'), hashlib.sha256).digest()
    ret = base64.b64encode(content).decode()
    return ret

def get_query():
    return source

def pack_data():
    data = {
        'AWSAccessKeyId':access_key,
        'Action': action,
        'Format': 'json',
        'SignatureMethod': 'HmacSHA256',
        'SignatureVersion': '2',
        'Timestamp': datetime.datetime.now().isoformat()[0:-3]+'Z',
    }
    data.update({'Signature' : sign(data)})
    data.update({'source' : get_query()})
    data.update({'text_from' : 'en'})
    data.update({'text_to' : 'zh'})
    return data

def request():
    data = urllib.parse.urlencode(pack_data())
    headers = {
        'Content-type': 'application/x-www-form-urlencoded',
        'Accept': 'text/plain'
    }
    response = requests.post(
        url = url, data = data, headers = headers, verify = True
    )
    resp_format = json.loads(response.content.decode('utf-8'))
    return resp_format

if __name__ == '__main__':
    print(request())