anybody's game

日々感じたこと、艦隊これくしょん、千年戦争アイギス、読書記録

HatenaBlogAPIから自分のブログデータを取得する【はてなブログ】PHPStormからはてなブログを使う Part.4

前回のおさらい

aods1004.hatenablog.jp

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

github.com

GuzzleBundleWssePlugin

GuzzleBundleWssePluginは、Symfonyに入れられたGuzzeleBundleにWSSE認証機能を追加してくれるプラグインです。

composer require gregurco/guzzle-bundle-wsse-plugin

github.com

バンドル設定

 次に導入したバンドル・プラグインの設定をして、自分のアプリケーションで使えるようにします。

 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.phpregisterBundlesメソッドを改修し、バンドルにプラグインを導入できるようにします。

<?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&#39;s game</title>
<subtitle>日々感じたこと、艦隊これくしょん、千年戦争アイギス、読書記録</subtitle>
# 以下略

 無事、自分のブログのデータが取得できました。次回は、取得したデータを使いやすいようにシリアライズできるように頑張りたいと思います。

ここまでの成果

github.com