8

私は必死に自分でこれを理解しようとしましたが、この質問で SO に行きたくありませんでしたが、私は頭がおかしいです (api / oauth docs のおかげではありません)。

私はPHPで作業しており、メソッドでRESTを使用して、Google_Clientおよびクラスの使用を避けようとしています。AnalyticsServiceanalytics.data.ga.get

STEP #1: Create an API Project for a Web Application

API コンソールに移動し、分析サービスを使用してプロジェクトを作成し、OAuth クライアント ID とシークレットを取得します。

最初のトークン ハンドシェイクを手動で行っているため、インストール済みアプリケーションまたはWeb アプリケーションのクライアント ID を作成できるという印象を受けました。私が間違っている場合は、私を修正してください。

Web アプリケーションのクライアント ID を作成し、クライアント ID xxxxxxxxxxxxxx.apps.googleusercontent.com、クライアント シークレットyyyyyyyyyyyyyyy、およびリダイレクト URIを取得します。http://localhost:9002

STEP #2: Request initial API access

このリンクに入ります。https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:9002&scope=https://www.googleapis.com/auth/analytics.readonly&access_type=offline

これaccess_type=offlineは、REST を使用しており、更新されたトークンが必要になるたびに「ユーザー」(自分自身) が手動でリダイレクト/ポップアップを処理することを期待していないためです。

上記のリクエストが返されますhttp://localhost:9002?code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI

コード4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwIは、API トークンを要求する許可です。

STEP #3: Request First Token

会社の IT の問題により、PHP 5.2.17 を使用せざるを得ず、PHP cURL にアクセスできないため、 and を使用していfile_get_contentsますstream_context_create

最初のトークンは PHP でリクエストされますfile_get_contents()

$opts = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded',
        'content' => 'code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&client_secret=yyyyyyyyyyyyyyy&redirect_uri=http://localhost:9002&grant_type=authorization_code'
    )
);

$context = stream_context_create($opts);

$result = file_get_contents('https://accounts.google.com/o/oauth2/token', false, $context);
var_dump($result);

コンテンツ パラメータは 1 行で指定する必要があります。

上記のコードは、myaccess_tokenおよびrefresh_tokenjson 形式で返します

string(195) "{ "access_token" : "ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro", "token_type" : "Bearer", "expires_in" : 3600, "refresh_token" : "1/8tXvdUKcSEcaaxVqqqqqqqqqqqqqoYpj2KSS9qwWI" }"

access_token がタイムアウトしたときに呼び出される、DB や保護された txt ファイルなどの安全な場所に保存する必要がある更新トークン。

STEP #4: Request Analytics Data

私が理解していることから、ロールする準備ができており、 myaccess_tokenを使用して にリクエストを送信できるはずhttps://www.googleapis.com/analytics/v3/data/gaです。

これを行うには、このリクエストを送信します。

$request = 'https://www.googleapis.com/analytics/v3/data/ga' .
    '?ids=ga%3Aaaaaaaaa' .
    '&start-date=2012-12-07' .
    '&end-date=2012-12-09' .
    '&metrics=ga%3Avisits';

$opts = array(
    'http' => array(
        'method' => 'GET',
        'header' => 'Content-Type: application/x-www-form-urlencoded\r\n' .
                    'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro \r\n'
        )
);

$context = stream_context_create($opts);

$result = file_get_contents($request, FALSE, $context);
var_dump($result);

このリクエストはエラーを返し401 Unauthorizedます。これは、リクエストが適切に形成され、 に接続されていることを意味すると考えていhttps://www.googleapis.com/analytics/v3/data/gaます。

また、このドキュメントGetting Full Quotaaccess_tokenによると、次のように URL にを使用してリクエストを行うことができます。

$request = 'https://www.googleapis.com/analytics/v3/data/ga' .
    '?ids=ga%3A48564799' .
    '&access_token=ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro' .
    '&start-date=2012-12-07' .
    '&end-date=2012-12-09' .
    '&metrics=ga%3Avisits';

$result = file_get_contents($request, FALSE);

$result = json_decode($result);

var_dump($result);

今回403 errorは、Google が応答を含む を受け取りましたUser does not have sufficient permissions for this profile

QUESTION #1

API コンソールまたはトークン取得のプロセスで何かが不足していますか? 私は最終的にaccess_token=ya29and refresh トークンを取得しているので、そうではないと仮定しています。

QUESTION #2 たぶん、単純な https リクエストでこれを行うことができると仮定するのは完全に根拠がありませんか? Google_ClientandAnalyticsServiceクラスを使用する必要がありますか? 私はそうではないと思いますが、間違っているかもしれません。

QUESTION #3 リクエストで「キー」を使用する必要がありますか? &key=bbbbbbbbbbbbbbbb

QUESTION #4

PHP 5.2.17 を使用することで、何か不足していますか? (5.3 または 5.4 自体以外)

たとえば、PHP の一部のバージョンではstream_context_create、次のようにヘッダーを文字列ではなく配列にする必要があります。

$opts = array(
    'http' => array(
        'method' => 'GET',
        'header' => array(
            'Content-Type: application/x-www-form-urlencoded',
            'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro '
        )
    )
);

しかし、私の場合、それは問題ではないと思います。これらの HTTP リクエストを別の方法で (curl を使用せずに) 作成する必要があるかどうかに興味があります。

どんな洞察や考えも大歓迎です
4

3 に答える 3

13

これは、心臓発作を起こしそうになった私のぼんやりした間違いです。

私は通常、Chrome で開発作業を行っています。また、Chrome ブラウザは Gmail アカウントにサインインしていましpersonal@gmail.comた。ただし、私の分析アカウントはwork@gmail.comFireFox で開いていました (笑いすぎないようにしてください)。

100%正しいとは言えませんが、これが一般的な流れだと思います。私がやったときSTEP #2: Request initial API access、私はChromeブラウザでこれをやった. エンドポイントhttps://accounts.google.com/o/oauth2/authは私の personal@gmail.com アカウントを承認していました。私の STEP #4 API リクエストhttps://www.googleapis.com/analytics/v3/data/gaは、私の personal@gmail.com アカウントで分析プロファイルを探していました。もちろん、これは存在しません。

私はこれで文字通り15時間を無駄にしました。これは、更新のトラブルシューティングを試みて、キャッシュをフラッシュするのを忘れるよりもばかげています。

お時間を無駄にして申し訳ありません。

リフレッシュトークンの編集

私は再びこの API の問題に遭遇し、あまりにも多くの異なるクライアントがトークンを使用すると、GA がリフレッシュ トークンを取り消すという難しい方法を発見しました。少なくとも、それが問題だったと思います。

詳細については、こちらを参照してください。

于 2012-12-14T22:03:00.857 に答える
10

今日 403 を受け取り、原因を突き止めました。get関数で、プロファイル ID の代わりにアカウント ID を使用していました。プロファイルIDに切り替えると修正されました。

于 2013-04-03T13:51:52.053 に答える
0

CURL リクエストに問題がある可能性があります。CURL によるピアのGoogleAnalyticsAPI.class.php > class Http > function curl (around line 720)証明書の検証を停止するオプションをもう 1 つ追加します。

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

于 2015-06-23T06:25:50.180 に答える