谷歌云“translate.NewClient:拨号:谷歌:找不到默认凭据”

时间:2021-07-09 13:34:44

标签: go google-cloud-platform google-api google-translate

我正在尝试在 Windows(我自己的计算机)上使用 Google Translate API。我的默认凭据有问题。 错误:**translate.NewClient:拨号:google:找不到默认凭据。

我在谷歌云中有足够的余额。

我启动了翻译 API。 (API 已启用)

我添加了 $env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

package main

import (
    "context"
    "fmt"
    "log"

    "cloud.google.com/go/storage"
    "cloud.google.com/go/translate"
    "golang.org/x/text/language"
    "google.golang.org/api/iterator"
    "google.golang.org/api/option"
)

func translateTextWithModel(targetLanguage, text, model string) (string, error) {
    // targetLanguage := "ja"
    // text := "The Go Gopher is cute"
    // model := "nmt"

    ctx := context.Background()

    lang, err := language.Parse(targetLanguage)
    if err != nil {
        return "", fmt.Errorf("language.Parse: %v", err)
    }

    client, err := translate.NewClient(ctx)
    if err != nil {
        return "", fmt.Errorf("translate.NewClient: %v", err)
    }
    defer client.Close()

    resp, err := client.Translate(ctx, []string{text}, lang, &translate.Options{
        Model: model, // Either "nmt" or "base".
    })
    if err != nil {
        return "", fmt.Errorf("Translate: %v", err)
    }
    if len(resp) == 0 {
        return "", nil
    }
    return resp[0].Text, nil
}

func main() {
    Json_path := "C:/Users/Mels/Documents/GoogleTools/cred-9dfos6bb49f.json"
    ProjectID := "cred"
    fmt.Println("RUNNING...")
    explicit(Json_path, ProjectID)
    fmt.Println(translateTextWithModel("ja", "Hello World", "nmt"))
}

// explicit reads credentials from the specified path.
func explicit(jsonPath, projectID string) {
    ctx := context.Background()
    client, err := storage.NewClient(ctx, option.WithCredentialsFile(jsonPath))
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()
    fmt.Println("Buckets:")
    it := client.Buckets(ctx, projectID)
    for {
        battrs, err := it.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(battrs.Name)
    }
}

JSON 文件

{
  "type": "service_account",
  "project_id": "xxxxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----XXXXXXXX-----END PRIVATE KEY-----\n",
  "client_email": "xxxxxx@xxxxxx.iam.gserviceaccount.com",
  "client_id": "11111111111",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "api_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxx%xxxxxxx.iam.gserviceaccount.com"
}

2 个答案:

答案 0 :(得分:1)

如果库找不到默认凭据,那么您可以尝试使用凭据路径创建客户端。

即使这可能不是您的最佳选择(尽管我更喜欢它而不是 env 变量),但它会帮助您更好地诊断问题。

为了使用凭据文件的路径创建客户端,您需要导入 google.golang.org/api/option,并使用 WithCredentialsFile option 创建客户端。请注意文档中的 the client 可以使用其他选项创建:

func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error)

关于如何使用选项创建客户端的更完整的示例如下(根据需要将所需部分应用于您当前的代码):

package main

import (
    "cloud.google.com/go/translate"
    "context"
    "google.golang.org/api/option"
)

func main() {
    ctx := context.Background()
    client, err := translate.NewClient(ctx, option.WithCredentialsFile("/path/to/your/file"))
    if err != nil {
        // TODO: handle error.
    }
    // Use the client.

    // Close the client when finished.
    if err := client.Close(); err != nil {
        // TODO: handle error.
    }
}

(这只是 the docs 中包含附加选项的示例的副本。)

答案 1 :(得分:1)

我解决了这个问题。我下载了“google cloud shell SDK”并使用了“gcloud auth application-default login”代码。 SDK 提供了一个 JSON 文件,我用新的 JSON 文件替换了它。

我不推荐 cloud.google.com/translate/docs/setup 说明。直接使用 Google Cloud SDK。