`
lovelease
  • 浏览: 388050 次
社区版块
存档分类
最新评论

MS Bing Translate API安全机制变化后的全新调用方式

阅读更多
前一阵子做一个自己的翻译网站时想加入一个Google Translate的网络翻译,调查后发现Google现在已经开始收费,没办法,只好转微软的Bing Translate。问题是,微软更新了API的调用方式,以前是只要有MSN账号,在bing的网站注册自己的开发者信息就可以通过安全key还是什么调用了,而现在为了安全起见,微软同样需要你先去注册,然后你想要调用API是需要先发送该注册账户到服务器,微软会生成一个名为accessToken的key给你,之后你再拿这个key调用API,此时才能真正的使用Bing Translate API。可见,旧的调用方式是一次web访问就可以,而现在需要两次web访问,一次是为了获得accessToken,第二次才是调用API。另外,需要注意的是,一次成功获得accessToken后有效期为10分钟,在这10分钟内你调用Bing Translate API前不需要再重新获得新的accessToken。
做这个功能花了点时间,因为官方的文档只是简单提了一下他们的安全验证方式改了,之前的那种方式不再使用,问题是API还是旧的,里面的例子也是旧的,在网上找了很多资料,基本也都是微软修改之前的实现方式,自己摸爬滚打总算实现了,在这里介绍一下,方便其他人参考:
1.首先当然是前台的js:
function BingTranslate() {
			var options = {
					url:'../doWebTranslate.do',
					type:'POST',
					dataType:'json',
					success: BingTranslateSucceed
				};
			$.ajax(options);
			
	}

上面的代码中我省略了10分钟的判断,关键的其实就是发送ajax请求的这部分,就是通过doWebTranslate.do这个action来获取accessToken的。此次ajax相应成功后会执行BingTranslateSucceed函数,该函数的作用才是访问Bing Translate API查单词的,这里有两种方式访问,一种是直接通过js实现web访问,另一种是通过java实现(当然需要另一个action了),简单起见,我用第一种:
/** 
	 * response function for Bing Translate request
	 */
	function BingTranslateSucceed(result) {
		window.mycallback = function(searchResponse) {
			preReqDoneFlg = true;
			
			clearInterval(clock);
			$("#bing-translate-result").text(searchResponse);
			sec = 1;
		};
		if (!renewFlg) {
			accessToken = result;
		} else {
			accessToken = encodeURIComponent(result.response.access_token);
		}
		
		var text = $('input[name=searchStr]').val();
		var from = "en";
		var to = "zh-CHS";
		var s = document.createElement("script");
		s.type = "text/javascript";
		s.src = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate?oncomplete=mycallback&appId=Bearer " + accessToken + "&from=" + from + "&to=" + to + "&text=" + text;
		document.getElementsByTagName("head")[0].appendChild(s);
	}


至此就实现了Bing Translate API的调用,那么究竟是如何获取accessToken的呢?

获取accessToken的核心部分,这部分其实就是通过java的HttpPost访问网络数据了:
/**
 * request to Azure DataMarket to get access token
 * 
 * @author weishijie
 *
 */
public class AdmAuthentication
{
    private String clientId;
    private String clientSecret;

    public AdmAuthentication(String clientId, String clientSecret)
    {
        this.clientId = clientId;
        this.clientSecret = clientSecret;
    }

    public AdmAccessTokenVo GetAccessToken()
    {
        try {
			return HttpPost(AccessTokenGenConsts.DATA_MARKET_ACCESS_URI);
		} catch (Exception e) {
			LogUtil.log.info(e);
			e.printStackTrace();
			return null;
		}
    }

    /**
     * Make a http post request to the token service
     * 
     * @param DatamarketAccessUri https://datamarket.accesscontrol.windows.net/v2/OAuth2-13
     * @return AdmAccessTokenVo object
     * @throws Exception
     */
    private AdmAccessTokenVo HttpPost(String DatamarketAccessUri) throws Exception
    {
    	HttpClient httpClient = new DefaultHttpClient();
    	//建立HttpPost对象
    	HttpPost httppost = new HttpPost(DatamarketAccessUri);
    	//建立一个NameValuePair数组,用于存储欲传送的参数
    	List<NameValuePair> params=new ArrayList<NameValuePair>();
    	//添加参数
    	params.add(new BasicNameValuePair("client_id", this.clientId));
    	params.add(new BasicNameValuePair("client_secret", this.clientSecret));
    	params.add(new BasicNameValuePair("grant_type", AccessTokenGenConsts.GRANT_TYPE));
    	params.add(new BasicNameValuePair("scope", AccessTokenGenConsts.SCOPE));
    	//设置编码
    	httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
    	//发送Post,并返回一个HttpResponse对象
    	HttpResponse response = httpClient.execute(httppost);
    	
    	String access_token = "";
        String token_type = "";
        String expires_in = "";
        String scope = "";
        //如果状态码为200,就是正常返回
    	if(response.getStatusLine().getStatusCode() == 200){
    		//如果是下载文件,可以用response.getEntity().getContent()返回InputStream
			String result=EntityUtils.toString(response.getEntity());
			JSONObject jsonObj = JSONObject.fromObject(result);
			
			access_token = jsonObj.getString("access_token");
	        token_type = jsonObj.getString("token_type");
	        expires_in = jsonObj.getString("expires_in");
	        scope = jsonObj.getString("scope");
		}
        
        AdmAccessTokenVo token = new AdmAccessTokenVo(access_token, token_type, expires_in, scope);
        return token;
    }
}


这个代码中需要5个常量,其中3个是固定的,还有两个则是自己在微软服务器上注册后得到的:
public class AccessTokenGenConsts {

	/** AccessTokenGen const */
	
	/** uri of Azure DataMarket */
	public static String DATA_MARKET_ACCESS_URI = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
	/** grant type of Token Request Input Parameters */
	public static String GRANT_TYPE = "client_credentials";
	/** scope of Token Request Input Parameters */
	public static String SCOPE = "http://api.microsofttranslator.com";
	/** client id of Token Request Input Parameters
	 * (registered in Azure DataMarket:https://datamarket.azure.com/developer/applications/)
	 */
	public static String CLIENT_ID = "XXX";
	/** client secret of Token Request Input Parameters
	 * (registered in Azure DataMarket:https://datamarket.azure.com/developer/applications/)
	 */
	public static String CLIENT_SECRET ="XXX";
	
}

至此,一切就都OK了
分享到:
评论

相关推荐

    ms-translator:使用 Microsoft Bing Translate API 翻译文本

    ms-translator 使用 Bing Translate API 翻译文本##操作说明使用 Microsoft 的必应翻译服务 HTTP API 翻译您的文本该代码基于 Microsoft 在文档中提供的代码,为 Composer 准备。 在两行中,您可以让翻译服务工作...

    bing-translate-api:用于Node.js的Bing转换器的简单免费API

    bing-translate-api 一个简单而免费的API,用于 forNode.js。 安装 npm install bing-translate-api 用法 从自动检测的语言到英语: const { translate } = require ( 'bing-translate-api' ) ; translate ( '你好...

    调用bing搜索api 本地网站实现搜索功能

    调用bing搜索api 本地网站实现搜索功能 并借用fiddler软件 解决跨域问题 伪装服务器 本地实现该搜索功能

    java调用bing search api搜索关键字.docx

    在本文中,我们将深入探讨如何使用Java调用Bing Search API来搜索关键字。Bing Search API是微软提供的一个服务,允许开发者集成Bing搜索引擎的功能,从而在程序中进行网络搜索。我们将通过一个简单的Java示例代码来...

    轻巧的Bing今日美图API

    8. **安全考虑**:当在生产环境中使用API时,确保所有的API调用都在安全的环境中进行,避免敏感信息泄露。 在【tnqzh123-laji-bing-pic-api-5fdae8d】这个压缩包中,可能包含了实现上述功能的PHP代码示例,包括发送...

    必应翻译API调用接口jar

    必应翻译API调用接口jar是一个Java开发工具包,它允许开发者通过编程方式与必应翻译服务进行交互,实现各种语言之间的文本翻译功能。在Java应用程序中集成这个接口,可以轻松地将翻译功能嵌入到项目中,为用户提供多...

    Bing Translate:必应翻译界面-开源

    2. API调用:界面会将用户输入的文本和选定的语言参数打包成API请求,通过Ajax或者Fetch API异步发送到Bing翻译服务器。 3. 数据解析与显示:服务器返回的翻译结果会被解析,然后在界面上展示给用户。这个过程中...

    BingAPI20开发包

    Bing API SDK 是微软提供的 Bing 服务的 API 开发包,包含搜索、广告发布、站长工具和地图交互功能。

    C#调用微软在线翻译API实现简单的翻译功能

    ### C#调用微软在线翻译API实现简单的翻译功能 #### 技术背景与应用场景 随着全球化的加速发展,跨语言沟通的需求日益增加。无论是个人用户还是企业级应用,都需要高效、准确的语言转换工具来打破语言障碍。在此...

    爬虫用于爬取Bing搜索引擎的n页标题,可以改进后作为一个小的搜索api

    标题中的“爬虫用于爬取Bing搜索引擎的n页标题,可以改进后作为一个小的搜索api”揭示了这个项目的核心内容。它是一个Python爬虫程序,设计用来抓取Bing搜索引擎的结果页面,提取每一页上的搜索结果标题。这样的爬虫...

    Bing Search API入门

    Bing Search API是微软提供的一个服务,允许开发者通过编程方式访问Bing搜索引擎的功能,包括Web搜索、图像搜索、新闻搜索等多个领域。本教程将引导你了解如何利用Bing Search API进行Web搜索,并提供Java和C#两种...

    Laravel开发-bing-translation

    例如,可以调用`translate()`方法,传入待翻译的文本和目标语言代码,它会返回翻译后的文本。 在实际开发中,这个功能可以应用于各种场景,比如多语言网站的内容动态翻译、用户输入的文本转换、甚至是在后台处理...

    翻译工具_API——bing

    免费翻译工具_API——使用bing引擎制作、方便好用,用法:双击运行后选择文件,等翻译完成后会给出提示,生成另一个文件。

    bing翻译APIDemo Soap接口

    2. **Bing翻译API**:学习如何获取API密钥,理解Bing翻译API的调用流程和参数设置,如源语言、目标语言、文本内容等。 3. **HTTP请求与响应**:了解如何使用HTTP POST方法发送SOAP请求,并接收和处理返回的翻译结果...

    bing-api-java:一小套Java类,用于查询Bing Search和Google CSE

    Bing和Java的Google CSE API库 一小组Java类,用于查询Bing Search和Google CSE(自定义搜索引擎)API。 该库在Maven Central上发布,您可以将其作为依赖项包含在pom.xml文件中,如下所示: &lt;groupId&gt;it.unipi....

    bing-translate:用于 node.js 的 Bing 翻译模块

    bing-translate 用于 node.js 的 Bing 翻译模块 安装 $ npm install bing - translate 应用程序接口 var bt = require ( './lib/bing-translate.js' ) . init ( { client_id : 'your_client_id' , client_...

    微软翻译api的java实现.rar

    之前软件做国际化,配置文件英文版需要翻译成中文版,总共快两万行了,但是翻译软件总会有字符限制,例如百度翻译5000个字符限制,bing翻译,最多的是google翻译,但是还是有字符限制,所以想到调用Translator API来...

    search_bing_api_批量下载指定标签图片_

    Bing搜索API是微软提供的一个服务,允许开发者通过编程方式访问Bing搜索引擎的功能,其中包括搜索图片。在这个场景中,用户希望根据自定义的标签关键词来下载图片。 描述中的“在指定网站下载设置标签的图片,网站...

Global site tag (gtag.js) - Google Analytics