このサイトにおいて、プライベートメッセージにはエクスポート機能がありますが、日記のエクスポート機能は無さそうです。
そこで、自分が書いた日記のデータをまとめて取得するプログラムを書いてみました。
今回のプログラムの取得対象は以下です。
- 各記事の投稿日時
- 各記事のタイトル
- 各記事の日記本体のソースコード(BBCode)
- 各記事の添付ファイルの情報
- 添付ファイル名
- 記事中の添付ファイル番号
- 添付ファイルのコメント
- 添付ファイルのデータ本体
今回のプログラムでは、例えば以下は取得対象にしていません。
- 各記事のカテゴリー
- 各記事のレンダリング結果(HTML)
- 各記事に付けられたコメント
- 各記事における投票
- 添付ファイルID (URLに含まれる番号)
今回の実装ではデータの取得にwgetを用いるので、「wget」コマンドを利用可能な状態の環境(パスが通っているなど)が必要です。
また、今回の実装ではPerlを用いたので、Perlの実行環境が必要です。
利用するには、まずフォーラムにログインし、「User-Agent」「phpbb3_o08ji_sid」「出力を捨てるのに用いるファイル」を設定します。
「User-Agent」は、利用しているブラウザを表す文字列で、例えば
確認くんの「現在のブラウザー」(表示サイズを除く)で得られます。
「phpbb3_o08ji_sid」はwgetにログイン状態を引き継ぐためのデータです。
日記の編集機能を用いてBBCodeを取得するため、ブラウザからwgetにログイン状態を引き継ぐことが必要です。
例えばFirefoxの場合は、フォーラムの画面を右クリックして「ページの情報を選択」を選び、「セキュリティ」タブの「Cookieを表示」を押し、
「Cookie 名」が「phpbb3_o08ji_sid」となっている行を選択し、「内容」を見ることで得られます。
「出力を捨てるのに用いるファイル」は、/dev/nullのような書き込みを無視してくれるファイル(デバイス)を指定します。
「phpbb3_o08ji_sid」はソースコードまたはコマンドラインで設定し、他の2項目はソースコードで設定します。
設定を行った後プログラムを実行すると、以下のデータがカレントディレクトリに保存されます。 (ファイル/ディレクトリ名はデフォルトのもの)
articles.csv : 記事の情報
articlesディレクトリ : 各記事のデータ (ファイル名:記事ID.txt)
attachments.csv : 添付ファイルの情報
attachmentsディレクトリ : 添付ファイル本体のデータ
これがプログラムです。
► スポイラーを表示
CODE:
#!/usr/bin/perl
use strict;
use warnings;
# 取得に用いるUser-Agent
my $user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0";
# 取得に用いるCookieのphpbb3_o08ji_sid (空文字列→コマンドラインで指定)
my $sid = "";
# 出力を捨てるのに用いるファイル(Windows→NUL Linux,OS X→/dev/null)
my $nullfile = "NUL";
# 記事一覧を保存するファイル名
my $article_index_file = "articles.csv";
# 添付ファイル一覧を保存するファイル名
my $attach_index_file = "attachments.csv";
# 各記事のデータを保存するディレクトリ名
my $article_dir = "articles";
# 添付ファイルのデータを保存するディレクトリ名
my $attach_dir = "attachments";
if ($sid eq "" && @ARGV >= 1) { $sid = $ARGV[0]; }
# 記事一覧のデータを取得する
my $index_data = &get_page("index.php");
my @data = ();
$index_data =~ s/.*?&b=(\d+)">(.*?) \((\d+)\).*?;(\d+)年(\d+)月(\d+)日\(.*?\) (\d+):(\d+)/push(@data, "$4\t$5\t$6\t$7\t$8\t$1\t$3\t$2")/seg;
# 記事一覧のデータを保存する
open(INDEX, "> $article_index_file") or die("$article_index_file open failed\n");
binmode(INDEX);
print INDEX "投稿日時,記事ID,記事タイトル,コメント数\r\n";
for (my $i = 0; $i $attach_index_file") or die("$attach_index_file open failed\n");
binmode(FILEINDEX);
print FILEINDEX "対象記事ID,添付ファイル番号,添付ファイル名,コメント,保存ファイル名\r\n";
for (my $i = 0; $i (.*?)/s) {
my $article_src = $1;
open(ARTICLE, "> $article_dir/$article_id.txt") or die("$article_dir/$article_id.txt open failed\n");
binmode(ARTICLE);
print ARTICLE &html_decode($article_src);
close(ARTICLE);
}
# 添付ファイルを取得
my @current_attach = ();
$article_data =~ s/(.*?).*?(.*?)/push(@current_attach, "$1\t$3\t$4\t$2")/seg;
for (my $j = 0; $j $attach_dir/$save_file") or die("$attach_dir/$save_file open failed\n");
binmode(ATTACH);
print ATTACH $file_data;
close(ATTACH);
}
# サーバーへの負荷を申し訳程度減らす
warn sprintf("%d / %d fetched\n", $i + 1, @data + 0);
sleep 1;
}
close(FILEINDEX);
sub get_page {
my ($page) = @_;
my $WGET;
my $res = "";
open($WGET, "wget -O - -U \"$user_agent\" " .
($sid ne "" ? "--header=\"Cookie: phpbb3_o08ji_sid=$sid\" " : "") .
"\"http://dixq.net/forum/$page\" 2> \"$nullfile\" |") or die("wget $page failed\n");
while () { $res .= $_; }
close($WGET);
return $res;
}
sub html_decode {
my ($data) = @_;
$data =~ s/"/"/g;
$data =~ s/ / /g;
$data =~ s/<//g;
$data =~ s/&#(\d+);/chr($1)/eg;
$data =~ s/&/&/g;
return $data;
}
sub csv_encode {
my ($data) = @_;
my $need_quot = ($data =~ /[",\r\n]/);
$data =~ s/"/""/g;
if ($need_quot) { $data = "\"$data\""; }
return $data;
}
★免責事項★
- このプログラムは無保証です。使用したい場合は自己責任でお使いください。
- このプログラムは現状のフォーラムをターゲットに作られています。フォーラムのアップデート後もうまく動作するかはわかりません。
- このプログラムはサーバーなどへの攻撃を目的とするものではありません。
[hr]
取得したデータを用いて、自分のこれまでの日記の月ごとの投稿数をまとめてみました。
- 自分の月ごとの日記投稿数
- nikki-count-201802.png (19.28 KiB) 閲覧数: 1104 回
このフォーラムができてから約4年はわりと日記を書いていますが、その後は日記の投稿数が少ないことが読み取れます。