私は必死に自分でこれを理解しようとしましたが、この質問で 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 を使用せずに) 作成する必要があるかどうかに興味があります。
どんな洞察や考えも大歓迎です