我正在尝试使用双击广告商API(DFA)。我已经探索了"试用"并通过谷歌开发人员控制台测试了 API,它按预期工作。我能够捕获授权令牌并执行获取和发布请求(通过浏览器和编程方式)。但是,当我尝试使用 donet api 2.4 以编程方式执行完全相同的操作时,生成的身份验证令牌不允许我执行任何请求,它始终返回 HTTP 400 错误请求,原因为无效配置文件 ID。
我不确定 client_secrets.json 是否正确,但我使用有权访问报告的同一电子邮件帐户创建了它。
{
"installed": {
"client_id": "<client_id>.apps.googleusercontent.com",
"project_id": "<project_id>",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_secret": "<secret>",
"redirect_uris": [ "urn:ietf:wg:oauth:2.0:oob", "http://localhost" ]
}
}
我使用了下面的凭据代码:
private static readonly IEnumerable<string> scopes = new[] {
DfareportingService.Scope.Dfareporting,
DfareportingService.Scope.Dfatrafficking
};
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
scopes,
"dfa-user", CancellationToken.None,
new FileDataStore("DfaReporting.Samples")).Result;
生成的令牌为我提供了以下信息:
{
"issued_to": "<client_id>.apps.googleusercontent.com",
"audience": "<client_id>.apps.googleusercontent.com",
"scope": "https://www.googleapis.com/auth/dfareporting https://www.googleapis.com/auth/dfatrafficking",
"expires_in": 3073,
"access_type": "offline"
}
我上面提到的库可以在GitHub上找到:https://github.com/googleads/googleads-dfa-reporting-samples/tree/master/dotnet/v2.4
我错过了什么?
首先,请确保您已正确设置。
- 您必须拥有 DCM 帐户。有关注册信息,请参阅广告商/代理机构。
- 您的 DCM 帐户必须启用 API 访问。请联系您的 DoubleClick 代表或 DCM 支持团队寻求帮助。(dcm-support@google.com)
- 您必须具有有权访问此帐户的用户配置文件。让您的 DCM 帐户管理员创建与此帐户关联的用户配置文件。
身份验证的人无法访问您尝试请求的配置文件。
回应评论:
如果您使用的是 .net 客户端库,我不明白为什么您会在评论时手动调用以下请求
https://www.googleapis.com/dfareporting/v2.4/userprofiles?access_token=<access token>
我也不明白如果您使用的是 .Net 客户端库,并且当您不发送配置文件时,以下请求可能会返回无效的配置文件 ID。 如果用户无权访问任何配置文件,则它可能不返回任何配置文件。
service.UserProfiles.List().Execute();
如果您发送的配置文件 ID 无效,这可能会返回无效的配置文件 ID。
service.UserProfiles.Get(profileId).Execute();
运行报表
为了能够运行报表,用户必须有权访问该配置文件和报表。 您的错误消息意味着用户无权访问该配置文件,您需要使用具有访问权限的用户登录或授予用户访问权限。
service.Reports.Run(profileId,reportId).Execute();