基本情報
- 次に作りたいQiita、dev.toの様なサービスについて で書いたサービスを開発中です。
- 前回の記事
はじめに
冒頭の記事にも書いているように、僕自身はサービスが公開できる状態になったらはてなブログからそのサービスに引っ越そうと思っています。また、引っ越す予定のない方も、カノニカルタグに対応しているので自分のブログに記事を掲載したまま、このサービスにも同じ記事を投稿できるようになっています。(SEO的にも問題なし)
ただ、手動でやるならやっぱり手間で微妙ですので、インポート機能は必須かなと思っており、とりあえず自分が持っていて且つAPIが提供されているはてなブログについては自動で取り込む機能を実装しました。
導入
はてなのAPIは色々と導入方法があるのですが、今回はOAuthを利用したログイン&インポートを行います。
LaravelのSocialiteで既に認証機能を実装してるので、下記を参考にしてSocialiteにはてなのドライバを追加することでログイン&トークンを取得できるようにしました。むちゃくちゃ簡単にできました。
Laravel Socialite の独自ドライバを実装する
記事の取得
事前準備はできたので実際に記事を取得していきます。上記で紹介した記事に書かれているHatenaServerというクラスに下記のような取得処理を実装しました。
public function getBlogEntries($token, $tokenSecret, $id, $blogId, $page = null)
{
$tokenCredentials = new TokenCredentials();
$tokenCredentials->setIdentifier($token);
$tokenCredentials->setSecret($tokenSecret);
$url = "https://blog.hatena.ne.jp/{$id}/{$blogId}/atom/entry";
if ($page) {
$url .= "?page={$page}";
}
$client = $this->createHttpClient();
$headers = $this->getHeaders($tokenCredentials, 'GET', $url);
try {
$response = $client->get($url, [
'headers' => $headers,
]);
} catch (BadResponseException $e) {
$response = $e->getResponse();
$body = $response->getBody();
$statusCode = $response->getStatusCode();
throw new \Exception(
"Received error [$body] with status code [$statusCode] when retrieving token credentials."
);
}
$xml = simplexml_load_string((string) $response->getBody());
$json = json_encode($xml);
return json_decode($json, true);
}
最後の3行がすごいですよね。下記で紹介されていました。(ただしあとで見てみたところ、一部消えてしまうパターンがあるようです)
simplexml_load_file(simplexml_load_string) を配列に変換する
これで記事はもう取れてしまうので、あとはLaravelにコマンドを追加し、実際のサーバーでは延々とcronで回していけば自動的に最新の記事をインポートしていくことができます。
上記のメソッドを参考にちょこっと変更してPUTとかすれば記事を更新したりする機能を作ることもできます。
(まあでもはてなブログのAPIはあまりサービスに組み込むことはないと思うのでBASIC認証でちゃちゃっと実装することの方が多いかもしれませんね)
次回
多分サーバーへのデプロイ&αバージョン公開