LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

今回は、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);
}

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

終わりに

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0