Google Api 翻译没有环境变量的认证

Google Api translate authentication without environment variables

我试图在不使用环境变量的情况下使用 Google 翻译 API,但我似乎遗漏了一些东西。这是我正在使用的科特林代码:

import com.google.auth.oauth2.ServiceAccountCredentials
import com.google.cloud.translate.Translate
import com.google.cloud.translate.TranslateOptions
import java.io.FileInputStream

class StringsTranslator {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            TranslateOptions.newBuilder().credentials = ServiceAccountCredentials.fromStream(
                    FileInputStream("ktools/google-apis-credentials.json")
            )

            val translate = TranslateOptions.getDefaultInstance().service

            val text = "Hello world!"
            val translation = translate.translate(
                    text,
                    Translate.TranslateOption.sourceLanguage("en"),
                    Translate.TranslateOption.targetLanguage("es")
            )

            println("$text = ${translation.translatedText}")
        }
    }
}

我基本上采用了这个例子并对其进行了改编: https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/translate/cloud-client/src/main/java/com/example/translate/QuickstartSample.java

但是我遇到了这个异常:

线程 "main" 中出现异常 com.google.cloud.translate.TranslateException:请求缺少有效的 API 键。

文件是从 google 下载的(否则它会抛出一个 IOException),看起来 TranslateOptions.newBuilder() 没有问题,所以我想我中间做错了什么,或者遗漏了一些步骤,以便翻译服务进一步使用这些选项。

TIA!

好的,我在发布问题后一秒钟就弄明白了。我将把这段代码留在这里,希望它最终对其他人有用。

import com.google.auth.oauth2.ServiceAccountCredentials
import com.google.cloud.translate.Translate
import com.google.cloud.translate.TranslateOptions
import java.io.FileInputStream

class StringsTranslator {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val translate = TranslateOptions.newBuilder().setCredentials(ServiceAccountCredentials.fromStream(
                    FileInputStream("ktools/google-apis-credentials.json")
            )).build().service

            val text = "Hello world!"
            val translation = translate.translate(
                    text,
                    Translate.TranslateOption.sourceLanguage("en"),
                    Translate.TranslateOption.targetLanguage("es")
            )

            println("$text = ${translation.translatedText}")
        }
    }
}

第一个答案是 Java 版本,但我使用 Python google-tranlate-client。 下面是解决方案。

def g_translate(self, target_language):
    import os
    credential_path = os.path.dirname(__file__) + '/key.json'
    from google.oauth2 import service_account

    credentials = service_account.Credentials.from_service_account_file(credential_path)
    translate_client = translate.Client(credentials=credentials)

    translation = translate_client.translate(self.local, target_language=target_language)

    return translation['translatedText']

我不想使用环境变量,因为需要在所有服务器环境中进行配置,我想这种方式在生产环境中更方便

Github Question