Telegram 如何绕过谷歌翻译的 API
微wx笑 2022-04-20【文摘】 5 0关键字: Telegram 谷歌翻译
外部软件调用谷歌翻译需要付费,但是 Telegram 没有付费就在使用它。Telegram 是开源的,有人就去看了代码,它是怎么做的,很有意思。
原文:https://danpetrov.xyz/programming/2021/12/30/telegram-google-translate.html
Telegram Messenger 的最新更新
你可能听说过 Telegram本周发布了可以说是他们今年最大的更新。虽然消息平台的后端仍然是专有的,但移动和桌面客户端的源代码是开源的。
最大的新功能是消息翻译,它允许在应用程序内翻译消息文本。有趣的是它是如何在官方 Android 应用程序中实现的。
Telegram Android 应用程序如何绕过官方的 Google Cloud Translate API
未记录的 Google 翻译 API 端点
如果您查看官方Cloud Translate REST API 文档,您会看到官方 API 使用版本化的 API 路径(例如/language/translate/v2
)和人类可读的查询参数,其中重要的是包括 API 密钥key
。但是,如果我们检查Telegram 的实现,我们会注意到该fetchTranslation
方法中的一些内容:
他们使用另一条路径,并且似乎还故意用多个字符串连接分割请求路径(可能是为了模糊/避免在 Play 商店审查过程中检测到?):
uri = "https://translate.goo";uri += "gleapis.com/transl";uri += "ate_a";uri += "/singl";uri += "e?client=gtx&sl=" + Uri.encode(fromLanguage) + "&tl=" + Uri.encode(toLanguage) + "&dt=t" + "&ie=UTF-8&oe=UTF-8&otf=1&ssel=0&tsel=0&kc=7&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&q=";uri += Uri.encode(text.toString());
我们可以从查询字符串中推断出:
client
是某种客户端调用者说明符(例如 webapp / 本机应用程序?)sl
并且tl
是源语言和目标语言ie
并且oe
是文本数据的输入和输出编码ssel
和tsel
文本选择有关吗?q
是查询文本(实际翻译的 URI 编码文本)
更新:这个解决方法在这篇博文中得到了很好的解释,所以一定要检查一下。
用户代理轮换
我注意到的另一件事是 Telegram 保留了一个包含各种用户代理的字符串数组,并带有表示百分比的注释(目前我不清楚它们代表什么):
private String[] userAgents = new String[] {
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", // 13.5%
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", // 6.6%
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0", // 6.4%
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0", // 6.2%
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36", // 5.2%
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" // 4.8%};
在同样的方法中,他们似乎从这个数组中随机拉出一个用户代理并将其传递给 Google 的请求:
connection.setRequestProperty("User-Agent", userAgents[(int) Math.round(Math.random() * (userAgents.length - 1))]);
这似乎是用户代理轮换的经典示例,网络爬虫经常使用这种技术来避免被网络服务速率限制/列入黑名单。
结论
似乎为了解决在 Telegram 上在 Android 上翻译文本的问题,并且不支付巨额的 Google Cloud 费用和泄露 API 密钥的风险,Telegram 找到了一些直接免费查询 Cloud Translate API 的晦涩方法。
我的建议是简单地使用他们预先构建的官方 Java SDK,并使用RPC over HTTP来节省带宽(考虑到 Telegram超过 5 亿的活跃用户,这将是非常可观的。对我来说,这个功能似乎在鉴于上面链接的新代码的状态,今年年底。
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/abstract/2022-04-20/1158.html
上一篇:纸牌屋