由于谷歌翻译官方API是付费版本,本着免费和开源的精神,分享一下用C#实现谷歌翻译API的代码。这个代码非常简单,主要分两块:通过WebRequest的方式请求内容;获取Get方式的请求参数(难点在于tk的获取)。注意该项目需要添加以下几个引用:

System.Web

Newtonsoft.Json

MSScriptControl(com组件中的Microsoft Script Control 1.0)

一、WebRequest代码

var webRequest = WebRequest.Create(url) as HttpWebRequest;

webRequest.Method = "GET";

webRequest.CookieContainer = cookie;

webRequest.Referer = referer;

webRequest.Timeout = 20000;

webRequest.Headers.Add("X-Requested-With:XMLHttpRequest");

webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";

webRequest.UserAgent = useragent;

  using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
{
   using (var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
   {     html = reader.ReadToEnd();
    reader.Close();
    webResponse.Close();
   }
}

  

二、谷歌翻译接口的实现

  1、抓包查看翻译网络请求,这里是用谷歌浏览器查看的网络请求,如下图:

  可以看到,请求方式是“Get”方式,后面跟的请求参数很多,如下图:

  其中,最重要的参数有:sl--来源语言,一般设置为auto即自动检测,tl--目标语言,你想翻译成的语言,tk--ticket即使发车车票,谷歌就靠这个来防止我们免费调用的,这是本API最难的地方。

  2、tk的获取

  在打开https://translate.google.com/页面是,获取到的HTML代码中有如下一个TKK的值:

  直接在获取的源代码中用正则匹配出这个值:Regex re = new Regex(@"(?<=TKK=')(.*?)(?=')"),可以得到一个字符串:428502.368022592

  从监控的网络中可以发现其中一个JS调用了这个TKK值,这个JS加了密进行混淆的,要破解这个JS需要扎实的基本功,以及足够的耐心,我也是网上找的别人破解的JS代码,亲测可用,需将此代码保存在gettk.js文档中,方便调用:

var b = function (a, b) {
for (var d = 0; d < b.length - 2; d += 3) {
var c = b.charAt(d + 2),
c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
}
return a
} var tk = function (a,TKK) {
for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
var c = a.charCodeAt(f);
128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
}
a = h;
for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
a = b(a, "+-3^+b+-f");
a ^= Number(e[1]) || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1E6;
return a.toString() + "." + (a ^ h)
}

  

  要得到tk只需要,运行tk这个函数,它有两个输入值:a为翻译文本内容,TKK是上文正则匹配得到的JS字符串执行的结果值。为方便在C#中执行JS,封装了一个能执行JS的函数,如下:

        /// <summary>
/// 执行JS
/// </summary>
/// <param name="sExpression">参数体</param>
/// <param name="sCode">JavaScript代码的字符串</param>
/// <returns></returns>
private string ExecuteScript(string sExpression, string sCode)
{
MSScriptControl.ScriptControl scriptControl = new MSScriptControl.ScriptControl();
scriptControl.UseSafeSubset = true;
scriptControl.Language = "JScript";
scriptControl.AddCode(sCode);
try
{
string str = scriptControl.Eval(sExpression).ToString();
return str;
}
catch (Exception ex)
{
string str = ex.Message;
}
return null;
}

  

  3、实现翻译的完整代码

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using MSScriptControl;
using System.Web; namespace GoogleTranslate
{
public class Translate
{
/// <summary>
/// 谷歌翻译
/// </summary>
/// <param name="text">待翻译文本</param>
/// <param name="fromLanguage">自动检测:auto</param>
/// <param name="toLanguage">中文:zh-CN,英文:en</param>
/// <returns>翻译后文本</returns>
public string GoogleTranslate(string text, string fromLanguage, string toLanguage)
{
CookieContainer cc = new CookieContainer(); string GoogleTransBaseUrl = "https://translate.google.com/"; var BaseResultHtml = GetResultHtml(GoogleTransBaseUrl, cc, ""); Regex re = new Regex(@"(?<=TKK=')(.*?)(?=')"); var TKK = re.Match(BaseResultHtml).ToString();//在返回的HTML中正则匹配TKK的值 var GetTkkJS = File.ReadAllText("./gettk.js"); var tk = ExecuteScript("tk(\"" + text + "\",\"" + TKK + "\")", GetTkkJS); string googleTransUrl = "https://translate.google.com/translate_a/single?client=t&sl=" + fromLanguage + "&tl=" + toLanguage + "&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=1&ssel=0&tsel=0&kc=1&tk=" + tk + "&q=" + HttpUtility.UrlEncode(text); var ResultHtml = GetResultHtml(googleTransUrl, cc, "https://translate.google.com/"); dynamic TempResult = Newtonsoft.Json.JsonConvert.DeserializeObject(ResultHtml); string ResultText = Convert.ToString(TempResult[0][0][0]); return ResultText;
} public string GetResultHtml(string url, CookieContainer cookie, string referer)
{
var html = ""; var webRequest = WebRequest.Create(url) as HttpWebRequest; webRequest.Method = "GET"; webRequest.CookieContainer = cookie; webRequest.Referer = referer; webRequest.Timeout = 20000; webRequest.Headers.Add("X-Requested-With:XMLHttpRequest"); webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; webRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"; using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
{
using (var reader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{ html = reader.ReadToEnd();
reader.Close();
webResponse.Close();
}
}
return html;
} /// <summary>
/// 执行JS
/// </summary>
/// <param name="sExpression">参数体</param>
/// <param name="sCode">JavaScript代码的字符串</param>
/// <returns></returns>
private string ExecuteScript(string sExpression, string sCode)
{
MSScriptControl.ScriptControl scriptControl = new MSScriptControl.ScriptControl();
scriptControl.UseSafeSubset = true;
scriptControl.Language = "JScript";
scriptControl.AddCode(sCode);
try
{
string str = scriptControl.Eval(sExpression).ToString();
return str;
}
catch (Exception ex)
{
string str = ex.Message;
}
return null;
}
}
}

  

C#实现谷歌翻译API的更多相关文章

  1. Asp.Net Core 实现谷歌翻译ApI 免费版

    由于谷歌翻译官方API是付费版本,本着免费和开源的精神.分享一下用 Net Core 实现谷歌翻译API的代码. 项目引用的Nuget 包: ChakraCore.NET Newtonsoft.Jso ...

  2. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  3. Net Core 实现谷歌翻译ApI 免费版

    原文:Net Core 实现谷歌翻译ApI 免费版 由于谷歌翻译官方API是付费版本,本着免费和开源的精神.分享一下用 Net Core 实现谷歌翻译API的代码. 项目引用的Nuget 包: Cha ...

  4. Java 破解谷歌翻译api,可以实现程序自动化翻译文章

    1  原理:查看谷歌翻译网站,输入需要翻译的文字,选择语言得到翻译后的文字,发送异步请求参数返回结果.java使用httpclient发送请求,实现使用代码翻译文章的功能. 2  下载代码后,测试入口 ...

  5. C#调用谷歌翻译API

    原资料为网上找到的原稿为:http://www.cnblogs.com/marso/p/google_translate_api.html(此处只做个人笔记参考) 主要分两块:通过WebRequest ...

  6. 利用谷歌网站的翻译网站,实现谷歌翻译api

    代码是之前网上找到的,地址为:http://www.crifan.com/teach_you_how_to_find_free_google_translate_api/ 原先的代码有不足,如果翻译里 ...

  7. 谷歌翻译API

    http://translate.google.cn/translate_a/t?client=t&text=你好&hl=zh-CN&sl=zh-CN&tl=en&am ...

  8. 免费利用网页版谷歌翻译实现任意语言转换php版

    本文源发布地址: http://ourgarden.cn/2013/07/20/%E5%85%8D%E8%B4%B9%E5%88%A9%E7%94%A8%E7%BD%91%E9%A1%B5%E7%89 ...

  9. Python3调谷歌翻译

    公司最近有翻译的需求(本人适用的是在第三方服务器上使用,不在本地也不在谷歌控制台),发现Google的Translate API只能FQ调,但是国内也有翻译需求,经多方查找汇集众家之长,找到一个感觉最 ...

随机推荐

  1. 利用 Forcing InnoDB Recovery 特性解决 MySQL 重启失败的问题

    小明同学在本机上安装了 MySQL 5.7.17 配合项目进行开发,并且已经有了一部分重要数据.某天小明在开发的时候,需要出去一趟就直接把电脑关掉了,没有让 MySQL 正常关闭,重启 MySQL 的 ...

  2. java复习(5)---接口、继承、多态

    Java作为完全面向对象语言,接口.继承和多态是三个非常重要的概念. 1.继承. (1)关键字: extends (2)子类用super()调用父类构造函数,用super().方法 调用父类的成员方法 ...

  3. GPIO的配置过程

    今天看到一篇很好的博文,,看这里:http://www.cnblogs.com/crazyxu/archive/2011/10/14/2212337.html 下面总结一下,加深一下理解. 要使用GP ...

  4. JS的内置对象以及JQuery中的部分内容

     [js中的数组]              1  数组的概念:可以再内存中连续存储的多个有序元素的结构                元素的顺序:称为下标,通过下标查找对应元素.           ...

  5. 【国家集训队2012】tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:  + u v c:将u到v的路径上的点的权值都加上自然数c:  - u1 v1 u2 ...

  6. webUI自动化测试框架---”pyswat“介绍

    webUI自动化测试框架---"pyswat"介绍 大家好我是lamecho 辣么丑,今天给大家介绍一款web自动化测试框架pyswat.  "pyswat"是 ...

  7. js图片轮播

    html部分 <a href="" id="pta"><div id="picture" class="pt&q ...

  8. Oracle GoldenGate中HANDLECOLLISIONS参数使用详解

    Oracle GoldenGate中HANDLECOLLISIONS参数使用详解   HANDLECOLLISIONS 是一个 replicat 进程参数,主要在 initial load 中使用.在 ...

  9. Python库的安装方法

    Python库的安装方法 Python的解释器CPython是开源的,我们可以下载查看其源代码,同时,Python语言的各种库也都是开源的.利用Python语言编程,可用的库有很多,在Python官方 ...

  10. DCalendar增加月份选择功能--简单jQuery日期选择器插件改动

    做时间插件的时候,很多都会遇到要做选择月份的插件,但是DCalendar提供的api只支持日期选择,最近遇到这个问题,所以调整了一下源码,话不多说,先看效果吧 点击日期插件,出现上图,再点击月份就直接 ...