『スタパライフ』エージェント Ver1.22 autostpl.r


   0:#include <awlib.h>
   1:#include "download.h"
   2:
   3:char TGTFILE[260];
   4:int COLLECTIONIMAGE;
   5:#define BUFSIZEUNIT 8192
   6:#define BUFFER_SIZE 64*1024
   7:char NEXTPAGE[128];
   8:
   9:typedef struct _STRBUF {
  10:   char *text;
  11:   int bsize;
  12:   int esize;
  13:} STRBUF;
  14:
  15:typedef struct _MSGBUF {
  16:   struct _MSGBUF *next;
  17:   char *msgtext;
  18:} MSGBUF;
  19:
  20:MSGBUF *MSGSTACK = NULL;
  21:
  22:int getmessagedate(struct tm *trec,char *datestr) {
  23:   char tmp[40];    
  24:
  25:    strcpy(tmp,datestr);
  26:   /* 01234567890123456789012345678901 */
  27:    /* 2000/12/10 20:20 */
  28:   tmp[4]='\0';
  29:   trec->tm_year=atoi(tmp);
  30:   tmp[7]='\0';
  31:   trec->tm_mon=atoi(tmp+5);
  32:   tmp[10]='\0';
  33:   trec->tm_mday=atoi(tmp+8);
  34:   tmp[13]='\0';
  35:   trec->tm_hour=atoi(tmp+11);
  36:   tmp[16]='\0';
  37:   trec->tm_min=atoi(tmp+14);
  38:   trec->tm_sec=0;
  39:   return 0;
  40:}
  41:
  42:int storemessage(char *idstr,char *subject,char *date,char *imgfile,char *text) {
  43:   MSGBUF *tmpmsg;
  44:   struct tm tmp;
  45:   char timestamp[128];
  46:   int result;
  47:   str tmptext;
  48:    
  49:   getmessagedate(&tmp,date);
  50:   strftime(timestamp,sizeof(timestamp),"%c",&tmp);
  51:   tmpmsg = (MSGBUF *)malloc(sizeof(MSGBUF));
  52:   tmptext = "From foo@bar " + timestamp + "\r\n";
  53:       tmptext = tmptext + "From: スタパ齋藤" + "\r\n";
  54:   tmptext = tmptext + "X-Number: " + idstr + "\r\n";
  55:   tmptext = tmptext + "Date: " + timestamp + "\r\n";
  56:   tmptext = tmptext + "Subject: " + subject + "\r\n";
  57:    if (strlen(imgfile)>0)
  58:       tmptext = tmptext + "X-ImageFile: " + imgfile + "\r\n";
  59:   tmptext = tmptext + "\r\n";
  60:   tmptext = tmptext + text;
  61:   tmptext = tmptext + "\r\n";
  62:   tmptext = tmptext + "\r\n";
  63:       
  64:   tmpmsg->msgtext = strcpy(malloc(strlen(tmptext)+1),tmptext);
  65:       
  66:   tmpmsg->next = MSGSTACK;
  67:   MSGSTACK = tmpmsg;
  68:   return result;
  69:}
  70:int checknewmessage(QDATA *qd,INET *inet,char *path,char *basepath,char *log_no) {
  71:   char idstr[128];
  72:   HTTP* http;
  73:   static char buffer[BUFFER_SIZE];
  74:   PAGE *page;
  75:   ELEMENTS *ea,*el;
  76:    int len,scan,index;
  77:    int result,count,img;
  78:   FILE* fp;
  79:   str temppath,imagefile;
  80:
  81:    strcpy(idstr,log_no);
  82:   if(qfind(qd,QFIND_NUMBER,atoi(idstr))==-1) {
  83:        // HTTP GET メソッドで / を取得する準備
  84:       http = http_open(inet, "GET", path, NULL, 0);
  85:       if (http != NULL) {
  86:           // HTTP のリクエストを実行(上の GET / )
  87:           len = http_request(http, NULL, 0, buffer, BUFFER_SIZE);
  88:               page=page_create(buffer,sizeof(buffer),PAGE_FLAG_AUTOCONVERT,0);
  89:           ea=page_elements(page);
  90:           el=page_find_elements(page,NULL,"TABLE");
  91:           for(scan=0;scancount;scan++) {
  92:               index=el->items[scan].number+1;
  93:                if(index+9>=ea->count) break;
  94://log 12以降の形式(画像あり)
  95:                if((ea->items[index].tag=="TR") &&
  96:                    (ea->items[index+1].tag=="TD") &&
  97:                    (ea->items[index+2].tag=="") &&
  98:                    (ea->items[index+3].tag=="TD") &&
  99:                    (ea->items[index+4].tag=="") &&
 100:                    (ea->items[index+5].tag=="TR") &&
 101:                    (ea->items[index+6].tag=="TD") &&
 102:                    (ea->items[index+7].tag=="P") &&
 103:                    (ea->items[index+8].tag=="BR") ){
 104://イメージファイルの保存
 105:                    imagefile="";
 106:                    if(COLLECTIONIMAGE){
 107:                       temppath = getenv("DATA_DIR")+"\\stpl";
 108:                        imagefile=page_element_att(page,&ea->items[index+9],"src");
 109:                       if(fp = fopen(temppath+"\\"+imagefile, "r")) {
 110:                           fclose(fp);
 111:                       }
 112:                       else{
 113:                            img=download(basepath+imagefile,temppath);
 114:                        }
 115:                    }
 116://ログの追記
 117:                   count=storemessage(
 118:                        log_no,
 119:                        page_element_text(page,&ea->items[index+4]),
 120:                        page_element_text(page,&ea->items[index+2]),
 121:                        imagefile,
 122:                        page_element_text(page,&ea->items[index+6]));
 123:                    result=1;
 124:                    break;
 125:                }
 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:                }
 147:
 148:            }
 149:           // HTTP をクローズ
 150:           page_free(page);
 151:           http_close(http);
 152:           // ステータス表示
 153:       }
 154:        else result=0;
 155:    }
 156:    else result=0;
 157:    return result;
 158:}
 159:
 160:int checkmessages(INET *inet,char *host,STRBUF *buf) {
 161:   QDATA *qd;
 162:
 163:   PAGE *page;
 164:   ELEMENTS *el;
 165:   ELEMENTS *ea;
 166:   int scan;
 167:   int index;
 168:   int result,count,sep;
 169:    char dirpath[128];
 170:
 171://メッセージのあるURLのパスを求める
 172:    sep=0;
 173:    while(strstr(NEXTPAGE+sep,"/")>0){
 174:        sep=strstr(NEXTPAGE+sep,"/")-NEXTPAGE+1;
 175:    }
 176:    strncpy(dirpath,NEXTPAGE,sep);
 177:    
 178://初期化処理
 179:   result=0;
 180:   qd=qopen(TGTFILE);
 181:
 182://ページ解析
 183:   page=page_create(buf->text,buf->esize,PAGE_FLAG_AUTOCONVERT,0);
 184:   ea=page_elements(page);
 185:
 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"));
 192:    
 193:   el=page_find_elements(page,NULL,"TABLE");
 194:
 195:   for(scan=0;scancount;scan++) {
 196:       index=el->items[scan].number+1;
 197:        if((index+5)>=ea->count) break;
 198:       if( (ea->items[index].tag=="TR")&&
 199:            (ea->items[index+1].tag=="TD")&&
 200:            (ea->items[index+2].tag=="FONT")&&
 201:            (ea->items[index+3].tag=="")&&
 202:            (ea->items[index+4].tag=="TD")&&
 203:            (ea->items[index+5].tag=="")){
 204:            count=checknewmessage(qd,inet,dirpath+page_element_att(page,&ea->items[index+7],"href"),
 205:                "http://"+host+dirpath,page_element_text(page,&ea->items[index+3]));
 206:            if(!count) break;
 207:           result += count;
 208:        }
 209:    }
 210:   page_free(page);
 211:   qclose(qd);
 212:   return result;
 213:}
 214:
 215:int getmessages(STRBUF *buf,INET *inet,char *host,int offset) {
 216:   HTTP *http;
 217:   int tmplen;
 218:   char tmp[80];
 219:   int result,count;
 220:
 221:    http=http_open(inet,"GET",NEXTPAGE,NULL,0);
 222:   if (http) {
 223:       buf->bsize+=BUFSIZEUNIT;
 224:       buf->text=realloc(buf->text,buf->bsize+1);
 225:       sprintf(tmp,"ダウンロード中... %d メッセージ (%d bytes)",offset,buf->esize);
 226:       setstatustext(tmp);
 227:       tmplen=http_request(http,NULL,0,buf->text+buf->esize,BUFSIZEUNIT+1);
 228:       buf->esize+=tmplen;
 229:       while(tmplen==BUFSIZEUNIT) {
 230:           buf->bsize+=BUFSIZEUNIT;
 231:           buf->text=realloc(buf->text,buf->bsize+1);
 232:           tmplen=http_read(http,buf->text+buf->esize,BUFSIZEUNIT+1);
 233:           buf->esize+=tmplen;
 234:           sprintf(tmp,"ダウンロード中... %d メッセージ (%d bytes)",offset,buf->esize);
 235:           setstatustext(tmp);
 236:       }
 237:       buf->text[buf->esize]='\0';
 238:       sprintf(tmp,"ダウンロード中... %d メッセージ (%d bytes)",offset,buf->esize);
 239:       setstatustext(tmp);
 240:       http_close(http);
 241:   }
 242:   result = 0;
 243:   if(count = checkmessages(inet,host,buf)) {
 244:       if(strlen(NEXTPAGE)>0) result = offset + count;
 245:       else result = 0;
 246:   }
 247:   if(buf->text) {
 248:       free(buf->text);
 249:       buf->esize = 0;
 250:       buf->bsize = 0;
 251:       buf->text = NULL;
 252:   }
 253:   return result;
 254:}
 255:
 256:int main(int,char **) {
 257:   FILE *out;
 258:   char filename[260];
 259:   QDATA *qd;
 260:   MSGBUF *tmp;
 261:   INET *inet;
 262:   STRBUF buffer;
 263:   LOCATION loc;
 264:   char stat[80];
 265:   int ofs,i;
 266:   char *scan;
 267:   
 268:   char url[1024],mbox[1024],basepath[1024],Browser[256];
 269:   LEGDATA *leg;
 270:   str path;
 271:    int autobrowseropen;
 272:    
 273:   path = getenv("DATA_DIR") + "\\stpl\\user.dat";
 274:   leg = leg_open(path, lmOpenRead);
 275:   if(leg) {
 276:       leg_readstring(leg, "/common/url", url, 1024, "");
 277:       leg_readstring(leg, "/common/mbox", mbox, 1024, "");
 278:       autobrowseropen=leg_readbool(leg, "/common/autobrowseropen", 0);
 279:       leg_readstring(leg, "/common/Browser",Browser,1024, "");
 280:       COLLECTIONIMAGE=leg_readbool(leg, "/common/CollectionImage", 0);
 281:    }
 282:    leg_close(leg);
 283:    strcpy(TGTFILE,getenv("DATA_DIR"));
 284:    strcpy(TGTFILE+strlen(TGTFILE),"\\");
 285:    strcpy(TGTFILE+strlen(TGTFILE),mbox);
 286:    memset(&loc,0,sizeof(LOCATION));
 287:   loc.size=sizeof(LOCATION);
 288:   decodeurl(&loc,url);
 289:
 290:    for (i=0;i<strlen(loc.path);i++){
 291:        if(strstr(url+i,"/")==0){
 292:            strncpy(basepath,loc.path,i);
 293:            break;
 294:        }
 295:    }
 296:   
 297:   inet=inet_open(NULL,loc.host,loc.port,INET_SERVICE_HTTP,NULL,NULL,0);
 298:   if(inet) {
 299:       memset(&buffer,0,sizeof(STRBUF));
 300:       ofs=0;
 301:       setstatustext("ダウンロード開始");
 302:        strcpy(NEXTPAGE,loc.path);
 303:        
 304:       do {
 305:           ofs = getmessages(&buffer,inet,loc.host,ofs);
 306:       } while(ofs && !terminated);
 307:   
 308:       ofs = 0;
 309:       if(MSGSTACK) {
 310:           strcpy(filename,TGTFILE);
 311:           scan=strrchr(filename,'.');
 312:           if(!scan) scan=strend(filename);
 313:           strcpy(scan,".g00");
 314:           out=fopen(filename,"a+");
 315:           while(MSGSTACK) {
 316:               ofs++;
 317:               fwrite(MSGSTACK->msgtext,1,strlen(MSGSTACK->msgtext),out);
 318:               tmp = MSGSTACK->next;
 319:               free(MSGSTACK->msgtext);
 320:               free(MSGSTACK);
 321:               MSGSTACK = tmp;
 322:           }
 323:           fclose(out);
 324:           qd=qopen(TGTFILE);
 325:           qupdate(qd);
 326:           qclose(qd);
 327:       }
 328:       sprintf(stat,"完了 (%d 件取得)",ofs);
 329:       setstatustext(stat);
 330:       inet_close(inet);
 331:
 332:        if((ofs>0)&&autobrowseropen){
 333:            spawnl(P_NOWAIT, Browser, Browser,"-H",url,"-T","スタパライフ",mbox,NULL);
 334:        }
 335:   }
 336:   return 0;
 337:}