Yahoo! API を使って「漢字仮名交じり文」を「ひらがな」に変換するの続きです。
はてなブログの記事は、ダッシュボード > 設定 > 詳細設定 > エクスポート で MT形式のテキストファイルに書き出せます。これは一度エクスポートするとそのデータが保存されて、エクスポートしなおすまでそのままなんですね。
ただ、作成日時がそのページを開いた日になるのですが、これはどういうことでしょう?
それはともかく作業を続けましょう。
MT形式は次のような書式で出力されます。
- BASENAME は ブログurl+’/entry/’+BASENAME という形式でページの url になります
- ‘——–‘ が記事の区切り文字です
AUTHOR: CONVERT BREAKS: IMAGE: ----- <p></p> ----- <p></p> ----- --------
01各記事のタイトル他をふりがな付きで配列に格納する
次の個別の特殊ケースがありますので、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 への書き出しです。