8

GA から Web 統計データをインポートする PHP スクリプトを作成したいと考えています。スクリプトは Web フロント エンド (インポートをトリガーするため) からアクセスでき、ローカル サーバー (127.0.0.1) に存在します。

ここに画像の説明を入力

ドキュメントから理解したように、認証とコア API の使用には 2 つのオプションがあります。

  1. API キー- 統計へのアクセスのみを許可します
  2. OAuth2 - 完全な承認

OAuth2 の仕組みを正しく理解している場合、コールバック URL を指定できないため、これは私のシナリオではオプションではありません。ブラウザから GA に直接接続する Web プロファイル認証を確立し、JavaScript でデータを取得してインポート スクリプトに渡すなど、ハックなソリューションが頭に浮かびますが、そのようなソリューションは控えたいと思います。また、インポート プロセスをトリガーするブラウザー インタラクションは、将来、cron ジョブに置き換えられる可能性があるためです。

API キーはまさに私が望んでいるもののようですが、ブラウザからの GET リクエストは失敗します。

GET リクエスト:

https://www.googleapis.com/analytics/v3/data/ga
  ?ids=ga:[profile ID]
  &start-date=2013-01-01&end-date=2013-01-05
  &metrics=ga:visits
  &key=[the API key]

応答:

{
  error: {
  errors: [
    {
      domain: "global",
      reason: "required",
      message: "Login Required",
      locationType: "header",
      location: "Authorization"
    }
  ],
  code: 401,
  message: "Login Required"
  }
}

ただし、URL は問題ないはずです。key パラメータを除いて、これはhttp://ga-dev-tools.appspot.com/explorer/で生成されたものと同じで、これも機能しています (その場合は AOuth2 が使用されます)。API キーは最新です。

それから再び新しい API キーを生成すると、次の不便さに直面します。それは、明らかにキーが 1 日しか有効でないということです。


だから一日の終わりに私の質問はこれです:

上記のシナリオで、手動で認証したり API キーを毎日生成したりせずにデータをフェッチすることは可能ですか?

4

3 に答える 3

5

すでに提案されているように、次のライブラリを使用します: https://code.google.com/p/google-api-php-client/ ただし、oauth を使用する代わりに、API コンソールからサービス アカウントを作成します (サーバー アプリケーションを選択するだけです)。これにより、クライアント ID、サービス アカウントを識別する電子メール、および秘密鍵を保持する *.p12 ファイルが提供されます。

次に、必要なデータを取得するために、サービス アカウント (電子メール) を管理者ユーザーとして分析に追加する必要があります。

サービスを利用するには:

$client = new Google_Client();
$client->setApplicationName('test');

$client->setAssertionCredentials(
    new Google_AssertionCredentials(
        EMAIL,
        array('https://www.googleapis.com/auth/analytics.readonly'),
        file_get_contents(PRIVATE_KEY_FILEPATH)
    )
);
$client->setClientId(CLIENT_ID);
$client->setAccessType('offline_access');

$analytics = new Google_AnalyticsService($client);

データを取得するには:

$analytics->data_ga->get(PROFILE_ID, $date_from, $date_to, $metrics, $optParams)

詳細については、API ドキュメントを確認してください。また、クエリの上限があることに注意してください(支払いをしない限り)

于 2013-02-14T16:43:37.783 に答える
2

私は同様の設定をしています。あなたが気づいていないことは、オリジンとコールバック URL として、またはその他のものhttp://localhostを指定できるということです。http://127.0.0.1GA アクセスを持つユーザーの OAuth セットアップを開始する Web インターフェイスをローカル サーバーにセットアップする必要があります。これは 1 回であることに注意してください。コールバック ハンドラは次のようにする必要があります。

注: ここで使用されるライブラリは前の回答と同じです。詳細なコードはラッパーにあります。

$redirect = 'http://' . $_SERVER['HTTP_HOST'] . '/content/business-intelligence';
if (isset($_GET['code'])) {
    require_once 'GAPI.php';
    $client = GAPI::init(); //create client instance of Google_Client
    $client->authenticate(); //convert auth code to access token
    $token = $client->getAccessToken();
    $retVal = CF_GAPI::persistToken($token); //save token
    if($retVal)
        $redirect .= "?new_token";
    else
        $redirect .= "?bad_token";
}
header('Location: ' . $redirect); //redirect to bi index

保存したトークンを保存したら、アナリティクス データを取得するために GA にリクエストを送信する前に、クライアントでトークンを設定する必要があります。お気に入り:

try {
    $token = GAPI::readToken(); //read from persistent storage
} catch (Exception $e) {
    $token = FALSE;
}

if($token == FALSE) {
    $logger->crit("Token not set before running cron!");
    echo "Error: Token not set before running cron!";
    exit;
}

$client = GAPI::init(); //instance of Google_Client
$client->setAccessToken($token); 

GAPI::init()次のように実装されます。

$client = new Google_Client();
$client->setApplicationName(self::APP_NAME);

$client->setClientId(self::CLIENT_ID);
$client->setClientSecret(self::CLIENT_SECRET);
$client->setRedirectUri(self::REDIRECT_URI);
$client->setDeveloperKey(self::DEVELOPER_KEY);

//to specify that the token is stored offline
$client->setAccessType('offline');

//all results will be objects
$client->setUseObjects(true);

//tell that this app will RO from Analytics
$client->setScopes('https://www.googleapis.com/auth/analytics.readonly');

return $client;

私のmysqlテーブルにはid, title, send_to_emails, frequency, dimensions, metrics, filters, profile_id、GAから生成された各レポートを完全に定義するような列があります。ドキュメント指標とディメンションのリスト、および既に知っているサンドボックス テスターを使用して、それらを試すことができます。

于 2013-02-10T18:35:48.280 に答える
2

これを機能させるには、OAuth を使用する必要がありますが、サーバーから実行するには少し変更が必要です。Google では、この認証方法を「Web サーバー アプリケーションに OAuth 2.0 を使用する 」と呼んでいます。

そのページで説明されているように、PHP クライアント ライブラリを使用して認証を行うことができます。クライアント ライブラリはここにあります

このクライアント ライブラリの使用方法の例は、同じプロジェクトのヘルプ ページにあります。コメントには、トークンを db に保存し、定期的に更新するように指示されているため、コードにいくつかの変更を加える必要があることに注意してください。

<?php
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_PlusService.php';

// Set your cached access token. Remember to replace $_SESSION with a
// real database or memcached.
session_start();

$client = new Google_Client();
$client->setApplicationName('Google+ PHP Starter Application');
// Visit https://code.google.com/apis/console?api=plus to generate your
// client id, client secret, and to register your redirect uri.
$client->setClientId('insert_your_oauth2_client_id');
$client->setClientSecret('insert_your_oauth2_client_secret');
$client->setRedirectUri('insert_your_oauth2_redirect_uri');
$client->setDeveloperKey('insert_your_simple_api_key');
$plus = new Google_PlusService($client);

if (isset($_GET['code'])) {
  $client->authenticate();
  $_SESSION['token'] = $client->getAccessToken();
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
  header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}

if ($client->getAccessToken()) {
  $activities = $plus->activities->listActivities('me', 'public');
  print 'Your Activities: <pre>' . print_r($activities, true) . '</pre>';

  // We're not done yet. Remember to update the cached access token.
  // Remember to replace $_SESSION with a real database or memcached.
  $_SESSION['token'] = $client->getAccessToken();
} else {
  $authUrl = $client->createAuthUrl();
  print "<a href='$authUrl'>Connect Me!</a>";
}
于 2013-02-08T22:50:06.470 に答える