2018年4月12日木曜日

OAuth2.0での認証と登録チャンネルリストの出力

YouTubeのAPIにはOAuth2.0での認証が必要なものがあります。
ここでは認証を行った後、自分のチャンネル登録のリストの出力を目標とします。

認証の仕方についてはこちらに書かれています。ざっと目を通せばよいです。

①認証情報の作成
APIキーを作成した時のようにconsole.developers.google.comへ行き
認証情報>認証情報を作成>OAuthクライアントID の作成>その他
で作成します。(たぶんこれでいいと思う。。。)



クライアントIDとクライアントシークレットをコピーしてファイルに保存してください。
※ここではclient_data.txtにクライアントIDとクライアントシークレットの順に文字列だけを保存します。

② トークンの取得
2つのphpファイルが必要です。
一つ目のphpをブラウザ上で実行する

googleの認証画面に行き許可ボタンを押す(goolgeアカウントのパスワードが必要かも)

認証情報をもらった2つ目のphpが更新トークンをファイルに保存する
という流れとなります。

2つ目のphpでは アクセストークンと更新トークンの両方が得られますが更新トークンだけを保存します。
トークンにはアクセストークンと更新トークンがあります。
アクセストークンをAPIキーのように&access_token=に渡して使用しますが1時間ぐらいで期限切れになってしまいます。アクセストークンを得るために認証画面にたびたいび行くのはメンドクサイです。
しかし更新トークンはもっと期限はもっと長いです。
なので更新トークンを使いアクセストークンを認証画面に無しでゲットしてphpで使用しようって流れとなります。

 ブラウザのURLに
「http://localhost/get_token.php」と入力してみてください。(C:\xampp\htdocs直下にファイルがある場合)
これで認証画面に遷移した後に許可をすると、 ReToken.txtに更新トークンが保存されます。
「更新トークンを保存しました。」と表示されれば成功です。

コードは以下のようになります。


1つ目のphp
get_token.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// アプリケーション設定
define('CONSUMER_KEY', '①');
define('CALLBACK_URL', 'http://localhost/oauth.php');
 
// URL
define('AUTH_URL', 'https://accounts.google.com/o/oauth2/auth');
 
$params = array(
 'client_id' => CONSUMER_KEY,
 'redirect_uri' => CALLBACK_URL,
 'scope' => 'https://www.googleapis.com/auth/youtube.readonly',
 'response_type' => 'code',
 'access_type' => 'offline',
);
 
// 認証ページにリダイレクト
header("Location: " . AUTH_URL . '?' . http_build_query($params));
?>


注釈としては
コードの①にクライアントIDを入れる。(折角ファイルに保存したのでそのように改造しても可)
4行目のコールバックした時実行するphpについては、2つ目のファイル名にあわせる。
12行目のスコープはとりあえず「https://www.googleapis.com/auth/youtube.readonly」にしています。たとえば動画のアップロードをする、グーグルマップを使いたいなどの場合はそれぞれ違うURLになります。

2つ目のphp
oauth.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
// アプリケーション設定
define('CONSUMER_KEY', '①');
define('CONSUMER_SECRET', '②');
define('CALLBACK_URL', 'http://localhost/oauth.php');
 
// URL
define('TOKEN_URL', 'https://accounts.google.com/o/oauth2/token');
 
$params = array(
 'code' => $_GET['code'],
 'grant_type' => 'authorization_code',
 'redirect_uri' => CALLBACK_URL,
 'client_id' => CONSUMER_KEY,
 'client_secret' => CONSUMER_SECRET,
);
$headers = array(
    'Content-Type: application/x-www-form-urlencoded',
);
// POST送信
$options = array('http' => array(
 'method' => 'POST',
 'content' => http_build_query($params),
 'header' => implode("\r\n", $headers),
));
 
// アクセストークンの取得
$res = file_get_contents(TOKEN_URL, false, stream_context_create($options));
 
// レスポンス取得
$token = json_decode($res, true);
if(isset($token['error'])){
 echo 'エラー発生';
 exit;
}
$access_token = $token['access_token'];
$refresh_token = $token['refresh_token'];
 
//ファイルへの保存
$fp = @fopen("ReToken.txt","w") or die("File Open Error!\n");
fputs($fp,$refresh_token);
fclose($fp);
 
echo "更新トークンを保存しました。";
 
 
?>


注釈としては
コードの①にクライアントIDを入れる。②にはクライアントシークレットを入れる。
(折角ファイルに保存したのでそのように改造しても可)
11行目で認証した結果をgetしています。



③自分の登録しているチャンネルのリストの出力をする。
コード前半は、ファイルに保存されたクライアントID、クライアントシークレットと更新トークンを読み出し使用してアクセストークンを得てます。
後半は、アクセストークンを使い自分の登録チャンネルを出力しています。
出力のフォーマットして、チャンネルIDを””でくくり、タイトルをコメントアウトで出力して 以前の生放送の検出のコードで使用しやすいフォーマットとしました。
コマンドプロンプトで実行し>や>>で保存するなどすれば登録したチャンネルの整理やさらにコードを変更して登録者数でグループ分けするなどに活用できると思います。
使用しているAPIについてはこちらからを参照。

chlist.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
define('TOKEN_URL', 'https://accounts.google.com/o/oauth2/token');
 
//ファイルからclient_idとclient_secretを読み込む
$fp = @fopen("client_data.txt","r") or die("File Open Error!\n");
$client_id = rtrim(fgets($fp));
$client_secret = rtrim(fgets($fp));
fclose($fp);
 
//ファイルから更新トークンを呼び出す
$fp = @fopen("ReToken.txt","r") or die("File Open Error!\n");
$refresh_token =rtrim( fgets($fp));
fclose($fp);
 
//リフレッシュトークンからアクセストークンを取得する
$params2 = array(
 
 'client_id' => $client_id,
 'client_secret' => $client_secret,
 'refresh_token' => $refresh_token,
 'grant_type' => 'refresh_token',
);
$headers = array(
    'Content-Type: application/x-www-form-urlencoded',
);
// POST送信
$options2 = array('http' => array(
 'method' => 'POST',
 'content' => http_build_query($params2),
 'header' => implode("\r\n", $headers),
));
 
// アクセストークンの取得
$res = file_get_contents(TOKEN_URL, false, stream_context_create($options2));
 
// レスポンス取得
$token = json_decode($res, true);
if(isset($token['error'])){
 echo 'エラー発生';
 exit;
}
$access_token = $token['access_token'];
 
 
 
 
//登録チャンネルのリストを取得する
$search_api="https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&mine=true&access_token=" .$access_token;
 
$next = 1;
$url = $search_api;
while($next)
{
 if($next != 1)
 {
  $url = $search_api . "&pageToken=" . $next;
 }
  
 $search_contents = file_get_contents($url);
 $search_json = json_decode($search_contents,true);
 foreach($search_json["items"] as $k => $data)
 {
  echo '"' . $data["snippet"]["resourceId"]["channelId"].'",';
  echo "\x20";
  echo "//" . $data["snippet"]["title"];
  echo PHP_EOL;
 }
 $next = empty($search_json["nextPageToken"])? 0 : $search_json["nextPageToken"];
}
 
 
?>?>


注釈として
48行目&mine=trueとして自分のアカウントの情報を対象としています。(そのため自分のアカウントで承認されたアクセストークンが必要)。
またAPIキーではなく&access_token=としてアクセストークンを使用しています。
アクセストークンの使用期限は$resの情報に含まれています。
長時間の使用する場合は使用期限が切れる少し前に更新トークンを使用してアクセストークンを再取得する必要があります。連続使用するケースは思いつきませんが。。。

0 件のコメント:

コメントを投稿