由于谷歌翻译官方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. 基于Haproxy+Keepalived构建高可用负载均衡集群

    实验环境: 主机名 IP地址 VIP 192.168.200.254 Haproxy-1 192.168.200.101 Haproxy-2 192.168.200.102 Nginx1 192.16 ...

  2. Java 工具类—日期获得,随机数,系统命令,数据类型转换

    package tems; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; ...

  3. DbVisualizer:Oracle触发器,解决ORA-04098: 触发器 'USER.DECTUSERTEST_TRI' 无效且未通过重新验证

    我没有用orcal的管理工具,而是用的DbVisualizer 9.5.2,管理数据库. 场景:需要在oracle里面实在自增字段,在网上一搜一堆文档,然后自己就找了一段自己写如下: drop tab ...

  4. Vmware Vsphere WebService之vijava 开发(二)一性能信息的采集(实时监控)

    最近一直没有更新这部分的内容,会利用五一时间完成vcenter这一个系列. 这里先给大家一本关于vijava开发的书,比较实用. 地址:http://pan.baidu.com/s/1gfkl9mj. ...

  5. 消息队列NetMQ 原理分析3-命令产生/处理和回收线程

    消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...

  6. python之基础中的基础(三)

    1.类,类就像是负责特定项目的主管,交给主管干这件事情,主管可以让手下的人分别去完成自己该干的活,最后综合起来把结果交给主管传递出去,即完成任务. class Dog(): ""& ...

  7. percona-xtrabackup安装

    二进制包安装(推荐安装方式,不用安装依赖包,非常方便): 1.下载安二进制包:      wget https://www.percona.com/downloads/XtraBackup/Perco ...

  8. [刷题]算法竞赛入门经典(第2版) 4-7/UVa509 - RAID!

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa509 - RAID! #include<iostream> ...

  9. 深度解析MySQL启动时报“The server quit without updating PID file”错误的原因

    很多童鞋在启动mysql的时候,碰到过这个错误, 首先,澄清一点,出现这个错误的前提是:通过服务脚本来启动mysql.通过mysqld_safe或mysqld启动mysql实例并不会报这个错误. 那么 ...

  10. [开源] 基于ABP,Hangfire的开源Sharepoint文件同步程序----SuperRocket.SPSync

    (一)项目背景 Sharepoint是微软的一个产品,很多公司都在使用它,也有很多公司以前使用它,现在可能需要移植到别的平台,也可能只是移植其中的文件存储,比如说移植到微软云,或者亚马逊云存储.Sup ...