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

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

早速いきましょう！！

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

[pocketのアプリケーション登録ページ](http://getpocket.com/developer/apps/)でアプリの登録をしてください。

`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);
}
```

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

# 終わりに

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

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