情報の海の漂流者

web上をさまよいつつ気になったことをつぶやいています。

はてなダイアリーの総記事数を取得する方法

はてなダイアリーには日記をつけた日の合計を表示する機能はあっても、総記事数を表示する機能はない。
だから、総記事数を取得するにはイレギュラーな方法を使う必要がある。

archiveページ

はてなダイアリーのアーカイブページでは、一ページに50日分の記事へのリンクが表示される。
これは日付単位の表示で、一日に複数回更新する人の場合は1ページに51記事以上表示されてしまう。
だから、単純にarchiveが10ページだからこのブログには500の記事がある、というようなカウント方法は使えない。
一つ一つの記事数を数え上げる必要がある。
ちなみに機械的に数える場合はソース内に存在するarchive-sectionという文字列をカウントする方法を使うと楽だ。
はてなダイアリーのhtml構造を見ると、アーカイブページ内の個別記事へのリンクはarchive-sectionというクラスを使っている。

archive-sectionの出現回数は、ページ内の個別記事数とほぼ等しい。
ただし、はてなスターのjavascriptが読み込まれる環境では、ヘッダのスクリプト内にarchive-sectionが一回登場登場するのでマイナス1すること。
(後でよく考えたら [ archive-section]というように先頭に半角スペースを含む文字列で検索すればこの処理は必要がなくなる)

例 Google Chromeの場合は検索文字列のヒット数がデフォルトで表示される。


右クリック→ソースの確認→検索(CTRL+F)で、archive-section を検索し、その数字をマイナス1すればページ内の個別記事数が求められる。
これを、archive内の全ページで行い、合計すれば現在公開中の記事の総数を計算することができる。

↓10分で作った例外処理とか華麗にサボったphpスクリプト。これは公開されているサーバーでは実行しないほうが良い。

<?php
$test= get_total_posts_number("USER-ID");


function get_total_posts_number($user_id){
/*例外処理やセキュリティ対策は大幅にサボります。ローカルサーバー以外では使用しないでください*/
  $loop_counter=0; //ループ回数
  $sum_posts=0; //合計記事数
  $count_posts=-1; //ページ内のブログ記事数
  while ($count_posts !==0){
//はてなダイアリーのarchiveは1ページに50日分の記事タイトルが表示されます。
    $archive_page_number=$loop_counter*50; 
//archiveのurlの形式は http://d.hatena.ne.jp/[USER_ID]/archive?word=&of=[最新から何日目の記事から50件表示するかを数字指定] となっています。
    $url="http://d.hatena.ne.jp/".$user_id."/archive?word=&of=".$archive_page_number;
//archive ページの内容をphpで取得します。
    $archive=file_get_contents($url);
//本当はここで存在しないユーザーIDに対する対応等が必要
/* substr_countは指定した文字列が出現する回数を取得する関数です。
はてなダイアリーのarchiveページでは 個別記事への記事へのリンクには「archive-section」というクラスを使用しています。
これの出現回数をカウントするとページ内に含まれる個別記事数をカウントできます。
検索するときには「archive-section」という文字列の前に半角スペースを入れてください。
半角スペースを含んだキーワードで検索すれば、headerのjavascript内にある「"archive-section"」や、ユーザーCSS内の「.archive-section」を除外できます
*/
    $count_posts=substr_count($archive ," archive-section");
//1ページ分の処理が終わったので記事数を合計します。
    $sum_posts+=$count_posts;
//次の五十日分を取得するためにカウンターを一つ増やします
    $loop_counter++;
    }
/* そのダイアリーの全記事を取得し終わると、それ以降はcount_postsの数字がゼロになります。そうするとループは終了。
最後に総記事数を出力します*/
  echo $sum_posts;
}