つばさのーと

つばさの日常を綴るのーと

はてなブログの記事管理を自動化したっていう自己満な自慢話

f:id:tsubasa123:20161204160146j:plain

 

こんにちは、つばさ(@tsubasa123)です。

 

今日はブログの記事の管理方法についてちょっとだけ。この仕組みを使っている人はあまりいないんじゃないかなと思ったのでご紹介です。

 

ブログとはあまり関係なく、プログラム寄りの話になりますのでご了承ください。

 

私はエクセル系の操作がキライ

 

先日公開されたこちらの記事。

 

www.tukinasikotonoha.com

 

感銘を受けて私も記事の管理を始めたわけですが、まぁ、正直めんどくさい。まだ20記事程度しかないのにね。苦手なんですよ、エクセル系の操作。すごいことができるすごいアプリケーションであることは認めますが、すごすぎて私の頭が追い付きません。

 

それと、基本的にはずぼらなんですが管理し始めると徹底的にやりたくなるタイプでして、更新もれや記入もれがないか気になって何度も確認するので、人より余計に時間がかかってしまいます。

 

それがブログのためになるのはわかっているんですが、どうせならその時間はブログのカスタマイズにあてたいのです。

 

月無ことのはさんのようにスプレッドシートのスキルを上げるのも一つの手なのですがどうも気が進まない。このままでは私の記事管理計画は破たんしてしまう。どうしたものかと考えました。

 

システム化してみよう

 

この辺からプログラム寄りの話になります。ご注意ください。

 

はてなブログAtomPubってご存知ですか?

 

はてなブログAtomPub - Hatena Developer Center

 

詳しくは公式サイトを見ていただければわかりますが、「はてなID」と「ブログID」、それと「APIキー」を利用してアクセスすることでブログの情報を取得することができる仕組みです。

 

URLにそれぞれを指定してアクセスするのでもちろん今お使いのWEBブラウザからも利用することが可能です。

 

https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry

 

URLの指定形式は上記のようになります。

 

ただし、ブラウザからURLにアクセスすると認証情報の入力を求められます。Basic認証が使われており、ユーザ名にははてなIDを、パスワードにはAPIキーを指定することでブログの情報を取得することができます。

 

これだ!これを上手く使えば記事管理を自動化できる!

 

システム化完了

 

そこそこ時間はかかりましたが自動化に成功。本当は皆さんにも使っていただけるよう、JavaScriptだけでなんとかしたかったのですが、技術的に難しそうだったので他の言語を利用しました。XMLパース処理はPHPで行っています。

 

f:id:tsubasa123:20161204152801j:plain

 

こんな感じでブラウザからシステムにアクセスすると記事の一覧が見れるようになっています。表示項目は月無ことのはさんのスプレッドシートを参考にしました。投稿日も取得できたから表示してみたけどいらんかったかな。

 

右上のプルダウンからカテゴリごとのフィルタリングができるようになっています。チェックボックスで複数指定できるほうが便利かとも思いましたが時間かかるので見送りこれで完成としました。

 

満足しました。これで記事管理が楽になりそうです。

 

はてなブロガーでPHPerの人とかかなり少なそうですが、せっかくなのでソースコードは貼っておきます。大したものではありませんが、何か作業される際の参考になれれば幸いです。

 

<?php

class Parser {

    private $user = 'ここにID';
    private $password = 'ここにAPIキー';
    private $entries = array();

    public function __construct() {}

    public function parseXML($url) {
        $url = $this->formatURL($url);
        $xml = file_get_contents($url);
        $xml = simplexml_load_string($xml);
        $xml = json_decode(json_encode($xml), true);

        foreach ($xml['entry'] as $k => $v) {
            $this->entries[] = array(
                'title' => $v['title'],
                'url' => $v['link'][1]['@attributes']['href'],
                'published' => date('Y-n-d', strtotime($v['published'])),
                'updated' => date('Y-n-d H:i:s', strtotime($v['updated'])),
                'category' => $v['category']['@attributes']['term'],
            );
        }

        if (count($xml['link']) > 2) {
            $this->parseXML($xml['link'][1]['@attributes']['href']);
        }
    }

    private function formatURL($url) {
            return str_replace(
                'https://',
                'https://' . $this->user . ':' . $this->password . '@',
                $url
            );
    }

    public function getEntries() {
        return $this->entries;
    }

}

// https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry
$url = 'ここにURL';

$parser = new Parser();
$parser->parseXML($url);
//var_dump($parser->getEntries());

 

また、1000記事を超えるような大規模なブログでの動作は検証しておりません。自己責任のもと、用法・用量を守って正しくお使いください。はてな運営に怒られても知らないよ。

 

導入するにはWEBサーバを用意したりと、ちょっとした手間と知識、もしくはお金が必要になりますが興味のある方は試してみてください。簡単な質問にはお答えしますのでお気軽にどうぞ。

 

さいごに

 

記事の下に関連記事を表示するって重要だから記事管理しなきゃ!ってのが目的だったのにまたもや脱線してカスタマイズよりのことに夢中になってしまいました。反省反省。

 

とはいえ、今後記事をしっかり管理する体制が整ったと思えば悪いことじゃないですね、1つ記事(この記事)も書けましたし。

 

ではでは、最後までお付き合いいただきありがとうございました。