文摘您现在的位置是:首页 > 博客日志 > 文摘

Telegram 如何绕过谷歌翻译的 API

<a href='mailto:'>微wx笑</a>的头像微wx笑 2022-04-20文摘 5 0关键字: Telegram  谷歌翻译  

外部软件调用谷歌翻译需要付费,但是 Telegram 没有付费就在使用它。Telegram 是开源的,有人就去看了代码,它是怎么做的,很有意思。

原文:https://danpetrov.xyz/programming/2021/12/30/telegram-google-translate.htmlhFZ无知

Telegram Messenger 的最新更新

你可能听说过 Telegram本周发布了可以说是他们今年最大的更新。虽然消息平台的后端仍然是专有的,但移动和桌面客户端的源代码是开源的。hFZ无知

最大的新功能是消息翻译,它允许在应用程序内翻译消息文本。有趣的是它是如何在官方 Android 应用程序中实现的。hFZ无知

Telegram Android 应用程序如何绕过官方的 Google Cloud Translate API

未记录的 Google 翻译 API 端点

如果您查看官方Cloud Translate REST API 文档,您会看到官方 API 使用版本化的 API 路径(例如/language/translate/v2)和人类可读的查询参数,其中重要的是包括 API 密钥key但是,如果我们检查Telegram 的实现,我们会注意到该fetchTranslation方法中的一些内容:hFZ无知

他们使用另一条路径,并且似乎还故意用多个字符串连接分割请求路径(可能是为了模糊/避免在 Play 商店审查过程中检测到?):hFZ无知

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());

我们可以从查询字符串中推断出:hFZ无知

  • client是某种客户端调用者说明符(例如 webapp / 本机应用程序?)hFZ无知

  • sl并且tl是源语言和目标语言hFZ无知

  • ie并且oe是文本数据的输入和输出编码hFZ无知

  • sseltsel文本选择有关吗?hFZ无知

  • q是查询文本(实际翻译的 URI 编码文本)hFZ无知

更新:这个解决方法在这篇博文中得到了很好的解释,所以一定要检查一下。hFZ无知

用户代理轮换

我注意到的另一件事是 Telegram 保留了一个包含各种用户代理的字符串数组,并带有表示百分比的注释(目前我不清楚它们代表什么):hFZ无知

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 的请求:hFZ无知

connection.setRequestProperty("User-Agent", userAgents[(int) Math.round(Math.random() * (userAgents.length - 1))]);

这似乎是用户代理轮换的经典示例,网络爬虫经常使用这种技术来避免被网络服务速率限制/列入黑名单。hFZ无知

结论

似乎为了解决在 Telegram 上在 Android 上翻译文本的问题,并且不支付巨额的 Google Cloud 费用和泄露 API 密钥的风险,Telegram 找到了一些直接免费查询 Cloud Translate API 的晦涩方法。hFZ无知

我的建议是简单地使用他们预先构建的官方 Java SDK,并使用RPC over HTTP来节省带宽(考虑到 Telegram超过 5 亿的活跃用户,这将是非常可观的。对我来说,这个功能似乎在鉴于上面链接的新代码的状态,今年年底。hFZ无知


hFZ无知

本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/abstract/2022-04-20/1158.html

很赞哦! () 有话说 ()

相关文章