Posted at

Laravelでpocketのアクセストークンを取得し、ストックしている記事のデータをゲットする

今回は、pocketのアクセストークンを取得し、pocketでスットクしているデータをゲットすることにします!

早速いきましょう!!


1. pocketでアプリ登録をする

pocketのアプリケーション登録ページでアプリの登録をしてください。

Application Nameには自分で作っているアプリ名

Application Descriptionには、自分で作っているアプリの概要

PermissionsはAddは「ポケットへの記事の追加権限」、Modifyは「ストックしている記事の情報を変更する権限」、Retrieveは「ストックしている記事の読み取り権限」を表します。

Platformは、自分のサービスを公開するプラットフォームを選択してください。

ストックしている記事のデータを取得するだけならRetrieve権限だけにしておきます。

全部完了したら、Comsumer Keyがゲットできます!!


2. guzzlehttp/guzzleをインストールする

HTTPリクエストを簡単に行えるようにするために、guzzlehttp/guzzleをインストールします。

$ composer require guzzlehttp/guzzle


3. web.phpをかく

関数名めちゃくちゃ適当につけてしまったので、ご自由に変更してください。


web.php

// pocket

Route::get('/pocket/login', 'Auth\PocketController@loginOAuth');
Route::get('/pocket/loginComplete', 'Auth\PocketController@loginComplete');


4. loginOAuthメソッドでリクエストトークンを取得する

Conrollerの上部にはguzzleを使えるようにするために、useを書きましょう


pocketController.php

use GuzzleHttp\Client;



pocketController.php

public function loginOAuth(Request $request)

{
$client = new Client();
// リクエストトークンをゲットするためにPOSTリクエストを送るURL
$url = "https://getpocket.com/v3/oauth/request";

$params = [
'consumer_key' => env('POCKET_CLIENT_ID'),
'redirect_uri' => 'http://localhost/pocket/loginComplete',
];

$response = $client->post($url, [
'debug' => false, // trueにしたらデバッグできます
'content-type' => 'application/json',
'json' => $params,
]);

$result = $response->getBody()->getContents();

// $resultには、「code=***」という形式のデータが入るので、「***」の部分(トークン)を取得
$request_token = explode('=', $result)[1];

// トークンをセッションに入れる
$request->session()->put('code', $request_token);

// pocketの認証画面URLを定義する
$url = 'https://getpocket.com/auth/authorize?request_token=' . $request_token . '&redirect_uri=' . $params["redirect_uri"];

// pocketの認証画面URLに遷移する
return redirect((string)$url);
}



5. 認証した後のメソッドを作成する


pocketController.php

public function loginComplete(Request $request)

{
// セッションからリクエストトークンを取り出す。
$code = $request->session()->get('code');

// もしリクエストトークンがセッションにあったら
if (!is_null($code)) {
$client = new Client();
$url = 'https://getpocket.com/v3/oauth/authorize';
$params = [
'consumer_key' => env('POCKET_CLIENT_ID'),
'code' => $code,
];

$response = $client->post($url, [
'debug' => false,
'content-type' => 'application/json',
'json' => $params,
]);

$result = $response->getBody()->getContents();

// レスポンスは「access_token=****&username=*******」という形なので、アクセストークンのみを抽出する
$access_token = explode('=', explode('&', $result)[0])[1];

$user = Auth::user();
// アクセストークンをDBに保存します
$user->pocket_token = $access_token;
$user->update();

return redirect()->route('pocket');
} else {
// セッションにリクエストトークンがない場合(不正アクセスの時)の処理をここに書く
}
}


これで、pocketのアクセストークンは手に入りましたね!!!


6. 記事を表示する

pocketの記事を取ってくる、getItemsメソッドを作成しましょう!

アクセストークンを渡したら、その人のストックしている記事を持ってくるようにします。


pocketController.php

public function getPocketItem($token)

{
$client = new Client();

$url = 'https://getpocket.com/v3/get';
$params = [
'consumer_key' => env('POCKET_CLIENT_ID'),
'access_token' => $token,
'sort' => 'newest',
'count' => '30',
"detailType" => "complete",
];

// httpリクエスト(post)を送る
$response = $client->post($url, [
'debug' => false,
'content-type' => 'application/json',
'json' => $params,
]);

$result = json_decode($response->getBody()->getContents());
dd($result);
}


これで記事を持ってくることができます!!


終わりに

注意事項としては、記事の表示だけで良いのに、アプリの登録をするときに不要な権限を付与しないことです。

仕組みがわかれば、結構簡単にできますので、ぜひやってみてください!