浏览器端使用javascript调用腾讯翻译api
最近在学习的小玩意,发现腾讯的文档十分坑爹,里面有很多错误的指示。
不过腾讯的机器翻译还是很牛的,我觉得翻译水准比谷歌好很多。
腾讯的机器翻译貌似在试用阶段,不收费,用QQ或微信登录即可申请使用。
首先获得SecretId和SecretKey,最好是创建一个子用户,因为这两个“秘密”都要明文写在js里。创建一个工程,这样就有了ProjectId。
准备好如下的参数:
var reqParams = [
[ "Action", "TextTranslate" ],
[ "Nonce", Nonce ], // 随机整数
[ "ProjectId", ProjectId],
["Region", "ap-beijing"],
["SecretId", SecretId],
["Source","auto"], // 自动检测要翻译的文本的语种
["SourceText", sourceText], // 要翻译的文本。生成签名时,必须使用原文本,即没有做uri编码的
["Target","zh"], // 翻译成哪个语种,这里是翻译成中文
["Timestamp",timestamp ], // 时间戳,以秒为单位,而js里用Date对象获取的时间戳是毫秒的,注意。腾讯文档说时间戳是0时区的,但其实就是东八区(北京时区)
["Version","2018-03-21"]
];
上面是一个嵌套的数组,或者说二维数组,这是为了方便排序(上面的顺序已经是排好了的)。必须先按参数的字母顺序排序后,拼成字符串,再做签名。
参数对转字符串函数:
// 参数对转成字符串
function paramsToStr(params)
{
// 按参数名的字典序排序 params.sort(function(a,b){
if(a[0] < b[0]) return -1;
else if(a[0] > b[0]) return 1;
return 0;
}); // 连成字符串 var parPairStrArr = [];
for (var i in params)
{
var par = params[i];
var parStr = par.join("=");
parPairStrArr.push(parStr);
}
var str = parPairStrArr.join("&");
return str;
}
有了参数字符串,再构造签名用的字符串,它需要包含请求方法、请求路径、请求参数。
// 签名原文字符串
var signStr = reqMethod + makeBaseUrl(host, hostPath) + "?" + paramsStr; // reqMethod 就是 GET 或 POST
// makeBaseUrl 只是简单的返回了腾讯翻译的域名(不包括https://),在这里是tmt.tencentcloudapi.com // 签名
var hs = CryptoJS.HmacSHA1(signStr, SecretKey);
var rawSig = CryptoJS.enc.Base64.stringify(hs);
console.log("rawSig=" + rawSig);
var sig = encodeURIComponent(rawSig); // 必须使用 encodeURIComponent,对base64字符串中的特殊字符也做uri编码
return sig;
获取到 sig 后,下面要生成真正用于http请求的url,在这里使用 GET 方法,所以参数都直接附在Url中。这时,sourceText,也就是待翻译文本,需要先把空格替换成+号、在做uri编码。
var iSourceText = reqParams.findIndex((p)=>(p[0]=="SourceText"));
reqParams[iSourceText][1] = encodeURI(sourceText.replace(/\ /g,"+"));
var paramsStr = paramsToStr(reqParams); var url = "https://" + makeBaseUrl(host, hostPath) + "?" + paramsStr + "&Signature=" + sig;
console.log("url=" + url);
接下来就是使用 XMLHttpRequest 做http请求了。但是腾讯翻译服务器那边没有允许跨域。可以装个插件解决此问题。
允许浏览器跨域请求http的插件:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
完整代码:
// 参数对转成字符串
function paramsToStr(params)
{
// 按参数名的字典序排序 params.sort(function(a,b){
if(a[0] < b[0]) return -1;
else if(a[0] > b[0]) return 1;
return 0;
}); // 连成字符串 var parPairStrArr = [];
for (var i in params)
{
var par = params[i];
var parStr = par.join("=");
parPairStrArr.push(parStr);
}
var str = parPairStrArr.join("&");
return str;
} function makeBaseUrl(host, hostPath)
{
return host + hostPath;
} // 声称签名
function makeSignature(reqMethod, host, hostPath, reqParams)
{
var paramsStr = paramsToStr(reqParams); // 签名原文字符串
var signStr = reqMethod + makeBaseUrl(host, hostPath) + "?" + paramsStr; // 签名
var hs = CryptoJS.HmacSHA1(signStr, SecretKey);
var rawSig = CryptoJS.enc.Base64.stringify(hs);
console.log("rawSig=" + rawSig);
var sig = encodeURIComponent(rawSig);
return sig;
} // 发送翻译请求
function sendTrans(sourceText, cb)
{
if(sourceText == null || sourceText == "")
{
cb("");
return;
} var SecretId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var SecretKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; var reqMethod = "GET";
var host = "tmt.tencentcloudapi.com";
var hostPath = "/"; var Nonce = Math.floor(Math.random() * 1000000000);
var date = new Date();
var timestamp = Math.floor(date.getTime() / 1000); var reqParams = [
[ "Action", "TextTranslate" ],
[ "Nonce", Nonce ],
[ "ProjectId", xxxxxxxx],
["Region", "ap-beijing"],
["SecretId", SecretId],
["Source","auto"],
["SourceText", sourceText], // 生成签名时,使用原文本
["Target","zh"],
["Timestamp",timestamp ],
["Version","2018-03-21"]
]; // 生成签名
var sig = makeSignature(reqMethod, host, hostPath, reqParams); // 原文本中所有的空格替换成+号,然后uri编码
var iSourceText = reqParams.findIndex((p)=>(p[0]=="SourceText"));
reqParams[iSourceText][1] = encodeURI(sourceText.replace(/\ /g,"+"));
var paramsStr = paramsToStr(reqParams); var url = "https://" + makeBaseUrl(host, hostPath) + "?" + paramsStr + "&Signature=" + sig;
console.log("url=" + url); var xhr = new XMLHttpRequest();
xhr.timeout = 3000;
xhr.ontimeout = function()
{
cb("超时,翻译失败");
};
xhr.onerror = function()
{
cb("错误,翻译失败");
}; xhr.open(reqMethod, url, true);
xhr.responseType = "json";
var sendRet = xhr.send();
xhr.onreadystatechange = function()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200 || xhr.status == 304)
{
var ret = xhr.response;
cb(ret.Response.TargetText);
}
else
{
cb(xhr.responseText);
}
}
};
}
浏览器端使用javascript调用腾讯翻译api的更多相关文章
- C++调用有道翻译API实现在线翻译之发声篇
大概半月前写了一篇博文:C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译, 得到大家的热情捧场,有人看了文章说要是能发声不是更好,我觉得说的也是哈,能听到专家的标准发音,那该是多美的 ...
- HTML实现调用百度在线翻译API
HTML实现调用百度在线翻译API 本文章已收录于: <!doctype html> <html lang="en"> <head> < ...
- 微信小程序wx.getLocation()获取经纬度及JavaScript SDK调用腾讯地图API获取某一类地址
简介 腾讯位置服务为微信小程序提供了基础的标点能力.线和圆的绘制接口等地图组件和位置展示.地图选点等地图API位置服务能力支持,使得开发者可以自由地实现自己的微信小程序产品. 在此基础上,腾讯位置服务 ...
- python调用有道翻译api实现翻译
通过调用有道翻译的api,实现中译英.其他语言译中文 代码: # coding=utf-8 import urllib import urllib2 import json import time i ...
- C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译
使用C++开发一个在线翻译工具,这个想法在我大脑中过了好几遍了,所以就搜了下资料,得知网络上有很多翻译API,这里我选择我平时使用较多的有道翻译API进行在线翻译工具开发的练习.翻译API返回的结果常 ...
- .NET调用腾讯云API实例
最近项目有用到腾讯云的身份识别接口,话不多说,直接上代码: private void IDCardVerification(HttpContext context) { string imgStr = ...
- Python调用腾讯云API,实现人脸年龄变化
网上看到了一个教程,调用腾讯云的人脸识别api和修改年龄api来实现模拟人物不同年龄的面貌 但是大多数教程的代码都是想同的,估计是抄袭哪个人的关键是执行不了 刚好周杰伦马上要发新专辑了,小改一下,拿杰 ...
- Chrome浏览器端调试JavaScript
1. 一个超级简单的html文件拉入chrome浏览器 2. 右键-->检查 3. 点击Sources 4. html的12行加个断点 5. 刷新页面,点开Console面板,输入变量num,我 ...
- 调用有道翻译API
前两天朋友说起NASA开放了数据API,今儿突然想起从来没用过外部提供的API,然而简单用得多的貌似是有道词典API,就像试试,本来觉得应该挺简单的,用urllib模块很快就实现了. 不过测试时才发现 ...
随机推荐
- 2018-2019-1 20165318 20165326 实验五 通讯协议设计.md
目录 实验内容 问题及解决 参考资料 实验内容 任务一 在Ubuntu中完成作业 openSSL OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/L ...
- 用Webstrom搭建Vue项目
一.首先要有Node.js Webpack环境 1.Node.js:是一个能够在服务器端运行JavaScript的开放源代码,跨平台JavaScript运行环境.Node采用Google开发的V8 ...
- FireFox 插件xpi文件签名2
上一篇https://www.cnblogs.com/nightnine/p/6140676.html 提交到官方网站上的签名,官方已经拒绝了 于是手动自己签名 官方文档:https://develo ...
- python日常小计
1.查看变量类型: pring type(item) 2.解决list中的中文显示乱码 使用decode('string_escap')将数据库查询返回的将带转义的字节码字符串转换为成utf-8中文
- ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一)
前言: 第一次接触ABP的项目是在2018年6月份,但是当时没有深入具体的研究,而今天因为工作的需要,需要学习.了解这个框架,在时隔半年之后,今天重新下载了这个项目,虽然在园子里有很多前辈们写的这类的 ...
- ios 拉伸背景图中间图片不变四周拉伸
上图中间区域的翅膀不能变形,Android的点九能很好的解决,但是iOS的stretchableImageWithLeftCapWidth没法一次性指定拉伸区域,最后发现https://www.jia ...
- SQL 姓名,联系方式-脱敏
SELECT ORDER_PROJECT.project_type AS attribute, ORDER_PROJECT.order_num, ,), "*") AS pv, C ...
- 虚拟机中ubuntu不能联网问题的解决——NAT方式
困惑我多时的Ubuntu联网问题终于解决啦,开心!!!现记录如下,方便日后取用. 可先直接尝试第3步,若不行,则走完全程. 1.查看/设置下NAT的网络 打开VMware Workstation, 点 ...
- 三维机翼某一断面的压力系数X-Y曲线绘制——使用tecplot的extract功能
目标:绘制三维物体表面或者某等值面上某一截断线上的压力系数X-Y曲线 Slices不光可以在一个体上切出来一个平面,还可以和一个面相交切出一条曲线,命令是在Slice Details里面的Slice ...
- Altium Designer 10 使用技巧
一.封装文件.PCB文件编辑时的吸附(Snap)的灵敏度. 像焊盘中心.过孔中心.线段的端点.走线的端点.铺铜的顶点,这样的点有吸附光标的特性,鼠标移动到这些点的附近会被吸附到上面.Snap的灵敏度可 ...