日記 2010年04月18日 16:49
日記補完方法  

参考になるかわかりませんが、
ウチがやった日記補完の方法をメモしときます。

日記が見えるのはおそらく世界の終わりまでなので、
実施する方はそれまでに〜


※必要なもの
エクセル
ビジュアルC++
正規表現を使えるテキストエディタ(ウチはsakura editor)
ダウンロードソフト(ウチはiria)
&これらのソフトを使えるスキル



コメント

2010年04月18日 16:49 魔界公爵アスタロト  

1.ユーザIDを知る
まず、日記を残したい人のユーザIDを知らなければ始まりません。

マイページから、その人の名前にカーソルをあて、
表示されるアドレスからユーザIDを推測します。
このとき、クラブIDやその他のIDと間違えないように注意してください。

ウチの場合だと、54239 になります。


2010年04月18日 16:50 魔界公爵アスタロト  

2.日記リストの作成
ある日付に書いた日記は下記のようなURLにて取得できます。

http://www.sakatsuku-online.com/SakaTsukuOnline/diaries.do?month=4&day=8&year=2010&userId=54239

この場合
userIdが先ほどのユーザID
year,month,dayはサスガに説明不要ですよね?

これを元に、取得したい期間すべての日付に対してのURLリストを作成してダウンロードソフトに掛けます。
ウチはiriaなので下のようなリストが約1000件分できます。
(注:サーバが貧弱なのでダウンロードに時間がかかります)

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/diaries.do?userId=54239&year=2007&month=4&day=25
Folder=E:\diary\54239
SaveAs=d54239_20070425.html
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/diaries.do?userId=54239&year=2007&month=4&day=26
Folder=E:\diary\54239
SaveAs=d54239_20070426.html
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/diaries.do?userId=54239&year=2007&month=4&day=27
Folder=E:\diary\54239
SaveAs=d54239_20070427.html
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/diaries.do?userId=54239&year=2007&month=4&day=28
Folder=E:\diary\54239
SaveAs=d54239_20070428.html
ID=0


このリストを元に、ファイルをダウンロードします

2010年04月18日 16:51 魔界公爵アスタロト  

3.日記のダウンロード(1ページ目)
先ほどダウンロードした日記リストから日記のURLのみを抽出します。
(grepなど正規表現によるまとめ作業が出来ないときついですよ)

日記リストは日付ごとに取得されていますが、
その日に日記を書いていた場合は、取得したファイル内に


→続きを見る


という文章が入ります。
なので、DLしたすべてのファイルからその文章がある行だけを抽出します。

E:\diary\54239\d54239_20070517.html(961,169) [SJIS]: <td colspan="2" align="RIGHT" class="j12_150"><a href="/SakaTsukuOnline/diary.do"../spacer.gif" height="8" width="1">
2010年04月18日 16:51 魔界公爵アスタロト  

4.コメントが多いページの取得
日記のコメントは20件までしか同時に表示されません。
上でダウンロードしたファイルは1ページ目しかないので、
20件以上コメントをもらってる場合はそのぶんが抜けてしまいます。
(我こそはコメント少ないゼっ! って人は不要)


20件以上コメントがあると、

25件中 1-20件目 [1 2] 次へ

といった、項目がつきます。
この部分を抽出するし、再びダウンロードソフトにかけます

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/diary.do?page=1&diaryId=63316
Folder=E:\diary\54239\diary
SaveAs=d063316_2.html
ID=0


2010年04月18日 16:51 魔界公爵アスタロト  

5.画像の取得(本文)
日記に画像を貼り付けると、そのURLは

http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board/15539.jpg

という風になります。
数字の部分が日記IDです。

なので、日記から、
/user_board/
がある部分のみを抽出してダウンロードします。

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board/15539.jpg
Folder=E:\diary\54239\diary
SaveAs=e015539.jpg
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board/34806.jpg
Folder=E:\diary\54239\diary
SaveAs=e034806.jpg
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board/73888.jpg
Folder=E:\diary\54239\diary
SaveAs=e073888.jpg
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board/74487.jpg
Folder=E:\diary\54239\diary
SaveAs=e074487.jpg
ID=0

2010年04月18日 16:51 魔界公爵アスタロト  

6.画像の取得(コメント)
コメントに画像を貼り付けると、そのURLは

http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board_comment/60583.jpg

という風になります。
数字の部分が日記IDです。

なので、日記から、
/user_board_comment/
がある部分のみを抽出してダウンロードします。

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board_comment/60583.jpg
Folder=E:\diary\54239\diary
SaveAs=f060583.jpg
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board_comment/65798.jpg
Folder=E:\diary\54239\diary
SaveAs=f065798.jpg
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board_comment/65799.jpg
Folder=E:\diary\54239\diary
SaveAs=f065799.jpg
ID=0

Url=http://www.sakatsuku-online.com/SakaTsukuOnline/image/user_board_comment/105501.jpg
Folder=E:\diary\54239\diary
SaveAs=f105501.jpg
ID=0

2010年04月18日 16:52 魔界公爵アスタロト  

7.日記の整形&トップページ作成
以上で必要なファイルのダウンロードは終了です。
しかしこのままだとURLが変わっているので、
そのままではまともに表示することは出来ません。
なので日記を加工します。

ここは色々面倒なので、プログラムの出番です。

やることは、
a)日記部分のみの抽出(いらないヘッダーなどを削除)
b)参照するURLから要らない部分を削除(セッションIDなど)
c)画像のURLを変更(例 /SakaTsukuOnline/images/icon9.gif → ../icon9.gif)
d)日付とタイトルの取得(トップページ用)


参考にウチの作ったプログラムのソースを貼っときます。
突貫工事で何も考えてないですが、とりあえず動作はします。

2010年04月18日 16:52 魔界公爵アスタロト  

8.終了
これで大体の作業は終了です。
一覧も年月毎に分けようかなとも思ったのですが、
面倒だったのでやめました。

まーあと数日ですが、やりたい人はがんばってください。



2010年04月18日 16:53 魔界公爵アスタロト  

void transformDiary(CString inFolder,CString outFolder)
{
CString Name,Str;
CString tTitle,tDate;
CStdioFile hListFile((LPCTSTR)(inFolder + CString("list.txt")),CFile::modeRead);
CStdioFile hDateFile((LPCTSTR)(outFolder + CString("index.html")),(CFile::modeCreate)|(CFile::modeWrite));
CStdioFile *pSrcFile,*pDstFile;
long i,j,k,n,m,o;
bool IsTag;
char Buf1[300000],Buf2[100000],Buf3[100000],Buf4[100000];
char txBuf[300];
BYTE Xp=0x0a,Xq=0x09;

hDateFile.WriteString("<HTML><HEAD>");
hDateFile.WriteString("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"../base.css\" TITLE=\"StyleSheet\">");
hDateFile.WriteString("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"../navi_player.css\" TITLE=\"StyleSheet\">");
hDateFile.WriteString("</HEAD><BODY>");

2010年04月18日 16:53 魔界公爵アスタロト  

while(hListFile.ReadString(Name)){
cout << (LPCTSTR)Name << endl;
pSrcFile=new CStdioFile((LPCTSTR)(inFolder+Name),CFile::modeRead);
if(pSrcFile){
pDstFile=new CStdioFile((LPCTSTR)(outFolder+Name),(CFile::modeCreate)|(CFile::modeWrite));
if(pDstFile){
pDstFile->WriteString("<HTML><HEAD>");
pDstFile->WriteString("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"../base.css\" TITLE=\"StyleSheet\">");
pDstFile->WriteString("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"../navi_player.css\" TITLE=\"StyleSheet\">");
pDstFile->WriteString("</HEAD><BODY>");

n=pSrcFile->Read(Buf1,300000);

2010年04月18日 16:53 魔界公爵アスタロト  

m=0;
IsTag=false;
for(i=0;i<n;i++){
if( (*((DWORD *)(Buf1+i+ 0))==0x61743c0a)
&& (*((DWORD *)(Buf1+i+ 4))==0x20656c62)
&& (*((DWORD *)(Buf1+i+ 8))==0x74646977)
&& (*((DWORD *)(Buf1+i+12))==0x35223d68)
&& (*((DWORD *)(Buf1+i+16))==0x20223235)){
IsTag=true;
}
if( (*((DWORD *)(Buf1+i+ 0))==0x726f663c)
&& (*((DWORD *)(Buf1+i+ 4))==0x616e206d)
&& (*((DWORD *)(Buf1+i+ 8))==0x223d656d)
&& (*((DWORD *)(Buf1+i+12))==0x74736f70)){
IsTag=false;
}
if(IsTag){
Buf2[m]=Buf1[i];
m++;
}
}
o=0;
IsTag=true;
for(i=0;i<m;i++){
if( (*((DWORD *)(Buf2+i+ 0))==0x65736a3b)
&& (*((DWORD *)(Buf2+i+ 4))==0x6f697373)
&& (*((DWORD *)(Buf2+i+ 8))==0x3d64696e)){
IsTag=false;
}
if(Buf2[i]=='\"'){
IsTag=true;
}
if(IsTag){
Buf3[o]=Buf2[i];
o++;
}
}

2010年04月18日 16:54 魔界公爵アスタロト  

k=0;
IsTag=true;
for(i=0;i<o;i++){
if( (*((DWORD *)(Buf3+i+ 0))==0x61532F22)
&& (*((DWORD *)(Buf3+i+ 4))==0x7354616B)
&& (*((DWORD *)(Buf3+i+ 8))==0x4F756B75)
&& (*((DWORD *)(Buf3+i+12))==0x6E696C6E)
&& (*((DWORD *)(Buf3+i+16))==0x6D692F65)
&& (*((DWORD *)(Buf3+i+20))==0x73656761)){
Buf4[k+0]='\"';
Buf4[k+1]='.';
Buf4[k+2]='.';
i+=24;
k+=3;
}

2010年04月18日 16:54 魔界公爵アスタロト  

if( (*((DWORD *)(Buf3+i+ 0))==0x61532F22)
&& (*((DWORD *)(Buf3+i+ 4))==0x7354616B)
&& (*((DWORD *)(Buf3+i+ 8))==0x4F756B75)
&& (*((DWORD *)(Buf3+i+12))==0x6E696C6E)
&& (*((DWORD *)(Buf3+i+16))==0x6D692F65)
&& (*((DWORD *)(Buf3+i+20))==0x2f656761)){

if( Buf3[i+34] == '/'){
Buf4[k+0]='\"';
Buf4[k+1]='e';
i+=34;
k+=2;
}else{
Buf4[k+0]='\"';
Buf4[k+1]='f';
i+=42;
k+=2;
}
if( Buf3[i+6] == '/'){
Buf4[k]='0';
k++;
}
IsTag=false;

}
if( (*((DWORD *)(Buf3+i+ 0))==0x7474612F)
&& (*((DWORD *)(Buf3+i+ 4))==0x6D686361)
&& (*((DWORD *)(Buf3+i+ 8))==0x49746E65)
&& (*((DWORD *)(Buf3+i+12))==0x6567616D)){
i+=15;
IsTag=false;
}
if(IsTag){
Buf4[k]=Buf3[i];
k++;
}
IsTag=true;
}

2010年04月18日 16:54 魔界公爵アスタロト  

n=0;
for(i=0;i<k;i++){
if(Buf4[i] =='>'){
n++;
if(n == 10){
ZeroMemory(txBuf,300);
for(j=0;j<100;j++){
if(Buf4[i+j+1] =='<')break;
txBuf[j]=Buf4[i+j+1];
}
tDate=CString(txBuf);
}
if(n == 18){
ZeroMemory(txBuf,300);
for(j=0;j<100;j++){
if(Buf4[i+j+1] =='<')break;
txBuf[j]=Buf4[i+j+1];
}
tTitle=CString(txBuf);
}
}
}
pDstFile->Write(Buf4,k);

pDstFile->WriteString("</BODY>");
}

2010年04月18日 16:55 魔界公爵アスタロト  

pDstFile->Close();
pDstFile=NULL;

hDateFile.WriteString(CString("<a href=\""));
hDateFile.WriteString(Name);
hDateFile.WriteString(CString("\">"));
hDateFile.WriteString(tDate);
hDateFile.WriteString(CString(" → "));
hDateFile.WriteString(tTitle);
hDateFile.WriteString(CString("</a><br>\n"));

}
pSrcFile->Close();
pSrcFile=NULL;
}
hDateFile.WriteString("</BODY></HTML>");

hListFile.Close();
hDateFile.Close();
}

2010年04月18日 16:57 魔界公爵アスタロト  

今気づいたけど newで取ったインスタンスdeleteし忘れてるorz

2010年04月19日 17:58 pixy10  

すいません

日本語で最初からお願いできますか?w

2010年04月19日 19:38 魔界公爵アスタロト  

>Pさん

あんたのはもう残ってるからいいでしょ!w


「梱包済み」ってリンク押したら、
zipに圧縮したのがあるよ

2010年04月19日 21:06 海堂 子龍  

本当に・・ありがとでした

何だかお世話だけなってしまって

こう何も返せないのが心残りです。。。