Phase.6 過去ログも巡回する(『スタパライフ』 Ver 1.11)

 Chapter.23 巡回エージェントへページの遡り機能を追加する

 ずいぶん遅くなってしまいましたが、過去のログも遡って検索する機能を追加します。本来は、一番最初からできるようにすべきなのでしょうが……まあ、そういう話は置いておいて。実装方法を解説します。全てのソースを参照する場合はこちらをご覧下さい。


 ・初期読み込みページの設定(main)

 302:        strcpy(NEXTPAGE,loc.path);

 ページのループを制御するためのNEXTPAGEという変数を追加しました。これは、autostpl内のどこからでも参照できます。一番最初に読み込むページとして、最新の目次ページのURLをまず転記しています。


 ・次回ループの発生の制御(getmessages)

 243:    if(count = checkmessages(inet,host,buf)) {
 244:        if(strlen(NEXTPAGE)>0) result = offset + count;
 245:        else result = 0;
 246:    }

 ここはもともと、tcup内では『次のページ』というinputタグの有無で戻り値を設定していた部分です。次回ループで読み込むべきアドレスはcheckmessagesで目次ページ解析の前に検索するようにしますので、ここではNEXTPAGEに有効な長さの文字列があるかどうかでループ中断か続行か判断させています。


 ・前ページのアドレスの取得(checkmessages)

 186://前ページのアドレス取得
 187:    strcpy(NEXTPAGE,"");
 188:    if ((ea->items[11].tag=="A") &&
 189:        (page_element_text(page,&ea->items[11])=="前の20件"))
 190:        strcpy(NEXTPAGE,dirpath);
 191:        strcpy(NEXTPAGE+strlen(NEXTPAGE),page_element_att(page,&ea->items[11],"href"));

 次のページのアドレスの取得です。目次ページを遡りつつ、『前の20件』というリンクの場所を確かめていくと、ページ上部の固定の位置に書かれていることがわかりました。そこで単純に、その場所にあるアンカータグからURLを取り出してNEXTPAGEに転記しています。もちろん、アンカータグが無ければ、hrefからそのオプションの内容を取り出すこともできませんので、その場合はNEXTPAGEが空白になってループは終了することになります。


 ・画像無しのメッセージの取得(checknewmessage)

 126://log 11以前の形式
 127:                else if((ea->items[index].tag=="TR") &&
 128:                    (ea->items[index+1].tag=="TD") &&
 129:                    (ea->items[index+2].tag=="") &&
 130:                    (ea->items[index+3].tag=="TD") &&
 131:                    (ea->items[index+4].tag=="") &&
 132:                    (ea->items[index+5].tag=="TR") &&
 133:                    (ea->items[index+6].tag=="TD") &&
 134:                    (ea->items[index+7].tag=="P") &&
 135:                    (ea->items[index+8].tag=="") &&
 136:                    (ea->items[index+9].tag=="BR") ){
 137://ログの追記
 138:                    count=storemessage(
 139:                        log_no,
 140:                        page_element_text(page,&ea->items[index+4]),
 141:                        page_element_text(page,&ea->items[index+2]),
 142:                        "",
 143:                        page_element_text(page,&ea->items[index+6]));
 144:                    result=1;
 145:                    break;
 146:                }

 過去のページを遡ってログを取得していくと、11番以前のログが取得できないことに気付きました。調べてみると、最新のスタパライフとは違い、初期にはデジカメ画像が無い時もあったようです。これに対応するため、画像無しの書式でのマッチングも追加しました。


 以上のバージョンアップで、スタパライフの全てのログを巡回・保存できるようになりました。画像を含めたログを見ることもできますし、『スタパライフ』エージェントとして企画した全ての処理が実装できたことになります。オルトアールには、スタパライフと同様の形式の読み物もありますので、今まで作ってきたものを流用すれば、大きな手間をかけずとも巡回エージェントが書けそうです。それは今後の課題といたしましょう。