使用Google Analytics API v3的OAuth 2.0

lpd*_*ito 28 oauth google-api google-analytics-api oauth-2.0 garb-gem

我曾经能够使用我的帐户的登录名和密码查询Google AnalyticsAPI.谷歌现在使用OAuth进行身份验证,这很棒......唯一的问题是我只需要一个访问令牌.我不想让其他用户获取他们的分析数据.

我只是想获取我的数据.有没有办法只为我的应用或分析帐户生成访问令牌?

我知道存在这样的解决方案......例如,Twitter为不需要特定用户登录的应用程序提供了所谓的"单用户oauth".

再一次,我在这里想要完成的是通过API获取我自己的分析数据.

有没有办法正确地做到这一点?

Ter*_*ler 40

我正在添加PHP答案 - 您可以调整或将其转换为garb/ruby​​代码.

您现在应该可以将Analytics与服务帐户一起使用.您确实必须使用私钥而不是访问令牌.

在API控制台中创建应用程序
基本上,您可以转到Google API控制台并创建应用程序.
在服务标签中启用Google Analytics.
在API Access选项卡中,创建一个新的OAuth ID(创建另一个客户ID ...按钮),选择服务帐户并下载您的私钥(Generate new key ... link).您必须稍后将密钥上传到您的Web服务器.

在"API访问"页面的"服务帐户"部分中,复制电子邮件地址(@ developer.gserviceaccount.com),并将包含此电子邮件地址的新用户添加到您的Google Analytics配置文件中.如果你不这样做,你会得到一些不错的错误

代码
从SVN下载最新的Google PHP客户端(从命令行svn checkout http://google-api-php-client.googlecode.com/svn/trunk/ google-api-php-client-read-only).

您现在可以在代码中访问Analytics API:

require_once 'Google_Client.php';              
require_once 'contrib/Google_AnalyticsService.php';

$keyfile = 'dsdfdss0sdfsdsdfsdf44923dfs9023-privatekey.p12';

// Initialise the Google Client object
$client = new Google_Client();
$client->setApplicationName('Your product name');

$client->setAssertionCredentials(
    new Google_AssertionCredentials(
        '11122233344@developer.gserviceaccount.com',
        array('https://www.googleapis.com/auth/analytics.readonly'),
        file_get_contents($keyfile)
    )
);

// Get this from the Google Console, API Access page
$client->setClientId('11122233344.apps.googleusercontent.com');
$client->setAccessType('offline_access');
$analytics = new Google_AnalyticsService($client);

// We have finished setting up the connection,
// now get some data and output the number of visits this week.

// Your analytics profile id. (Admin -> Profile Settings -> Profile ID)
$analytics_id   = 'ga:1234';
$lastWeek       = date('Y-m-d', strtotime('-1 week'));
$today          = date('Y-m-d');

try {
    $results = $analytics->data_ga->get($analytics_id,
                        $lastWeek,
                        $today,'ga:visits');
    echo '<b>Number of visits this week:</b> ';
    echo $results['totalsForAllResults']['ga:visits'];
} catch(Exception $e) {
    echo 'There was an error : - ' . $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案!我知道必须有一种方法可以做到这一点,但无法在API文档中找到正确的详细信息.谢谢! (2认同)
  • 非常感谢你的回答.我已经把一半的头发拉出来试图验证服务应用程序,但这个答案保存了另一半. (2认同)

bra*_*log 7

特里塞德勒很好地回答了这个问题.我想添加一个java代码示例.

Api控制台设置

首先在谷歌api控制台中执行必要的步骤,特里解释说:

基本上,您转到Google API控制台并创建应用.在服务标签中启用Google Analytics.在API Access选项卡中,创建一个新的OAuth ID(创建另一个客户ID ...按钮),选择服务帐户并下载您的私钥(Generate new key ... link).您必须稍后将密钥上传到您的Web服务器.在"API访问"页面的"服务帐户"部分中,复制电子邮件地址(@ developer.gserviceaccount.com),并将包含此电子邮件地址的新用户添加到您的Google Analytics配置文件中.如果你不这样做,你会得到一些不错的错误

获取必要的库

从以下网址下载google analytics java客户端:https: //developers.google.com/api-client-library/java/apis/analytics/v3

或者添加以下maven依赖项:

    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-analytics</artifactId>
        <version>v3-rev94-1.18.0-rc</version>
    </dependency>
    <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client-jackson</artifactId>
        <version>1.18.0-rc</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

现在代码:

public class HellowAnalyticsV3Api {

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static final JsonFactory JSON_FACTORY = new JacksonFactory();

public void analyticsExample() {

    // This is the .p12 file you got from the google api console by clicking generate new key
    File analyticsKeyFile = new File(<p12FilePath>);

    // This is the service account email address that you can find in the api console
    String apiEmail = <something@developer.gserviceaccount.com>;

    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(HTTP_TRANSPORT)
        .setJsonFactory(JSON_FACTORY)
        .setServiceAccountId(apiEmail)
        .setServiceAccountScopes(Arrays.asList(AnalyticsScopes.ANALYTICS_READONLY))
        .setServiceAccountPrivateKeyFromP12File(analyticsPrivateKeyFile).build();

    Analytics analyticsService = new Analytics.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
        .setApplicationName(<your application name>)
        .build();


    String startDate = "2014-01-03";
    String endDate = "2014-03-03";
    String mertrics = "ga:sessions,ga:timeOnPage";

    // Use the analytics object build a query
    Get get = analyticsService.data().ga().get(tableId, startDate, endDate, mertrics);
    get.setDimensions("ga:city");
    get.setFilters("ga:country==Canada");
    get.setSort("-ga:sessions");

    // Run the query
    GaData data = get.execute();

    // Do something with the data
    if (data.getRows() != null) {
        for (List<String> row : data.getRows()) {
            System.out.println(row);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 0

Google 拥有“服务帐户”(代表您的应用程序而不是最终用户调用 Google API),但其工作方式有点不同,因为它不会使用访问令牌,而是使用私钥。

您可以在https://developers.google.com/accounts/docs/OAuth2ServiceAccount找到更多详细信息