前回のおさらい
Symfonyでパスワードなどを設定ファイルおき、それを利用するところまでやりました。PHPのバージョンは、 7.2.0 、Symfonyのバージョンは、4.0.9です。
HatenaBlogAPIから自分のブログデータを取得する
次に、HatenaBlogAPIから自分のブログデータを取得するところまでがんばろうと思います。
はてなブログAtomPub - Hatena Developer Center
HatenaBlogAPIの仕様は、このページに書いてあります。他ユーザーも使えるようにWebに公開するなどは考えていないシステムなので、認証はOAuthではなくWSSE認証を選びます。
今回新しくつかうパッケージのインストール
今回、WebAPIを利用しはじめるので、HTTPクライアントと、WSSE認証を簡単にしてくれるプラグインを導入しようと思います。そのバンドルのWSSE認証です。
EightPointsGuzzleBundle
EightPointsGuzzleBundleは、SymfonyにHTTPクライアントのGuzzleを導入してくれるバンドルです。
composer require eightpoints/guzzle-bundle
GuzzleBundleWssePlugin
GuzzleBundleWssePluginは、Symfonyに入れられたGuzzeleBundleにWSSE認証機能を追加してくれるプラグインです。
composer require gregurco/guzzle-bundle-wsse-plugin
バンドル設定
次に導入したバンドル・プラグインの設定をして、自分のアプリケーションで使えるようにします。
ROOT/config/packages/
に、「eight_points_guzzle.yaml」というファイルを作成。packages以下の設定ファイルは自動的に読み込んでくれるようです。
eight_points_guzzle: clients: hatena_blog_atom_pub_api: base_url: "https://blog.hatena.ne.jp" plugin: wsse: username: '%env(HATENA_BLOG_API_USER)%' password: '%env(HATENA_BLOG_API_SECRET)%'
そして、自分のアプリケーションにBundleを登録します。
<?php return [ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundle::class => ['all' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], ];
まだSymfony 4ではまだバンドルのプラグインを簡単に書く方法が確立していない、もしくは、これが最終形なのかわかりませんが、ROOT/src/Kernel.php
のregisterBundles
メソッドを改修し、バンドルにプラグインを導入できるようにします。
<?php class Kernel extends BaseKernel { # 中略 public function registerBundles() { $contents = require $this->getProjectDir().'/config/bundles.php'; foreach ($contents as $class => $envs) { if ($class === \EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundle::class) { yield new $class([ new \Gregurco\Bundle\GuzzleBundleWssePlugin\GuzzleBundleWssePlugin(), ]); } else { yield new $class(); } } }
これで「hatena_blog_atom_pub_api」という名前で、認証情報と、APIのベースURLが設定された状態のHTTPクライアントが利用できるようになりました。
アプリケーションへの導入
ROOT/config/service.yaml
のargumentsとして、「@eight_points_guzzle.client.hatena_blog_atom_pub_api」を追記します。
fetch_hatena_blog_entries: class: App\Command\FetchHatenaBlogEntriesCommand arguments: - '@eight_points_guzzle.client.hatena_blog_atom_pub_api' - '%app.hatena_blog_api_username%' - '%app.hatena_blog_api_blog_id%'
これにより、先ほど設定したHatenaBlogAPI用に設定が済んだGuzzle HTTTPクライアントがコマンドスクリプトのクラスに自動的に送られてくるようになります。
続いてHTTPクライアントの受取先となるコマンドのスクリプトを改造します
ROOT/src/Command/FetchHatenaBlogEntriesCommand.php
<?php namespace App\Command; # 中略 /** * Class FetchHatenaBlogEntriesCommand * @package App\Command */ class FetchHatenaBlogEntriesCommand extends Command { /** @var Client */ protected $client; protected $username; protected $blogId; /** * FetchHatenaBlogEntriesCommand constructor. * @param Client|null $client * @param string $username * @param string $blogId */ public function __construct(Client $client = null, string $username = '', string $blogId = '') { $this->client = $client; $this->username = $username; $this->blogId = $blogId; parent::__construct(); } # 中略 /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $resupose = $this->client->get("/{$this->username}/{$this->blogId}/atom/entry"); var_dump($resupose->getBody()->getContents()); } }
これでコンストラクタの引数として渡されてくるGuzzleのクライアントを受け取れるようになります。また、APIをたたくのにブログのドメインが必要なようなので、前回の記事と同じ要領で「blog_id」の設定を「.env」と「service.yaml」に記述し、コマンドまで渡ってくるように設定しました。
実行
コマンドを実行します。
> php bin\console app:fetch-entries string(180166) "<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"> <link rel="first" href="https://blog.hatena.ne.jp/aods1004/aods1004.hatenablog.jp/atom/entry" /> <link rel="next" href="https://blog.hatena.ne.jp/aods1004/aods1004.hatenablog.jp/atom/entry?page=1525706395" /> <title>anybody's game</title> <subtitle>日々感じたこと、艦隊これくしょん、千年戦争アイギス、読書記録</subtitle> # 以下略
無事、自分のブログのデータが取得できました。次回は、取得したデータを使いやすいようにシリアライズできるように頑張りたいと思います。