はてなブログのタイトルにふりがなを振り、php 配列に格納する

はてなブログのタイトルにふりがなを振り、php 配列に格納する

Yahoo! API を使って「漢字仮名交じり文」を「ひらがな」に変換するの続きです。

はてなブログの記事は、ダッシュボード > 設定 > 詳細設定 > エクスポート で MT形式のテキストファイルに書き出せます。これは一度エクスポートするとそのデータが保存されて、エクスポートしなおすまでそのままなんですね。

ただ、作成日時がそのページを開いた日になるのですが、これはどういうことでしょう?

それはともかく作業を続けましょう。

はてなブログのテキスト出力

MT形式は次のような書式で出力されます。

  • BASENAME は ブログurl+’/entry/’+BASENAME という形式でページの url になります
  • ‘——–‘ が記事の区切り文字です
AUTHOR:
CONVERT BREAKS:
IMAGE:
----- 
<p></p>
----- 


<p></p>
----- 
--------

各記事のタイトル他をふりがな付きで配列に格納する

次の個別の特殊ケースがありますので、if 文で振り分けています。

  • カテゴリーが「映画」「DVD」のみ抽出
  • カテゴリーが「映画」でも、タイトルに「No.」を含むものは除く
  • 下書きは除く

なお、一回こっきりのコードですのでチェックやエラー処理は省略しています。

<?php


$file = fopen('エクスポートしたテキストファイル', 'r');


$api = 'http://jlp.yahooapis.jp/FuriganaService/V1/furigana';
$appid = '取得したアプリケーション ID';


$movies = array();
$movie = array();
$category = array();
// Subject、改行削除のためのパターン
$patterns1 = array('/TITLE: /', '/\r\n/', '/\r/', '/\n/');
$patterns2 = array('/BASENAME: /', '/\r\n/', '/\r/', '/\n/');


while ($line = fgets($file)) {
    if (strpos($line, 'TITLE:') !== FALSE) $title = $line;
    elseif (strpos($line, 'BASENAME:') !== FALSE) $url = $line;
    elseif (strpos($line, 'STATUS:') !== FALSE) $status = $line;
    elseif (strpos($line, 'CATEGORY:') !== FALSE) $category[] = $line;
    elseif (strpos($line, '--------') !== FALSE) {
        // 一記事の終わりに来たら
        if (strpos($title, 'No.') === FALSE && strpos($status, 'Publish') !== FALSE && (int)preg_grep('/映画|DVD/', $category) !== 0) {
            $title = preg_replace($patterns1, '', $title);
            // Yahoo! API へ「ルビ振り」のリクエスト
            $params = array( 'sentence' => $title );
            $ch = curl_init($api.'?'.http_build_query($params));
            curl_setopt_array($ch, array(
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_USERAGENT      => "Yahoo AppID: $appid"
            ));
            $result = curl_exec($ch);
            curl_close($ch);
            // 戻り値を解析しルビを文章に戻す
            $xml = simplexml_load_string($result);
            $ruby = '';
            foreach ($xml->Result->WordList as $WordList) {
                foreach ($WordList->Word as $Word) {
                    if (isset($Word->Furigana)) {
                        $ruby .= (string)$Word->Furigana;
                    } else {
                        $ruby .= (string)$Word->Surface;
                    }
                }
            }
            // 配列に格納する
            $movie['title'] = $title;
            $movie['ruby'] = $ruby;
            $movie['url'] = 'ブログurl/entry/' . preg_replace($patterns2, '', $url);
            $movies[] = $movie;
        }
        $category = array();
    }
}


// 一旦、配列をテキストファイルに保存する
file_put_contents('movies.txt', serialize($movies));

出力

array(448) {
  [0]=>
  array(3) {
    ["title"]=>
    string(19) "俳優 亀岡拓次"
    ["ruby"]=>
    string(34) "はいゆう かめおかたくじ"
    ["url"]=>
    string(54) "http://ausnichts.hatenablog.jp/entry/2016/02/08/204644"
  }
  [1]=>
  array(3) {
    ["title"]=>
    string(12) "最愛の子"
    ["ruby"]=>
    string(18) "さいあいのこ"
    ["url"]=>
    string(54) "http://ausnichts.hatenablog.jp/entry/2016/02/04/174715"
  }
  ・
  ・
・

結果は問題ないようです。448記事ありました。

一旦ファイルに書き出しているのは、次の五十音順に並べ替えたりするコードが出来ておらす、何度も Yahoo! API を呼び出すのを避けるためだけです。

ということで、次は五十音ソートと html への書き出しです。

はてなブログの記事の五十音順タイトル一覧を作るに続く。