/* * List up recently trackbacks * * Copyright (c) 2004 by H.Tsujimura (tsupo@na.rim.or.jp) * All Rights Reserved. * * written by H.Tsujimura 28 Feb 2004 * Last update: 02 Mar 2004 * * See Also: * http://www.na.rim.or.jp/~tsupo/program/ * http://watcher.moe-nifty.com/ */ /* * Usage: * listTB [-p] [-v] [-nNN] Target Blog's URL * -p: get html pages via proxy * -v: verbose mode * -n: number of trackbacks for listing * (default: 15 trackbacks) * ex) * listTB -n30 http://watcher.moe-nifty.com/memo/ * */ #include #include #include #ifdef WIN32 #include #else #include #endif struct trackbackInfo { char trackbackEntryURL[256]; /* トラックバック元URL */ char trackbackEntryTitle[256]; /* トラックバック元記事題名 */ char trackbackedURL[256]; /* 被トラックバックURL */ char trackbackedEntryTitle[256];/* 被トラックバック記事題名 */ #if 0 int yy; /* トラックバック受信 年 */ int mm; /* トラックバック受信 月 */ int dd; /* トラックバック受信 日 */ int HH; /* トラックバック受信 時 */ int MM; /* トラックバック受信 分 */ int SS; /* トラックバック受信 秒 */ #endif } *tbList = NULL; long numOfTbList = 0; long numOfTables = 0; long numOfDisplay = 15; char * httpGet( const char *url, int useProxy, int verbose ) { static char filename[128]; char cmd[BUFSIZ]; char *p, *q; p = strrchr( url, '.' ); q = strrchr( url, '/' ); if ( p && q && (q < p) ) { strncpy( filename, q + 1, p - url ); strcpy( &(filename[p - url]), "_tbChk.html" ); } else strcpy( filename, "tbChk.html" ); sprintf( cmd, "httpRead%s%s > %s", useProxy && verbose ? " -pv " : useProxy ? " -p " : verbose ? " -v " : " ", url, filename ); if ( verbose ) fprintf( stderr, "%% %s\n", cmd ); system( cmd ); /* 'httpRead' is a program for get a html page */ /* via HTTP GET method. */ return ( filename ); } void listupTrackbackUrls( const char *filename, int verbose ) { FILE *fp; char buf[BUFSIZ], *p, *q; int flag = 0; struct trackbackInfo tbInfo, *tp, *tq; memset( &tbInfo, 0x00, sizeof ( struct trackbackInfo ) ); if ( !tbList ) { tbList = (struct trackbackInfo *) malloc( 1024 * sizeof ( struct trackbackInfo ) ); if ( !tbList ) return; numOfTables++; } tp = &tbInfo; if ( ( fp = fopen( filename, "r" ) ) != NULL ) { while ( ( p = fgets( buf, BUFSIZ - 1, fp ) ) != NULL ) { while ( (*p == ' ') || (*p == '\t') ) p++; if ( flag == 0 ) { if ( ( !strncmp( p, "", 7 ) ) ) { p += 7; q = strstr( p, "" ); strncpy( tp->trackbackedEntryTitle, p, q - p ); tp->trackbackedEntryTitle[q - p] = '\0'; } else if ( ( !strncmp( p, "", 6 ) ) ) { p += 6; q = strstr( p, "" ); strncpy( tp->trackbackedURL, p, q - p ); tp->trackbackedURL[q - p] = '\0'; } else if ( ( q = strstr( p, "" ) ) != NULL ) flag++; continue; } if ( ( !strncmp( p, "", 7 ) ) ) { p += 7; q = strstr( p, "" ); strncpy( tp->trackbackEntryTitle, p, q - p ); tp->trackbackEntryTitle[q - p] = '\0'; flag++; } else if ( ( !strncmp( p, "", 6 ) ) ) { p += 6; q = strstr( p, "" ); strncpy( tp->trackbackEntryURL, p, q - p ); tp->trackbackEntryURL[q - p] = '\0'; flag++; } if ( flag >= 3 ) { tq = &(tbList[numOfTbList]); memcpy( tq, tp, sizeof( struct trackbackInfo ) ); if ( verbose ) fprintf( stderr, "%4d) %s <- %s\n", numOfTbList, tq->trackbackedURL, tq->trackbackEntryURL ); numOfTbList++; flag = 1; tp->trackbackEntryTitle[0] = '\0'; tp->trackbackEntryURL[0] = '\0'; if ( numOfTbList >= numOfTables * 1024 ) { struct trackbackInfo *p; p = (struct trackbackInfo *) realloc( tbList, numOfTables * 1024 * sizeof ( struct trackbackInfo ) ); if ( !p ) return; tbList = p; numOfTables++; } } } fclose( fp ); } } void listTB( const char *url, /* top page's url */ int useProxy,/* use proxy or not */ int verbose /* use verbose mode */ ) { char *filename; char buf[BUFSIZ]; char *p; int flag = 0; int done = 0; char topEntryFileName[256]; char prevPageFileName[256]; char trackBackUrl[256]; FILE *fp; topEntryFileName[0] = '\0'; /* トップページを取得 */ filename = httpGet( url, useProxy, verbose ); /* トップページを解析 */ /* 先頭の記事ファイル名を取得 */ if ( ( fp = fopen( filename, "r" ) ) != NULL ) { while ( ( p = fgets( buf, BUFSIZ - 1, fp ) ) != NULL ) { while ( (*p == ' ') || (*p == '\t') ) p++; if ( (flag == 0) && !strncmp( p, "", 7 ) ) { flag++; continue; } if ( (flag == 1) && !strncmp( p, " 0) && (numOfTbList > numOfDisplay) ) break; } if ( prevPageFileName[0] ) { /* 1つ前の記事の処理へ進む */ filename = httpGet( prevPageFileName, useProxy, verbose ); } else done = 1; } while ( !done ); } if ( numOfTbList> 0 ) { int i, flag = 0; printf( "\n" ); printf( "List of Trackbacked URL\n" ); printf( "\n\n\n" ); printf( "

トラックバ" "ック一覧

\n
    \n" ); for ( i = 0; i < numOfTbList; i++ ) { if ( (i == 0) || strcmp( tbList[i].trackbackedURL, tbList[i-1].trackbackedURL ) ) { if ( flag == 1 ) printf( "
\n" ); printf( "
  • %s\n
    • " "%s
    • \n", tbList[i].trackbackedURL, tbList[i].trackbackedEntryTitle, tbList[i].trackbackEntryURL, tbList[i].trackbackEntryTitle ); flag = 1; } else { printf( "
    • %s
    • \n", tbList[i].trackbackEntryURL, tbList[i].trackbackEntryTitle ); flag = 1; } } if ( flag == 1 ) printf( "
  • \n" ); printf( "\n\n\n\n" ); } } int main( int argc, char *argv[] ) { int i; int verbose = 0; int useProxy = 0; char *p; if ( argc <= 1 ) { fprintf( stderr, "listTB: too few arguments.\n" ); return ( 1 ); } for ( i = 1; i < argc; i++ ) { if ( argv[i][0] == '-' ) { for ( p = &(argv[i][1]); *p; p++ ) { switch( *p ) { case 'v': verbose = !verbose; break; case 'p': useProxy = !useProxy; break; case 'n': if ( (*(p + 1) >= '0') && (*(p + 1) <= '9') ) numOfDisplay = atol( p + 1 ); break; } } continue; } listTB( argv[i], useProxy, verbose ); } return ( 0 ); }