5

我正在尝试制作一个使用Google Cloud Translation API的 Chrome 扩展程序。我在 Google 翻译和开发 Chrome 扩展的文档中的许多不同页面上遵循了一堆说明,但我仍然无法弄清楚如何在浏览器中实际使用 API。

我得到的最远距离是按照快速入门指南的一部分创建服务帐户,获取服务帐户密钥文件(下载为 .json 文件),安装和初始化 Google SDK,将GOOGLE_APPLICATION_CREDENTIALS环境变量设置为路径服务帐户 JSON 密钥文件,然后发出curl请求,gcloud auth application-default print-access-token以获取要作为请求标头的一部分输入的访问令牌:“授权:承载(此处的令牌)”。以这种方式成功检索到翻译。

但是在扩展的环境中,你不能运行这样的命令gcloud,这样就不起作用了。我能够使用该gcloud命令手动检索访问令牌,然后将其粘贴到我的 javascript 代码中作为请求标头的一部分(例如xmlHttpRequest.setRequestHeader('Authorization', 'Bearer ya29.c.Elr6BRuTfOtherRandomLetters');)。但是该访问令牌会在 60 分钟后过期,因此无法持续发挥作用。

我也尝试使用identity.getAuthToken方法(在manifest.json按照文档所说的方式更新内容之后),但这不起作用。使用我的服务帐户客户端 ID 作为client_id下面oauth2manifest.json导致来自identity.getAuthToken. 另一方面,从 Google 控制台生成 OAuth2 客户端 ID,并使用myoauth2clientid.apps.googleusercontent.comas the client_idunderoauth2["https://www.googleapis.com/auth/cloud-translation", "https://www.googleapis.com/auth/cloud-platform"]as the scopesunder会oauth2导致来自identity.getAuthToken.

从 Google 控制台页面生成 API 密钥,并将其直接用作key我的翻译查询的参数,甚至都不起作用:我收到“请求缺少有效的 API 密钥”。错误。

我在这里真的很茫然。任何帮助都是极好的。

4

2 回答 2

4

我(第一次发帖者)也经历了与您相同的步骤,但在@magicnumber 的回答的帮助下,我想出了一个解决方案,使用 APIkey 而不是服务帐户在我的 Chrome 扩展程序中翻译文本(从任何语言到英语)密钥文件。

首先创建一个翻译函数(我在这里使用了 Async -> Await 模式):

 async function translate(strSourceText,strApiKey)
  {
    var url = `https://translation.googleapis.com/language/translate/v2?key=${strApiKey}`
    let response = await fetch(url, {
      method: 'POST',
      headers : { 
        'Content-Type': 'application/json',
       },
       body: JSON.stringify({
         target: "en",
         format: "text",
         q: strSourceText
       }),
    }); 
    let data = await response.json()
    return data;
  }

然后调用 async 函数,该函数将返回一个 Promise 例如:

query="כלב" //Hebrew word for dog 

translate(query,  "YOURVALIDAPIKEYGOESHERE")
  .then(response => console.log(response.data))
  .catch(reason => console.log(reason.message));

来自 Google Translation API 的响应应如下所示:

{
  "data": {
    "translations": [
      {
        "translatedText": "Dog",
        "detectedSourceLanguage": "iw"
      }
    ]
  }
}

最后,为了避免违反内容安全策略,在我的例子中,我必须将翻译 API 域添加到我扩展的 manifest.json 文件中的权限键中:

"permissions": ["https://translation.googleapis.com/language/translate/v2/*"],
于 2020-01-24T00:46:49.223 回答
1

我经历了与您相同的步骤,也不能依赖 gcloud 进行身份验证。

让我过去“请求缺少有效的 API 密钥”错误的是使用此处描述的查询语法https://codelabs.developers.google.com/codelabs/cloud-translation-intro/index.html#5

就我而言,我使用了:

curl -s -X POST -H "Content-Type: application/json" \
    --data "{
  'q': 'The Great Pyramid of Giza (also known as the Pyramid of Khufu or the
        Pyramid of Cheops) is the oldest and largest of the three pyramids in
        the Giza pyramid complex.',
  'source': 'en',
  'target': 'es',
  'format': 'text'
}" "https://translation.googleapis.com/language/translate/v2?key=YOURVALIDAPIKEYHERE"
于 2018-10-18T13:11:05.297 回答