【Lifehacks】mixi日記エントリのリスト化

■概要
mixi日記エントリの一覧データを生成する。

■目的
過去に書いた日記は、日記機能ページの左端にあるインデックスから一覧表示できるが、以下の点で不便である。

・時系列一覧となる。
・1ヶ月単位でしか一覧できない。
・画像(標準機能の場合)と冒頭3行が表示されるため、一覧性が低い。
→冒頭3行は記入時の改行を無視するため、ヘッダとしては見づらい。

そこで、以下の仕様で一覧できるデータを作成することにした。

・カテゴリ別に分類。
→タイトルに埋め込んだ分類タグを大分類とする。
小分類は手動で並び替え。
・任意の期間分の一覧を作成する。
・1エントリ2行。1行目はタイトル、2行目はURLとする。

■実装
Windows NT拡張バッチスクリプトPerl言語を使用。
・要ActivePerl。
・入力データとして、以下の2ファイルが必要。
- diary_index.html
backup_mixiの日記エントリインデックスファイル。
- ClassLst.txt
→日記エントリ大分類キーワードファイル。

■課題
・小分類の自動ソート。
→エントリ記入時、冒頭に埋め込んでおけば、解析可能。
・行数の圧縮。
→プレミアム契約すればURL表示ではなくリンクにでき、1エントリ1行となる。
実体参照記述(&xxx;)の自動変換。
→現状は手抜き実装のため手動変換。
backup_mixiへの非依存化。
Perlmixiアクセスライブラリ利用等。
※10/01 mixi GUI変更に伴い、backup_mixiは現在使用不可。
・インデックス用領域の自動確保と自動アップロード。
→現状は手動確保、手動書き込み。分類が増えたら面倒。

スクリプト
−−−− SgCnvDiaryIdx2Lst.bat −−−−

:
: SgCnvDiaryIdx2Lst.bat
: backup_mixiのdiary_index.htmlから日記エントリ一覧に変換。
:
: Author: Orihika Ikuo
: Create: 2007.10.01
: Update: 2007.XX.XX
:
: Note:
: ・DIARYINDEXにはbackup_mixiの生成する日記一覧ファイルを指定。
: ・まず、DIARYENTLSTに指定したファイルにすべてのエントリ情報を出力。
: ・次に、CLASSLSTファイルに指定した分類毎にファイルを出力。
:

set DIARYINDEX=diary_index.html
set DIARYENTLST=diary_ent_lst.csv
set CLASSLST=ClassLst.txt
set PREFIX01=ListOf
set PREFIX02=Fmt

del %DIARYENTLST%
perl SgCnvDiaryIdx2Lst.pl < %DIARYINDEX% > %DIARYENTLST%

for /F %%i in (%CLASSLST%) do (
  find "%%i" %DIARYENTLST% > %PREFIX01%%%i.txt
)

for /F %%i in (%CLASSLST%) do (
  perl SgFmtDiaryEntLst.pl < %PREFIX01%%%i.txt > %PREFIX02%%%i.txt
)

−−−− SgCnvDiaryIdx2Lst.pl −−−−

#
# SgCnvDiaryIdx2Lst.pl
# backup_mixiのdiary_index.htmlから日記エントリ一覧に変換。
#
# Author: Orihika Ikuo
# Create: 2007.10.01
# Update: 2007.XX.XX
#

#### Main routine ##########################################################
&SgCnvDiaryIdx2Lst;

#### Sub routine ###########################################################
sub SgCnvDiaryIdx2Lst {
  local($year)                         = "";
  local($month)                        = "";
  local($day)                          = "";
  local($hour)                         = "";
  local($sec)                          = "";
  local($class)                        = "";
  local($line)                         = "";               # Read line
  local($title)                        = "";               # Title
  local($ent_id)                       = "";               # Dntry id

  while ($line = <STDIN>) {
    chop($line);

    if ($line =~ m/.*>(\d\d\d\d)(\d*)月<.*/) {
      $year   = $1;
    } elsif ($line =~ m/.*(\d\d)(\d\d)(\d\d):(\d\d).*href=\'diary.(\d*).html\'>【(.*)(.*)<.a>/) {
      $month  = $1;
      $day    = $2;
      $hour   = $3;
      $sec    = $4;
      $ent_id = $5;
      $class  = $6;
      $title  = $7;

      print "$year,$month,$day,$hour,$sec,$ent_id,$class,$title\n";
    } else {
    }
  }
}

−−−− SgFmtDiaryEntLst.pl −−−−

#
# SgFmtDiaryEntLst.pl
# 日記エントリ一覧をフォーマットする。
#
# Author: Orihika Ikuo
# Create: 2007.10.01
# Update: 2007.XX.XX
#

#### Constant & Global ####################################################
$url_main                              = "http://mixi.jp/view_diary.pl";
$var_id                                = "id=";
$var_owner_id                          = "owner_id=";
$sep01                                 = "?";
$sep02                                 = "&";
$val_owner_id                          = "327817";
$paren01                               = "(";
$paren02                               = ")";
$paren11                               = "【";
$paren12                               = "】";

#### Main routine ##########################################################
&SgFmtDiaryEntLst;

#### Sub routine ###########################################################
sub SgFmtDiaryEntLst {
  local($year)                         = "";
  local($month)                        = "";
  local($day)                          = "";
  local($hour)                         = "";
  local($sec)                          = "";
  local($class)                        = "";
  local($line)                         = "";               # Read line
  local($title)                        = "";               # Title
  local($ent_id)                       = "";               # Entry id

  while ($line = <STDIN>) {
    chop($line);

    if ($line eq "") {
      next;
    } elsif ( $line =~ m/^----.*/) {
      next;
    } else {
      ($year, $month, $day, $hour, $sec, $ent_id, $class, $title) = split(/,/, $line);
      print $paren11, $class, $paren12;
      print $title, "\n";
      print $paren01;
      print $url_main, $sep01, $var_id, $ent_id, $sep02;
      print $var_owner_id, $val_owner_id;
      print $paren02, "\n";
    }
  }
}

−−−− ClassLst.txt −−−−

Book
Tool
Item
Memo
Lifehacks