所以我可以使用快速入门中提供的示例视频向视频情报api发出有效请求。 https://cloud.google.com/video-intelligence/docs/getting-started我也尝试了许多不同的方法来验证api。我正在使用的API令牌是从控制台的“凭据”页面创建的。没有选项将它绑定到视频api所以我认为它应该自动工作。该API已在我的帐户中启用。
export TOKEN="foobar"
curl -XPOST -s -k -H"Content-Type: application/json" "https://videointelligence.googleapis.com/v1beta1/videos:annotate?key=$TOKEN" --data '{"inputUri": "gs://custom-bucket/IMG_3591.mov", "features": ["LABEL_DETECTION"]}'
{
"error": {
"code": 403,
"message": "The caller does not have permission",
"status": "PERMISSION_DENIED"
}
}
curl -XPOST -s -k -H"Content-Type: application/json" "https://videointelligence.googleapis.com/v1beta1/videos:annotate?key=$TOKEN" --data '{"inputUri": "gs://cloud-ml-sandbox/video/chicago.mp4", "features": ["LABEL_DETECTION"]}'
{
"name": "us-east1.18013173402060296928"
}
更新
我将文件设置为公共文件并且有效。但我需要将其作为私有访问,因此我授予服务帐户访问该文件的权限,并尝试获取建议的API密钥。
export TOKEN="$(gcloud auth print-access-token)"
curl -XPOST -s -k -H"Content-Type: application/json" "https://videointelligence.googleapis.com/v1beta1/videos:annotate?key=$TOKEN" --data '{"inputUri": "gs://custom-bucket/IMG_3591.mov", "features":["LABEL_DETECTION"]}'
{
"error": {
"code": 400,
"message": "API key not valid. Please pass a valid API key.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.Help",
"links": [
{
"description": "Google developers console",
"url": "https://console.developers.google.com"
}
]
}
]
}
}
这个print-access-token函数返回的令牌似乎不起作用。我有一个API密钥,但它无法访问存储桶,我也没有看到提供API密钥访问权限的方法。
更新2:
所以看起来我们设置了令牌错误。我们正在关注这个例子https://cloud.google.com/video-intelligence/docs/analyze-labels#videointelligence-label-file-protocol,这是我们得到apiKey = $ TOKEN的地方。但看起来我们需要设置Bearer Header。我们一开始尝试这个,但我们遇到了第一个无法访问存储桶的问题。谢谢你。
答案 0 :(得分:4)
TL; DR - 由于缺少权限,视频智能服务无法访问云存储分区上的文件。由于API使用传递的服务帐户令牌的权限,因此您需要授予您的服务帐户权限,以便读取GCS存储桶中的文件或整个GCS存储桶本身。
长版
您传递的访问令牌应对应于IAM服务帐户密钥。该服务帐户将属于一个项目(您需要启用视频智能API访问),并且该服务帐户应具有访问您尝试访问的GCS存储桶的权限。
每个此类服务帐户都有SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
形式的关联电子邮件ID。
在云控制台中,您可以转到云存储桶/文件并为IAM服务帐户电子邮件地址授予Reader
权限。没有必要公开这个桶。
如果使用gsutil
,则可以运行以下等效命令:
gsutil acl ch -u SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com:READ gs://custom-bucket/IMG_3591.mov`
我自己使用我在项目中创建的IAM服务帐户确认了这一点,并使用它来调用视频智能API。该文件未公开,但仅授予对服务帐户的“读者”权限。
我使用gcloud来激活服务帐户并获取访问令牌,尽管您也可以使用google OAuth API手动执行此操作:
gcloud auth activate-service-account SERVICE_ACCOUNT_KEY.json
export TOKEN="$(gcloud auth print-access-token)"
使用gcloud创建IAM服务帐户的步骤位于same page。
答案 1 :(得分:2)
我可以重复这个问题。我认为问题是您没有在gs存储桶中为视频文件设置适当的权限。要测试这个假设,请尝试公开分享(Google Storage中blob旁边的复选框),然后再次运行请求。