【问题标题】:"User does not have an AdSense account" message when using a service account to access the AdSense Management API使用服务帐户访问 AdSense Management API 时出现“用户没有 AdSense 帐户”消息
【发布时间】:2016-05-01 17:31:10
【问题描述】:

我真的查了一下,没有找到合适的答案。

我的 AdSense 和 AdMob 帐户共享同一个发布商 ID。它们很活跃,当我在https://developers.google.com/adsense/management/v1.4/reference/accounts/list 中尝试 API 时,它运行良好。

1) 使用我的个人电子邮件创建了一个 AdSense 帐户。
2) 在https://console.developers.google.com/apis/credentials中启用了 AdSense 管理 API
3) 创建服务帐户并下载凭证的机密 json 文件
5) 等待至少 48 小时。现在可能更多。
4) 我的 pom.xml 文件有这些依赖:

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-adsense</artifactId>
    <version>v1.4-rev160-1.21.0</version>
</dependency>
<dependency>
    <groupId>com.google.http-client</groupId>
    <artifactId>google-http-client-jackson2</artifactId>
    <version>1.21.0</version>
</dependency>
<dependency>
    <groupId>com.google.oauth-client</groupId>
    <artifactId>google-oauth-client-jetty</artifactId>
    <version>1.21.0</version>
</dependency>

5) 我的代码

private static Credential authorize() throws Exception {

    FileInputStream is = new FileInputStream( "/data/admob-test.json" );
    GoogleCredential credential = GoogleCredential.fromStream( is ).createScoped( AdSenseScopes.all() );
    credential.refreshToken();
    return credential;
}

private static AdSense initializeAdsense() throws Exception {

    // Authorization.
    Credential credential = authorize();

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JacksonFactory jsonFactory = new JacksonFactory();

    // Set up AdSense Management API client.
    AdSense adsense = new AdSense.Builder( httpTransport, jsonFactory, credential ).setApplicationName( "random-app-name" ).build();

    return adsense;
}

public static void main( String[] args ) {

    try {
        AdSense adsense = initializeAdsense();

        // I get an exception on the following line:
        Accounts accounts = adsense.accounts().list().execute(); 

        if ( ( accounts.getItems() != null ) && !accounts.getItems().isEmpty() ) {

            System.out.println( "SUCCESS!" );
        }
        else {

            System.out.println( "FAIL!" );
        }
    } catch ( Exception e ) {

        e.printStackTrace();
    }
}

6) 错误信息

403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "User does not have an AdSense account.",
    "reason" : "noAdSenseAccount"
  } ],
  "message" : "User does not have an AdSense account."
}

我错过了什么吗?我已经关注了我发现的关于这个主题的每一个 stackoverflow 条目,但无济于事。

当我调试时,凭据对象看起来没问题,所有服务帐户机密都已加载。当我执行 credential.refreshToken(); 时,它会获得一个 AuthToken;命令。我不明白缺少什么。

任何帮助将不胜感激。

【问题讨论】:

  • 嘿,你解决了吗?遇到同样的问题。
  • 遇到同样的问题

标签: oauth-2.0 admob adsense adsense-api


【解决方案1】:

来自https://developers.google.com/adsense/management/getting_started “不支持服务帐户...”

如果您遵循入门指南/示例并打开离线访问,您可以生成(并存储)一个可重复使用的令牌,用于在未来进行调用。

如果您使用https://github.com/googleads/googleads-adsense-examples/blob/master/java/v1.x/src/main/java/com/google/api/services/samples/adsense/cmdline/AdSenseSample.java 的 java 示例,请查看 DATA_STORE_DIR

【讨论】:

  • 你能提供更多细节吗? “打开离线访问”是什么意思,DATA_STORE_DIR 应该是什么?
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多