声明:本人编程水平说不上优秀,发文章主要是为了记录学到的技术,希望顺便能够提供借鉴给到同样想学习这类型技术的friends。文笔水平一般,且会写得比较简洁,请包涵。本文章不是零基础的,看不懂就自己想办法吧。
腾讯云
腾讯云(Tencent Cloud)是由腾讯公司提供的云计算服务平台。它提供了包括云服务器(云虚拟主机)、云数据库、云存储、云网络、人工智能和物联网等一系列基础设施和服务。腾讯云致力于为个人开发者、中小企业和大型企业提供高性能、可靠、弹性的云服务,帮助用户快速搭建和扩展各种Web应用、企业应用和移动应用。
个人感觉腾讯云这个平台建设的挺好的,也不虚阿里云等其它云服务的平台。这也是我第一次正式使用腾讯云的云服务, 使用体验也是很好,然后之前我用过百度云的翻译的接口,觉得还不错,就想着腾讯云也有免费的翻译额度,于是就试着用一下腾讯云的机器翻译API接口。
机器翻译
机器翻译是一种利用计算机算法和人工智能技术的技术,可以将文本或口语从一种语言翻译成另一种语言。它可以帮助人们在跨语言交流、国际商务、旅行、学习等方面起到重要作用。机器翻译通过分析语法、词汇和语境等方面的信息来转换语言,不断学习和改进以提供更准确的翻译结果。
在日常生活中我也常常遇到一些不懂得英语或者日语得词汇,可能需要进行翻译,需要使用到各种翻译工具对这样得文本进行翻译,于是就想到既然腾讯云有这么一个免费的文本翻译服务,于是就想着去试着用一下,反正可能以后做开发也会使用到这种云服务,第一次就选则这个机器翻译练习一下。
快速上手
对于腾讯云的提供的机器翻译接口,使用起来难度也不大,文档也写得足够详细,就是感觉没有那么容易上手,于是我就整理出这么一篇笔记。
准备
在进行编程实现之前,需要做两部分准备。
第一部分
本地环境的准备,就只是简单地安装一下Python就行,建议选择3.6到3.9的版本就行,我在使用python过程中也是用这些版本比较多一点。另外需要安装一下requests模块,json模块如果没有也需要安装一下。
第二部分
腾讯云网址: https://cloud.tencent.com/
腾讯云账号的注册,在注册完成后,在控制台找到云服务,在云服务里面找到机器翻译,并开通机器翻译服务(需要进行个人认证)。
开通服务之后,再次进入就会是机器翻译控制台的页面,大概长下面图片这个样子。
点击系统设置可以开启服务,点击资源包可以看到自己的免费文字翻译的额度以及使用情况。
右上角有定价说明和API文档,建议点进去了解一下。
API文档: https://cloud.tencent.com/document/product/551/15612
了解完这个之后还要创建一个子用户,到个人页面/安全设置/用户管理/用户列表, 可以创建用户,需要给用户配置权限, 建议只配置机器翻译的权限就行,之后点击该用户查看API秘钥信息即可,如果没有密钥则创建一个密钥,等下需要复制该密钥对。
快速上手
通过API文档内容的学习,只要耐心一点,像我这样第一次使用腾讯云的都看得懂,建议先参考API文档看一下,并且文档里也有各种语言的案例可以参考,如果单纯像使用一下并且了解一下逻辑的话,看看我下面的介绍可能也行。
由于只有文字翻译的接口是可以限量免费使用的,也是我就只对该接口进行了实现,下面是我的项目的目录,之后也可以参考这个目录进行项目文件的放置。
调用的逻辑
我们使用HTTP的方式进行访问云服务,通过参考API文档中的介绍以及案例对请求进行设置就行。
此处仅列举一种方式,存在多种方式可以实现。
发送请求http时,设置请求方式为POST,需要设置请求头和请求体。请求头负责携带我们的密钥数据(验证我们调用者的身份),请求体设置为我们想要翻译的内容。
大概如下所示
#请求头信息
headers = {
# api_key加密信息
'Authorization': authorization,
# 请求参数格式
'Content-Type': 'application/json; charset=utf-8',
# 请求的地址
'Host': self.host,
# 文本翻译
'X-TC-Action': self.action,
# 版本
'X-TC-Version': self.version,
# 时间戳
'X-TC-Timestamp': str(timestamp),
# 服务器地
'X-TC-Region': self.region
}
# 请求体内容
params = {
# 需要翻译的内容
"SourceText": text,
# 当前翻译内容语言
"Source": from_language,
# 需要翻译成的语言
"Target": self.encode_language(to_language),
# 设置为0就行,(特殊情况:如果自己使用过腾讯云的项目管理功能,可能需要修改)
"ProjectId": 0
}
这里比较复杂的逻辑是需要生成这个请求头中的Authorization,参考API文档进行实现,涉及一些比较复杂的加密流程,此处就不介绍了,感兴趣可以去看看API文档中签名方法v3的介绍。
响应结果介绍
正常的响应结果
{
"Response": {
"RequestId": "000ee211-f19e-4a34-a214-e2bb1122d248",
"Source": "en",
"Target": "zh",
"TargetText": "你好"
}
}
发生错误的响应结果
{
"Response": {
"Error": {
"Code": "AuthFailure.SignatureFailure",
"Message": "The provided credentials could not be validated. Please check your signature is correct."
},
"RequestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6"
}
}
完整的代码
properties.py文件
这个文件负责进行配置,需要把自己的密钥配置到这个文件里。
介绍一下这里 language_map 的 是负责配置语言的映射的,我们调用的时候是需要传入想要转换成的语言的。所以参考API文档,如果语言的英文的前两个字母映射对不上,则可能会出错。只用英语、日语、中文的不需要理会这个问题。
# api文档链接
api_word = 'https://cloud.tencent.com/document/product/551'
# 机器翻译url
host = 'tmt.tencentcloudapi.com'
text_service_name = 'TextTranslate'
# ap_keys
api_keys = [('key_id', 'key_secret'), ('你的密钥id', '你的密钥key')]
""""
该类型的接口的调用方式是通过设置请求的公共参数加上每种请求(文本翻译、图片翻译、语音翻译等)
"""
language_map = {
'english': 'en',
'chinese': 'zh',
'japanese': 'ja'
}
text.py文件
这个文件包含调用云服务的主要逻辑,可以阅读一下,看不懂就直接用就行。如果是刚好需要这样的接口的话,那我这个代码就很适配,直接复制之后,调试一下应该没有问题。
创建了一个类进行API的调用,创建对象调用translate方法即可实现翻译API的调用。
import requests
import hashlib, hmac, json, os, sys, time
from datetime import datetime
from Tencent.translate.properties import host, text_service_name, api_keys, language_map
"""
说明:
默认接口请求频率限制:5次/秒。
application/json(推荐),必须使用签名方法 v3(TC3-HMAC-SHA256)。
请求头信息
公共参数(apikey信息等)+请求参数(正常信息)
Authorization: TC3-HMAC-SHA256
Content-Type: application/json
Host: cvm.tencentcloudapi.com
X-TC-Action: DescribeInstances
X-TC-Version: 2017-03-12
X-TC-Timestamp: 1539084154
X-TC-Region: ap-guangzhou
Host 填自己需要访问的接口的域名
X-TC-Action 需要的服务 文本翻译对应 TextTranslate
X-TC-Version 服务版本信息 2018-03-21
X-TC-Timestamp 当前时间戳
X-TC-Region 服务器地区 取值有很多, 建议选择近的 ap-guangzhou
请求体内容:
{
"SourceText": null,
"Source": null,
"Target": null,
"ProjectId": null,
"UntranslatedText": null
}
返回结果:
{
"Response": {
"RequestId": "000ee211-f19e-4a34-a24-e2bb1122d248",
"Source": "en",
"Target": "zh",
"TargetText": "你好"
}
}
错误的情况:
{
"Response": {
"Error": {
"Code": "AuthFailure.SignatureFailure",
"Message": "The provided credentials could not be validated. Please check your signature is correct."
},
"RequestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6"
}
}
"""
class TextTranslator(object):
def __init__(self):
# 密钥参数
api_index = 1
self.secret_id = api_keys[api_index][0]
self.secret_key = api_keys[api_index][1]
self.host = host
self.region = 'ap-guangzhou'
self.version = '2018-03-21'
self.service = "tmt"
self.action = text_service_name
pass
def get_Authorization(self, params, timestamp):
# 密钥参数
secret_id = self.secret_id
secret_key = self.secret_key
service = self.service
host = self.host
endpoint = "https://" + host
region = self.region
action = self.action
version = self.version
algorithm = "TC3-HMAC-SHA256"
# 从方法中输入
# timestamp = timestamp
date = datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d")
# ************* 步骤 1:拼接规范请求串 *************
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)
# print(canonical_request)
# ************* 步骤 2:拼接待签名字符串 *************
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)
# print(string_to_sign)
# ************* 步骤 3:计算签名 *************
secret_date = self.sign(("TC3" + secret_key).encode("utf-8"), date)
secret_service = self.sign(secret_date, service)
secret_signing = self.sign(secret_service, "tc3_request")
signature = hmac.new(secret_signing, string_to_sign.encode("utf-8"), hashlib.sha256).hexdigest()
# print(signature)
# ************* 步骤 4:拼接 Authorization *************
authorization = (algorithm + " " +
"Credential=" + secret_id + "/" + credential_scope + ", " +
"SignedHeaders=" + signed_headers + ", " +
"Signature=" + signature)
# print(authorization)
# print('curl -X POST ' + endpoint
# + ' -H "Authorization: ' + authorization + '"'
# + ' -H "Content-Type: application/json; charset=utf-8"'
# + ' -H "Host: ' + host + '"'
# + ' -H "X-TC-Action: ' + action + '"'
# + ' -H "X-TC-Timestamp: ' + str(timestamp) + '"'
# + ' -H "X-TC-Version: ' + version + '"'
# + ' -H "X-TC-Region: ' + region + '"'
# + " -d '" + payload + "'")
return authorization
def translate(self, text, to_language, from_language="auto"):
try:
if from_language != 'auto':
from_language = self.encode_language(from_language)
# 请求体
params = {
"SourceText": text,
"Source": from_language,
"Target": self.encode_language(to_language),
"ProjectId": 0
# 不需要携带下面参数
# "UntranslatedText": None
}
# 请求头信息
# 生成请求时间
timestamp = int(time.time())
authorization = self.get_Authorization(params, timestamp)
headers = {
# api_key加密信息
'Authorization': authorization,
# 请求参数格式
'Content-Type': 'application/json; charset=utf-8',
# 请求的地址
'Host': self.host,
# 文本翻译
'X-TC-Action': self.action,
# 版本
'X-TC-Version': self.version,
# 时间戳
'X-TC-Timestamp': str(timestamp),
# 服务器地区
'X-TC-Region': self.region
}
# 10秒之内响应否则认为校验失败
response = requests.post(url='https://'+host, data=json.dumps(params), headers=headers, timeout=10)
res = json.loads(response.content)['Response']
# 输出请求体
# print(res)
if res.get('Error') is None:
# 输出翻译内容
# print(res['Source'])
# print(res['Target'])
print(res['TargetText'])
return res['TargetText']
else:
# 打印错误信息
print(res['Error']['Code'])
print(res['Error']['Message'])
return None
except Exception as e:
print(e)
@staticmethod
def sign(key, msg):
"""
计算签名摘要函数
:param msg:
:return:
"""
return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()
@staticmethod
def encode_language(language: str):
if language_map.get(language.lower()):
return language_map[language.lower()]
else:
# 没有找到
print("没有找到语言映射, 可能导致错误")
return language.lower()[:2]
text_translator = TextTranslator()
if __name__ == '__main__':
text_translator.translate('你好, 世界!', to_language="English")
text_translator.translate('成为新世界的神!', to_language="japanese")
pass
调用测试
导入好包,pycharm配置完运行环境后,再修改完成自己的密钥对之后,就可以直接进行运行了,运行该text.py文件的main方法就可以看到如下结果,需要将其作为组件使用的话,就导入该文件的类或者对象即可。
报错了怎么办
导入就报错的情况:
最大可能是导包的路径没有对上,可以参考之前我的项目结构进行修改, 自己会修改就自己修改就行,不用按我的来。
发生返回结果错误的情况:
① 检查密钥是否正确配置
② 检查网络是否有问题
③ 学习代码中的逻辑(不难)并查看API文档解决