用AHK"抄"了个翻译脚本,结果发现完全不好共享

很早以前用的翻译软件是一些只能查词的,像Goldendict这种

然后到浏览器时代,开始用沙拉查词,可可翻译等
这时候已经很不错了,除了浏览器不能关以外没啥缺点
这期间也有一些客户端的翻译工具,但大部分都自带了一个浏览器
还不如直接用浏览器调用扩展呢

然后前段时间看见pot发布,调用的是系统自带的webview
软件本体很小,但在我的环境的里毛病很多
rime输入法直接卡死界面
点击输入框半天没反应
划词翻译失去焦点后自动关闭,导致多次调用会频繁的关闭窗口创建窗口…

然后开始有了自己弄的想法
一开始并没有想着抄pot,自己看看api然后调用就是的嘛
结果除了百度,
腾讯阿里文档中一开始就是引入自家包
有个屁的AHK包…没办法开始用C#弄
直接按照官方的方法,引入包后打包后直接几十MB,和自带个浏览器也差不多了
然后自己拖包源码,只打包进去必要的部分,打包后降到了1MB
为了与AHK交互
一开始弄的同步方法,直接卡死界面不用想
异步方法就麻烦多了,要弄回调,要传入ahk函数,要回调时解析参数

开始尝试脱离C#,这可就折腾惨了,
上方所说C#最后还是用的官方包,但在AHK中不可能引入了
因为AHK很难调试又回到C#中弄通用方法,百度原来就是通用的
网上有腾讯的C#示例,改几下就能用
阿里最麻烦,没有C#示例,只找到个JavaScript示例,还得转成C#
然后JavaScript示例中也有问题,改过来很多地方不行,只能去官方包里找方法解决

最后才到了C#到AHK的部分,主要是加密算法,好在AHK有这种库
百度还是很容易,阿里难一点,但也很快解决了
腾讯的很麻烦,怎么弄都弄不好.
这时候想到去pot中抄了,腾讯的例子从GET改成pot中的POST又折腾了一番
然后AHK加密算法库上有问题了,查了半天才知道怎么样解决

上文中提到的都是百度,阿里,腾讯这种需要API的.
不需要API的完全没提,这是个敏感东西
它们是官方不允许的,除了谷歌外其余的都是随时会失效的东西
而且最有可能是越多人用越快失效

这种时候已经完全没分享的必要了
需要API的备用选择很多
抄的几个不需要API随时会失效
加上AHK的界面和网络是拉中拉
自娱自乐得了

动画

1 个赞

C#好学吗?感觉既不是编译语言也不是脚本语言,定位模糊。
AutoHotkey 的 gui 胜在简单,难的是难以写出漂亮界面。
net 这块,你可以试试包装个 libcurl,非常好用,异步分块下载、发送邮件什么的实现起来都很简单。
三大户的翻译水准也就泛泛,没必要用api,我用的是sougou网页找的接口用了好几年一直有效。

C#入门挺容易的吧…
我不是程序员, 照葫芦画瓢也弄出个图片浏览器
最容易的是C#即使不太明白代码具体用途
但看方法名和变量名就猜出个大概
专精它的程序员挺遵守它的规则的
各种驼峰什么的,不像C++那种e,f之类到处飞…
加上它编译非常非常容易,github上的源码拖下来90%直接就能编译成功
像V2rayn直接拖下来就能在其中添加代码编译成功…太棒了

缺点嘛以前发过一个帖子
较新版本需要运行时,如果用户没装就得打包个运行时,感觉就像electron变得很大
要么用net framework版本(AHK是与这个交互)
加上运行时要初始化,启动有点慢

我C#写的就是狗屎,还带着AHK的习惯
全局变量到处都是,各种没必要的静态类
恨不得所有功能在一个文件中写完
什么接口,事件,委托都很难习惯去用.
但也不后悔入门.习惯也在慢慢改(c#这样设计有原因的)
甚至慢慢AHK也开始习惯封装成class了.的确是便于管理的多.

至于net这版嘛,就post和get
一开始就是用C#实现的,其实也就交互麻烦一点

AHK与c#交互麻烦的一点就是得考虑CLR加载失败
所以每个方法都得在AHK弄一个替代的函数…(一般是效率低很多)
慢慢的如果不是必要也不大想在AHK中调用C#了.

翻译水准嘛,无所谓,反正免费用量很难用完,对比一下也是好的
当然考虑显示面积,我平时也就用两API,两免费的.

Goldendict 也是用的 webview。

Goldendict 里直接调用程序,只要指定软件返回值是文本还是 html 就可以实现你这样的效果。

我这是用的 Python 实现的。如果只是取翻译结果,只用标准库就行。Github 上有很多类似的,各家翻译引擎的都有。

我觉得你可能弄混 API 和 SDK 了。SDK 是开发库,可以提高效率,自然是推荐优先使用的。

就通过文本翻译这个语境,谷歌、百度、阿里、腾讯提供的 API 都是 http 请求,也都是公开的。你只要构建一个 http 请求就行。构造好 post 用 curl 请求都可以。例如 签名方法 v3 里给的示例就是 curl 的。

搜了下腾讯翻译的 api 示例1 文本翻译调用示例 ,他这个里面给了示例,构建一个这样的 post 请求就可以了。post 请求的详细的要求这里也写了,只是"签名方法 v3"要自己实现一下。

挺好奇,不通过 http 请求怎样访问他们的服务器。

不用官方指定的 api,而是自己抓取的话,使用时间是不确定。但越多人用就失效约快则不至于,这几家的翻译都没有限制登录后使用的,通过网页使用也没收费,之前也有提供免费的额度,都有几十万字符,个人使用一般是够用的。

其实我一开始想说的是金山词霸
但忘了这名字,然后想说有道翻译.但这个是真没下过
于是提Goldendict.类似的还有MDICT之类的

在我的印象中它们都是离线时代的产品
它们自带了一个或多个辞典
这也是我印象中它们只能查单词的原因.

甚至那时候还有离线维基这种东西…
我kindle中就放进去了一个.

其实我也不算用过,只能算下过…
查单词和翻译是完全两回事
下载也只是为了应急,很少使用

进入到浏览器时代后我才开始频繁使用翻译
它们最大进化就是能够翻译整句甚至整段话了.
对我来说就是跨时代的
阅读说明及文档,在国外社区上与人讨论.
完全扩大了活动范围

歪个楼
想到现在的国产 app
能把6G、8G运存的手机卡成低端机
当年4G内存的电脑,Windows 7+Chrome,标签页开到挤成一堆圆点都没问题

1 个赞

API应该是我用语错误吧,应该是密钥之类的东西
以前使用谷歌翻译也没有想过API这东西

你说的SDK就是我说的包了

你说的构造http请求这些对程序员应该是很容易理解的东西
作为普通用户来说还是有点困难了.我几乎得一步步却确定它们的意义
简单一点的timestamp,AHK中根本没这个概念
稍复杂的URLEncode我都要确定我找到函数是否结果与示例中的结果一致
更复杂的就是加密算法了,它很可能会根据上面说的内容生成
甚至可能每个参数的顺序都有要求,一步错,步步错
所以我才去找有没有示例才能接着进行转换…
我得确定生成的结果是什么样才能接着进行
差不多是一步步断点比对才能确定成功转换
所以腾讯从GET改成POST几乎完全重做(好像签名方法变了)

至于说文档,它很可能是通用的,比方说你说的请求
X-TC-Version就变成为2018-03-21
X-TC-Action就变成了TextTranslate
当然它们很可能在文档某个地方提到了,但我也不确定是应该要改哪些
最终还是找个具体的例子才能进行后续…

阿里我甚至找不到POST的示例.它文档中到是提到了可以POST
但没示例就直接进行不下去了
最后用的GET方法

跟你一样,都不是专业的,只不过你学的 AHK 和 C#,我学的 Python。

你不会 HTTP 请求,我不会 GUI。 :rofl:

C# 里应该有吧。timestamp 时间戳是一个计算机基础层级的东西,属于是见过就知道了,搜一下有 Wiki。

加密基本都调标准库。用之前最好了解下相关的概念。

写程序不都这样吗。你应该了解下怎么写测试。

我搜了下 C# 可以生成 dll,毕竟都是微软的。这个你应该用 C# 写,然后生成 dll,让 AHK 调用。你好像又重新实现了一遍。脚本语言通常也是用来做胶水的。

你没有理解 GET 和 POST。这两种请求,可以说只是调用函数时传参方式的区别,用到的东西没有变。你了解下 http 请求是怎么传参和添加请求头,很容易就可以转换了。

这个就没办法了,新手只能看文档质量了,多搜索下。其次就是看别人的实现。也许可以试试问客服,请求技术支持 :melting_face:

timestamp是很容易理解的东西啦.所以我才把它称为简单
URLEncode这东西,不瞒你说,百里,阿里,腾讯,示例中调用的都不一样
有HttpUtility.UrlEncode,有Uri.EscapeUriString,还有一个自实现的.
JavaScript中的encodeURIComponent够标准了吧,也出错了…
我尝试统一,改了一个之后出现错误就没尝试在这折腾折腾了…
毁灭吧,各用各的吧

加密这东西其实想明白就不难,
这里面的难点是示例中有部分是直接把二进制数制当作密钥的
而是AHK中没有 bytes 这种类型.
弄了半天才搞定这东西…

C#生成的是dll,交互很麻烦
甚至有个地方直接在C#中能正常运行,
但调用DLL直接在某一步就卡住了…
dll也没console.log这种东西,我都是想了个办法直接在文件中写入东西才确定是卡住了…

就腾讯而言GET和POST好像加密的东西不一样
GET上面说的X-TC-Version和X-TC-Action等都会添加进被加密字符串
POST中一些参数变成了请求头,加密字符串中添加了一些新东西.
不详细了解根本就不敢乱改…
为了测试把timestamp和随机数这种东西全部改成一样的
一步步对比才勉强改完…

所以第一步都是找个能正常运行的示例.

随手一搜大概看了下,不能对对 Get 请求的网址和参数同时进行处理。这个也说了 "在C#中推荐的做法是用Uri.EscapeUriString对URI的网址部分编码,用Uri.EscapeDataString对URI中传递的参数进行编码。"不想处理这个就用 post。

不知道你是怎么封装的,这个只是一个请求,最简单就是 AHK 调用 DllCall 时只传入要翻译的字符串和 token。

一部到位,直接找个 C# 的程序改,翻译程序还是有不少的。Python 的话,简单需求直接用别人的库就好。这个就绕回 SDK 了。:rofl:

dll最开始没设计
不同的翻译方法分别设置回调函数分别调用的
当时没想那么多,有的要key,有的还要proxy,还有一些要解析json
现在想想只要有一个统一的方法就行了.
陋习了,先实现功能,再统一逻辑,再封装,多花了很多功能.

交互和编译调用 dll,你应该是没有找对方法。当然了,C#和 AutoHotkey 单独实现这个翻译工具应该都没问题。
你用的 V2?推荐用 H 版。内置 JSON,最后的更新,对象支持带引号的键创建 {“a”: 1 },这几乎解决了 V1 用户转 V2 的最大痛点

什么没找对方法…
dll与ahk交互没出问题啊
最开始dll中是实现几种稍复杂的翻译方法
比较容易的翻译方法一开始是在ahk上实现的
后面想统一下逻辑,于是将其全部转至ahk上了
全部切换至dll调用也不用大改

我用的H版作者的json库,非常非常快