void Message::setFormatInfo(std::map<std::string, std::string> & info) { std::string value; std::map<std::string, std::string>::iterator i = info.begin(); if (info.find("FN") != info.end()) { value += "FN="; value += encodeURL(info["FN"]); value += "; "; } for (; i != info.end(); i++) { if ((*i).first == "FN") continue; value += encodeURL((*i).first); value += "="; value += encodeURL((*i).second); value += "; "; } if (value == "") return; assert(value.size() >= 2); value = value.substr(0, value.size() - 2); this->header.setHeader("X-MMS-IM-Format", value); }
char *getUsersOfDigg( const char *url ) { Thread static char users[32]; Thread static char saveURL[MAX_URLLENGTH * 8]; char *request; char *response; size_t sz = MAX_CONTENT_SIZE; if ( users[0] && (strcmp( users, "(?)" ) != 0 ) ) if ( !strncmp( url, saveURL, MAX_URLLENGTH - 1 ) ) return ( users ); strcpy( users, "(?)" ); /* Digg API を実行 */ request = (char *)malloc( sz ); if ( !request ) return ( users ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( users ); } memset( request, 0x00, BUFSIZ ); sprintf( request, "http://services.digg.com/stories?link=%s", encodeURL( url ) ); sprintf( request + strlen(request), "&appkey=%s", encodeURL("http://watcher.moe-nifty.com/memo/2005/10/bookey.html") ); // IDS_BOOKEY_WEB_URL setUpReceiveBuffer( response, sz ); http_get( request, response ); if ( *response ) { char *p, *q, *r; p = strstr( response, "<story id=\"" ); if ( p ) { p += 11; q = strstr( p, " diggs=\"" ); r = strchr( p, '>' ); if ( q && r && (q < r) ) { q += 8; sprintf( users, "(%d)", atol(q) ); strncpy( saveURL, url, MAX_URLLENGTH - 1 ); saveURL[MAX_URLLENGTH - 1] = NUL; } } } free( response ); free( request ); return ( users ); }
void getConfigValue( const char *name, char *setting, const char *formStart, const char *formEnd ) { char *p, *q, *r, *s; char target[BUFSIZ]; char buf[MAX_CONTENT_SIZE]; sprintf( target, "name=\"%s\"", name ); p = strstr( formStart, target ); if ( p && (p < formEnd) ) { q = strstr( p, "value=\"" ); r = strstr( p, "/>" ); if ( q && r && (q < r) && (r < formEnd) ) { q += 7; s = strchr( q, '"' ); if ( s && (s < r) ) { sprintf( buf, "&%s=", name ); strcat( setting, buf ); strncpy( buf, q, s - q ); buf[s - q] = NUL; strcat( setting, encodeURL(buf) ); } } else { q = p; while ( q > formStart ) { q--; if ( !strncmp( q, "value=\"", 7 ) ) { q += 7; s = strchr( q, '"' ); if ( s && (s < p) ) { sprintf( buf, "&%s=", name ); strcat( setting, buf ); strncpy( buf, q, s - q ); buf[s - q] = NUL; strcat( setting, encodeURL(buf) ); } break; } } } } }
char *getUsersOfMMmemo( const char *url, BOOL *stat1470net ) { Thread static char users[32]; Thread static char saveURL[MAX_URLLENGTH * 8]; char *request; char *response; size_t sz = MAX_CONTENT_SIZE; if ( users[0] && (strcmp( users, "(?)" ) != 0 ) ) if ( !strncmp( url, saveURL, MAX_URLLENGTH - 1 ) ) return ( users ); strcpy( users, "(?)" ); if ( *stat1470net == FALSE ) return ( users ); /* 1470.net exist API を実行 */ request = (char *)malloc( BUFSIZ ); if ( !request ) return ( users ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( users ); } memset( request, 0x00, BUFSIZ ); sprintf( request, "url=%s", encodeURL( url ) ); setUpReceiveBuffer( response, sz ); http_post( "http://1470.net/api/exists.php", "application/x-www-form-urlencoded", request, response ); if ( *response ) { char *p, *q; p = strchr( response, '\t' ); if ( p ) { p++; q = strchr( p, '\t' ); if ( q && (q - p < 32) ) { char tmp[32]; strncpy( tmp, p, q - p ); tmp[q - p] = NUL; sprintf( users, "(%s)", tmp ); strncpy( saveURL, url, MAX_URLLENGTH - 1 ); saveURL[MAX_URLLENGTH - 1] = NUL; } } } else *stat1470net = FALSE; free( response ); free( request ); return ( users ); }
/* * livedoor 向け再構築処理 */ int loginLivedoor( const char *username, const char *password, char *cookie ) { int ret = 0; char *request; char *response; char url[MAX_URLLENGTH]; size_t sz = MAX_CONTENT_SIZE * 2; if ( !cookie || !username || !(*username) || !password || !(*password) ) return ( ret ); request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } memset( request, 0x00, MAX_CONTENT_SIZE ); setUpReceiveBuffer( response, sz ); http_getEx( "http://blog.livedoor.com/", response, cookie ); strcpy( url, "http://member.livedoor.com/login/index" ); setTargetURL( url ); sprintf( request, ".next=%s&" ".sv=blog&" "livedoor_id=%s&" "password=%s&" "auto_login=on\r\n", encodeURL("http://cms.blog.livedoor.com/cms/"), username, password ); setUpReceiveBuffer( response, sz ); http_postEx( url, "application/x-www-form-urlencoded", request, response, cookie ); if ( *response ) { if ( strstr( response, "<input type=\"hidden\" name=\"blog_id\"" ) != NULL ) ret = 1; /* ログイン成功 */ else ret = 0; /* ログイン失敗 */ } else ret = 0; /* ログイン失敗 */ free( response ); free( request ); return ( ret ); }
long getListOfPostsOnDeliciousAPI( DELICIOUS_API_TYPE apiType, /* (I) API 提供元 */ const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *tag, /* (I) 検索条件 (タグ) */ const char *dateTime, /* (I) 検索条件 (投稿日時) yyyy-mm-ddThh:mm:ssZ形式 */ const char *targetUrl, /* (I) 検索条件 (URL) */ long *numOfPosts,/* (I) 取得する情報数 */ /* (O) 取得した情報数 */ DELICIOUS_POSTS *posts /* (O) 取得した情報 */ ) { long num = 0; char url[BUFSIZ]; if ( !numOfPosts || (*numOfPosts <= 0) || !posts ) return ( num ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; switch ( apiType ) { case DAPI_DELICIOUS: strcpy( url, "https://api.del.icio.us/v1/posts/get" ); break; case DAPI_BLUEDOT: // strcpy( url, "https://secure.bluedot.us/v1/posts/get" ); strcpy( url, "https://secure.faves.com/v1/posts/get" ); break; } if ( tag && *tag ) sprintf( url + strlen(url), "?tag=%s", encodeURL(tag) ); if ( dateTime && *dateTime ) sprintf( url + strlen(url), "%cdt=%s", (tag && *tag) ? '&' : '?', dateTime ); #ifndef BEFORE_20060809 if ( targetUrl && *targetUrl ) sprintf( url + strlen(url), "%curl=%s", ((tag && *tag) || (dateTime && *dateTime)) ? '&' : '?', targetUrl ); #endif num = getPostsOnDelicious( url, userName, password, numOfPosts, posts ); return ( num ); }
char *getUsersOfDelicious( const char *url ) { Thread static char users[32]; Thread static char saveURL[MAX_URLLENGTH * 8]; char *p; char *apiURL; char *response; size_t sz = MAX_CONTENT_SIZE * 4; if ( users[0] && (strcmp( users, "(?)" ) != 0 ) ) if ( !strncmp( url, saveURL, MAX_URLLENGTH - 1 ) ) return ( users ); strcpy( users, "(?)" ); /* del.icio.us のブックマークページを取得 */ response = (char *)malloc( sz ); if ( !response ) return ( users ); p = encodeURL( url ); apiURL = (char *)malloc( strlen(p) + 80 ); if ( !apiURL ) { free( response ); return ( users ); } sprintf( apiURL, "http://del.icio.us/url/check?url=%s", p ); setUpReceiveBuffer( response, sz ); http_get( apiURL, response ); if ( *response ) { char *p, *q, *r; p = strstr( response, "<h4 class=\"smaller nom\">" ); if ( p ) { p += 24; q = strstr( p, "</h4>" ); if ( q ) { r = strstr( p, "this url has been saved by " ); if ( r && (r < q) ) { int num = atol( r + 27 ); sprintf( users, "(%d)", num ); strncpy( saveURL, url, MAX_URLLENGTH - 1 ); saveURL[MAX_URLLENGTH - 1] = NUL; } } } } free( apiURL ); free( response ); return ( users ); }
char *getUsersOfNiftyClip( const char *url ) { Thread static char users[32]; Thread static char saveURL[MAX_URLLENGTH * 8]; char apiURL[MAX_URLLENGTH]; char *response; size_t sz = MAX_CONTENT_SIZE; if ( users[0] && (strcmp( users, "(?)" ) != 0 ) ) if ( !strncmp( url, saveURL, MAX_URLLENGTH - 1 ) ) return ( users ); strcpy( users, "(?)" ); /* livedoorクリップのブックマーク登録者数を取得 */ response = (char *)malloc( sz ); if ( !response ) return ( users ); sprintf( apiURL, "http://api.clip.nifty.com/api/v1/counter?url=%s", encodeURL( url ) ); setUpReceiveBuffer( response, sz ); http_get( apiURL, response ); if ( *response ) { char *p = strstr( response, "<count>" ); if ( p ) { p += 7; while ( (*p == ' ') || (*p == '\t') || (*p == '\r') || (*p == '\n') ) p++; while ( *p == '0' ) p++; if ( (*p >= '1') && (*p <= '9') ) sprintf( users, "(%d)", atol(p) ); else if ( *p == '.' ) strcpy( users, "(0)" ); strncpy( saveURL, url, MAX_URLLENGTH - 1 ); saveURL[MAX_URLLENGTH - 1] = NUL; } else { p = strstr( response, "<code>404</code>" ); if ( p ) strcpy( users, "(0)" ); } } free( response ); return ( users ); }
long getRecentPostsOnDeliciousAPI( DELICIOUS_API_TYPE apiType, /* (I) API 提供元 */ const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *tag, /* (I) 検索条件 (タグ) */ long *numOfPosts, /* (I) 取得する情報数 */ /* (O) 取得した情報数 */ DELICIOUS_POSTS *posts /* (O) 取得した情報 */ ) { long num = 0; char url[BUFSIZ]; if ( !numOfPosts || (*numOfPosts <= 0) || !posts ) return ( num ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; if ( *numOfPosts > 100 ) *numOfPosts = 100; switch ( apiType ) { case DAPI_DELICIOUS: strcpy( url, "https://api.del.icio.us/v1/posts/recent" ); break; case DAPI_BLUEDOT: // strcpy( url, "https://secure.bluedot.us/v1/posts/recent" ); strcpy( url, "https://secure.faves.com/v1/posts/recent" ); break; } if ( tag && *tag ) sprintf( url + strlen(url), "?tag=%s", encodeURL(tag) ); sprintf( url + strlen(url), "%ccount=%d", (tag && *tag) ? '&' : '?', *numOfPosts ); num = getPostsOnDelicious( url, userName, password, numOfPosts, posts ); return ( num ); }
BOOL deleteBundleOnDelicious( const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *bundle /* (I) 「分類」の名前 */ ) { BOOL ret = FALSE; char url[BUFSIZ]; char *response; char *p; size_t sz; if ( !bundle || !(*bundle) ) return ( ret ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; sz = MAX_CONTENT_SIZE; response = (char *)malloc( MAX_CONTENT_SIZE ); if ( !response ) return ( ret ); p = sjis2utf(bundle); sprintf( url, #ifdef BEFORE_20060809 "http://del.icio.us/api/tags/bundles/delete" #else "https://api.del.icio.us/v1/tags/bundles/delete" #endif "?bundle=%s", encodeURL( p ? p : bundle ) ); setUpReceiveBuffer( response, sz ); http_getBASIC( url, userName, password, response ); if ( response && *response ) { char *p = strstr( response, "<result" ); if ( p && (strstr( p + 7, "ok" ) != NULL) ) ret = TRUE; } free( response ); return ( ret ); }
BOOL deleteEntryOnLivedoorClip2( const char *username, const char *apiKey, const char *url ) { BOOL ret = FALSE; char *request; char *response; size_t sz; request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); sz = MAX_CONTENT_SIZE * 20; response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } memset( request, 0x00, MAX_CONTENT_SIZE ); sprintf( request, "%s?url=%s", "http://api.clip.livedoor.com/v1/posts/delete", encodeURL(url) ); setUpReceiveBuffer( response, sz ); http_getBASIC( request, username, apiKey, response ); if ( response && *response ) { char *p = strstr( response, "<result" ); if ( p ) ret = TRUE; } free( response ); free( request ); return ( ret ); }
HBITMAP CImage::HttpOpen( CString url, CString cookie ) { // 指定された URL の画像ファイルを読み、ビットマップを生成する char *response; char *cookieString; size_t sz = 65536 * 256; HBITMAP ret = NULL; response = new char[sz]; if ( !response ) return ret; cookieString = new char[MAX_COOKIE_LEN + 2]; if ( !cookieString ) { delete [] response; return ret; } strcpy( cookieString, cookie ); setUpReceiveBuffer( response, sz ); http_getEx( url, response, cookieString ); if ( *response ) { size_t sz = getBinSize(); if ( sz > 0 ) { CString fileName = "tmp.img"; FILE *fp = fopen( fileName, "wb" ); if ( fp ) { fwrite( response, sz, 1, fp ); fclose( fp ); ret = LoadImageFile( fileName ); } } } delete [] cookieString; delete [] response; encodeURL( NULL ); return ret; }
void getConfigValueSelected( const char *name, char *setting, const char *formStart, const char *formEnd ) { char *p, *q, *r, *s; char target[BUFSIZ]; char buf[MAX_CONTENT_SIZE]; sprintf( target, "name=\"%s\"", name ); p = strstr( formStart, target ); if ( p && (p < formEnd) ) { p += strlen( target ); q = strstr( p, "</select>" ); if ( q && (q < formEnd) ) { r = strstr( p, "selected" ); if ( r && (r < q) ) { while ( r > formStart ) { r--; if ( !strncmp( r, "value=\"", 7 ) ) { r += 7; s = strchr( r, '"' ); if ( s && (s < q) ) { sprintf( buf, "&%s=", name ); strcat( setting, buf ); strncpy( buf, r, s - r ); buf[s - r] = NUL; strcat( setting, encodeURL(buf) ); } break; } } } } } }
char *getUsersOfHatenaBookmark( const char *url ) { Thread static char users[32]; Thread static char saveURL[MAX_URLLENGTH * 8]; char apiURL[MAX_URLLENGTH]; char *request; char *response; size_t sz = MAX_CONTENT_SIZE * 16; if ( users[0] && (strcmp( users, "(?)" ) != 0 ) ) if ( !strncmp( url, saveURL, MAX_URLLENGTH - 1 ) ) return ( users ); strcpy( users, "(?)" ); /* XML-RPC API (bookmark.getTotalCount) を実行 */ request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( users ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( users ); } strcpy( apiURL, "http://b.hatena.ne.jp/xmlrpc" ); sprintf( request, XML_STATEMENT "<methodCall>\r\n" "<methodName>bookmark.getTotalCount</methodName>\r\n" "<params>\r\n" "<param>\r\n" "<value><string>%s</string></value>\r\n" "</param>\r\n" "</params>\r\n" "</methodCall>", url ); setUpReceiveBuffer( response, sz ); http_post( apiURL, NULL, request, response ); if ( *response ) { char *p, *q; p = strstr( response, "flerror" ); if ( !p ) { // 正常応答 p = strstr( response, "<value><int>" ); if ( p ) { p += 12; q = strstr( p, "</int></value>" ); if ( q ) { long num = atol( p ); if ( num >= 0 ) sprintf( users, "(%d)", num ); } } } if ( strcmp( users, "(?)" ) != 0 ) { free( response ); free( request ); return ( users ); } } /* Hatena exist API を実行 */ sprintf( apiURL, "http://d.hatena.ne.jp/exist?mode=xml&%s", encodeURL( url ) ); setUpReceiveBuffer( response, sz ); http_get( apiURL, response ); if ( *response ) { char *p, *q, *r; p = strstr( response, "<count name=\"bookmark\">" ); if ( p ) { p += 23; q = strchr( p, '<' ); if ( q ) { char tmp[32]; strncpy( tmp, p, q - p ); tmp[q - p] = NUL; sprintf( users, "(%s)", tmp ); strncpy( saveURL, url, MAX_URLLENGTH - 1 ); saveURL[MAX_URLLENGTH - 1] = NUL; } } else { // エントリページを取得 // -- エントリページは getTitle() でも取得しているので、2回も // 取得しに行くのはよくない(が、とりあえず、取得しに行く) sprintf( apiURL, "http://b.hatena.ne.jp/entry/%s", encodeURLforHatena( url ) ); setUpReceiveBuffer( response, sz ); http_get( apiURL, response ); if ( *response ) { p = strstr( response, "<a name=\"comments\"" ); if ( p ) { int num = 0; p += 18; q = strstr( p, "</a> (" ); if ( q ) { p = q + 6; q = strstr(p, "<span class=\"public-count\" title="); if ( q ) { q = strstr( q + 32, "\">" ); if ( q ) q += 2; } r = strstr( p, ") <a href=\"/entry/" ); if ( q && r && (q < r) ) num = atol( p ) + atol( q ); else if ( r ) num = atol( p ); } if ( num > 0 ) { sprintf( users, "(%d)", num ); strncpy( saveURL, url, MAX_URLLENGTH - 1 ); saveURL[MAX_URLLENGTH - 1] = NUL; } } } } } free( response ); free( request ); return ( users ); }
/* Yahoo! Japan に login する */ int loginYahooJapan( const char *username, // (I) ユーザ名 (Yahoo! Japan ID) const char *password, // (I) パスワード char *cookie // (I/O) クッキー ) { int ret = 0; int retry = 5; char *request; char *response; char url[MAX_URLLENGTH]; char challenge[MAX_KEYLENGTH]; size_t sz = MAX_CONTENT_SIZE * 4; if ( !cookie || !username || !(*username) || !password || !(*password) ) return ( ret ); request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } // http://bookmarks.yahoo.co.jp/all を GET challenge[0] = NUL; setUpReceiveBuffer( response, sz ); http_get( "http://bookmarks.yahoo.co.jp/all", response ); if ( *response ) { char *p, *q; p = strstr( response, "name=\".challenge\" value=\"" ); if ( p ) { p += 25; q = strchr( p, '"' ); if ( q ) { strncpy( challenge, p, q - p ); challenge[q - p] = NUL; } } } if ( challenge[0] ) { do { memset( request, 0x00, MAX_CONTENT_SIZE ); strcpy( url, "https://login.yahoo.co.jp/config/login" ); setTargetURL( url ); sprintf( request, ".done=%s&" ".src=bmk2&" ".challenge=%s&" ".chkP=Y&" "login=%s&" "passwd=%s&" ".persistent=Y&", encodeURL( "http://bookmarks.yahoo.co.jp/all" ), challenge, username, password ); sprintf( request + strlen( request ), "submit=%s", encodeURL(sjis2utf("ログイン")) ); setUpReceiveBuffer( response, sz ); http_postEx( url, "application/x-www-form-urlencoded", request, response, cookie ); if ( *response ) { char *p, *q; p = strstr( response, "<meta http-equiv=\"Refresh\" content=\"0; url=" ); if ( p ) { p += 43; q = strchr( p, '"' ); if ( q ) { strncpy( url, p, q - p ); url[q - p] = NUL; setUpReceiveBuffer( response, sz ); http_getEx( url, response, cookie ); } } if ( *response ) { if ( strstr( response, "http://login.yahoo.co.jp/config/login?logout") != NULL ) ret = 1; /* ログイン成功 */ else ret = 0; /* ログイン失敗 */ } } else ret = 0; /* ログイン失敗 */ if ( ret == 0 ) { retry--; if ( retry <= 0 ) break; Sleep( 2000 ); } } while ( ret == 0 ); } free( response ); free( request ); return ( ret ); }
int loginCocologFiles( const char *username, // (I) ユーザ名 const char *password, // (I) パスワード char *cookie ) // (O) クッキー { int ret = 0; char *p; char *request; char *response; char url[MAX_URLLENGTH_MAX]; char realm[MAX_KEYLENGTH * 2]; char digest[BUFSIZ]; size_t sz = MAX_CONTENT_SIZE; if ( !cookie ) return ( ret ); if ( !username ) username = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } memset( request, 0x00, MAX_CONTENT_SIZE ); strcpy( url, xmlrpc_p->blogKind == BLOGKIND_COCOLOGFREE ? COCOLOGFREE_APP : COCOLOG_APP ); setUpReceiveBuffer( response, sz ); http_getEx( url, response, cookie ); if ( *response ) getCurrentLocation( url ); realm[0] = NUL; getRealm( request, response, sz, cookie, realm ); if ( realm[0] ) { sprintf( digest, "%s:%s:%s", username, realm, password ); p = MD5( digest ); if ( p ) { strcpy( digest, p ); sprintf( request, "username=%s&" "digest=%s&" "remember=1&" "submit=%s", username, digest, encodeURL(sjis2utf("ログイン")) ); setUpReceiveBuffer( response, sz ); http_postEx( url, "application/x-www-form-urlencoded", request, response, cookie ); if ( *cookie && strstr( cookie, "SSOID=" ) ) ret = 1; /* ログイン成功 */ else { ret = 0; /* ログイン失敗 */ if ( xmlrpc_p->verbose ) dputs( "loginCocologFiles: login失敗\n" ); } } } encodeURL( NULL ); free( response ); free( request ); return ( ret ); }
/* Yahoo! に login する */ int loginYahoo( const char *username, // (I) ユーザ名 (Yahoo! ID) const char *password, // (I) パスワード char *cookie // (I/O) クッキー ) { int ret = 0; int retry = 5; char *request; char *response; char url[MAX_URLLENGTH]; char challenge[MAX_KEYLENGTH]; char u[MAX_KEYLENGTH]; char pd[MAX_KEYLENGTH]; size_t sz = MAX_CONTENT_SIZE * 4; if ( !cookie || !username || !(*username) || !password || !(*password) ) return ( ret ); request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } // http://bookmarks.yahoo.com/ を GET challenge[0] = NUL; u[0] = NUL; pd[0] = NUL; setUpReceiveBuffer( response, sz ); http_get( "http://bookmarks.yahoo.com/", response ); if ( *response ) { char *p, *q; p = strstr( response, "name=\".challenge\" value=\"" ); if ( p ) { p += 25; q = strchr( p, '"' ); if ( q ) { strncpy( challenge, p, q - p ); challenge[q - p] = NUL; } } p = strstr( response, "name=\".u\" value=\"" ); if ( p ) { p += 17; q = strchr( p, '"' ); if ( q ) { strncpy( u, p, q - p ); u[q - p] = NUL; } } p = strstr( response, "name=\".pd\" value=\"" ); if ( p ) { p += 18; q = strchr( p, '"' ); if ( q ) { strncpy( pd, p, q - p ); pd[q - p] = NUL; } } } if ( challenge[0] ) { do { memset( request, 0x00, MAX_CONTENT_SIZE ); strcpy( url, "https://login.yahoo.com/config/login?" ); setTargetURL( url ); sprintf( request, ".tries=1&" ".src=bmk2&" ".md5=&" ".hash=&" ".js=&" ".last=&" "promo=&" ".intl=us&" ".bypass=&" ".partner=&" ); if ( u[0] ) sprintf( request + strlen( request ), ".u=%s&", u ); else sprintf( request + strlen( request ), ".u=&" ); sprintf( request + strlen( request ), ".v=0&" ".challenge=%s&" ".yplus=&" ".emailCode=&" "pkg=&" "stepid=&" ".ev=&" "hasMsgr=0&" ".chkP=Y&" ".done=%s&", challenge, encodeURL( "http://bookmarks.yahoo.com/" ) ); if ( pd[0] ) sprintf( request + strlen( request ), ".pd=%s&", u ); else sprintf( request + strlen( request ), ".pd=&" ); sprintf( request + strlen( request ), "login=%s&" "passwd=%s&" ".persistent=Y&" ".save=%s", username, password, encodeURL( "Sign In" ) ); setUpReceiveBuffer( response, sz ); http_postEx( url, "application/x-www-form-urlencoded", request, response, cookie ); if ( *response ) { char *p, *q; p = strstr( response, "<meta http-equiv=\"Refresh\" content=\"0; url=" ); if ( p ) { p += 43; q = strchr( p, '"' ); if ( q ) { strncpy( url, p, q - p ); url[q - p] = NUL; setUpReceiveBuffer( response, sz ); http_getEx( url, response, cookie ); } } if ( *response ) { if ( strstr( response, "Sign out</a>" ) != NULL ) ret = 1; /* ログイン成功 */ else ret = 0; /* ログイン失敗 */ } } else ret = 0; /* ログイン失敗 */ if ( ret == 0 ) { retry--; if ( retry <= 0 ) break; Sleep( 2000 ); } } while ( ret == 0 ); } free( response ); free( request ); return ( ret ); }
int deleteCocologFiles( const char *url, // (I) 削除したいファイルの URL char *cookie ) // (I/O) クッキー { int ret = 0; char targetURL[MAX_URLLENGTH]; char *request; char *response; char path[MAX_URLLENGTH]; char filename[MAX_URLLENGTH]; char magic_token[MAX_KEYLENGTH]; char *p, *q; size_t sz = MAX_CONTENT_SIZE * 4; if (!cookie || !(*cookie) || !url ) return ( ret ); if ( xmlrpc_p->verbose ) { dprintf( "deleteCocologFiles: 削除しようとしているファイル(URL)" " → %s\n", url ); } path[0] = NUL; filename[0] = NUL; p = strstr( url, "://" ); if ( !p ) return ( ret ); p += 3; q = strchr( p, '/' ); if ( !q ) return ( ret ); p = q + 1; q = strrchr( p, '/' ); if ( q ) { strncpy( path, p, q - p ); path[q - p] = NUL; } strcpy( filename, p ); request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } memset( request, 0x00, MAX_CONTENT_SIZE ); /* magic_token を取得 */ setReferer( xmlrpc_p->blogKind == BLOGKIND_COCOLOGFREE ? COCOLOGFREE_FILEMANAGER : COCOLOG_FILEMANAGER ); getMagicToken( path, magic_token, &response, &sz, cookie ); /* ファイルを削除 */ strcpy( targetURL, xmlrpc_p->blogKind == BLOGKIND_COCOLOGFREE ? COCOLOGFREE_FILEMANAGER : COCOLOG_FILEMANAGER ); setTargetURL( targetURL ); if ( magic_token[0] ) { if ( path[0] ) sprintf( request, "type=file&" "__mode=delete&" "magic_token=%s&" "path=%s&" "id=%s&" "submit=%s", magic_token, path, filename, encodeURL( sjis2utf("削除する") ) ); else sprintf( request, "type=file&" "__mode=delete&" "magic_token=%s&" "path=&" "id=%s&" "submit=%s", magic_token, filename, encodeURL( sjis2utf("削除する") ) ); setUpReceiveBuffer( response, sz ); ret = httpPostWithSession( xmlrpc_p->webServer, xmlrpc_p->webPage, "application/x-www-form-urlencoded", request, response, cookie, NULL, NULL ); if ( response[0] ) { ret = 1; if ( xmlrpc_p->verbose ) dputs( "deleteCocologFiles: 削除リクエスト発行成功\n" ); } else { ret = 0; if ( xmlrpc_p->verbose ) dputs( "deleteCocologFiles: 削除リクエスト発行失敗\n" ); } } encodeURL( NULL ); free( response ); free( request ); return ( ret == -1 ? 0 : 1 ); }
int uploadCocologFiles( FILEINF *fileInf, // (I) アップロードするファイルに関す // る情報 char *url, // (O) アップロードしたファイルの URL char *cookie ) // (I/O) クッキー { int ret = 0; char targetURL[MAX_URLLENGTH]; char contentType[MAX_LOGICALLINELEN]; char magic_token[MAX_KEYLENGTH]; char *request; char *response; char *separator = getMultiPartID(); size_t szz = 0; size_t sz = MAX_CONTENT_SIZE * 4; size_t bt; char *base; char *tail; char *p; if (!cookie || !(*cookie) || !fileInf || !(fileInf->bits) || !url ) return ( ret ); if ( xmlrpc_p->verbose ) dprintf( "uploadCocologFiles: アップロードしようとしているファイル" " → %s\n", fileInf->name ); bt = strlen( (char *)(fileInf->bits) ); request = (char *)malloc( MAX_CONTENT_SIZE + bt ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } memset( request, 0x00, MAX_CONTENT_SIZE + bt ); getSendBufferPointer( request, base ); tail = base; /* magic_token を取得 */ getMagicToken( "", magic_token, &response, &sz, cookie ); if ( magic_token[0] == NUL ) { free( response ); free( request ); return ( ret ); } /* ファイルをアップロード */ sprintf( contentType, "multipart/form-data; boundary=%s", separator ); strcpy( targetURL, xmlrpc_p->blogKind == BLOGKIND_COCOLOGFREE ? COCOLOGFREE_FILEMANAGER : COCOLOG_FILEMANAGER ); setTargetURL( targetURL ); strcpy( tail, makeMultiPartItem( separator, MULITIPART_ITEM_TYPE_STRING, "__mode", 0, "upload", NULL ) ); strcat( tail, makeMultiPartItem( separator, MULITIPART_ITEM_TYPE_STRING, "magic_token", 0, magic_token, NULL ) ); strcat( tail, makeMultiPartItem( separator, MULITIPART_ITEM_TYPE_STRING, "path", 0, NULL, NULL ) ); szz = strlen( tail ); tail += szz; szz = 0; p = makeMultiPartItem( separator, MULITIPART_ITEM_TYPE_FILE, "file", 0, (char *)fileInf, &szz ); memcpy( tail, p, szz ); tail += szz; strcat( tail, makeMultiPartItem( separator, MULITIPART_ITEM_TYPE_STRING, "submit", 0, encodeURL(sjis2utf("アップロード")), NULL ) ); sprintf( tail + strlen( tail ), "--%s--\r\n", separator ); szz = strlen( tail ); tail += szz; makeMultiPartItem( separator, MULITIPART_ITEM_TYPE_BUFFERFREE, NULL, 0, NULL, NULL ); szz = tail - base; setUpSendBuffer( request, szz, base ); setUpReceiveBuffer( response, sz ); setTimeoutTime( DEFAULT_HTTP_TIMEOUT * (1 + (bt / (1024 * 1024))) ); // サイズに比例したタイムアウト時間を設定 ret = httpPostWithSession( xmlrpc_p->webServer, xmlrpc_p->webPage, contentType, request, response, cookie, NULL, NULL ); setTimeoutTime( DEFAULT_HTTP_TIMEOUT ); // デフォルト値に戻しておく /* url 取得 */ url[0] = NUL; if ( response[0] ) { char *p = strstr( response, "\"/t/app/control/files\"" ); char *q = strstr( response, "id=\"duplicate_file\"" ); char *r; if ( xmlrpc_p->verbose ) dputs( "uploadCocologFiles: アップロードリクエスト発行成功\n" ); if ( ( r = strrchr( fileInf->name, '/' ) ) == NULL ) r = fileInf->name; else r++; if ( q ) { // 「同じ名前の古いファイルがこのフォルダ内にあります」の場合 char temp[32]; char *s = strstr( q, "name=\"temp\" value=\"" ); if ( xmlrpc_p->verbose ) dputs( "uploadCocologFiles: 同じ名前の古いファイルが" "このフォルダ内にあります\n" ); p = NULL; if ( s ) { char *t; s += 19; t = strchr( s, '"' ); strncpy( temp, s, t - s ); temp[t - s] = NUL; // ファイルを置き換え memset( request, 0x00, MAX_CONTENT_SIZE ); strcpy( url, xmlrpc_p->blogKind == BLOGKIND_COCOLOGFREE ? COCOLOGFREE_FILEMANAGER : COCOLOG_FILEMANAGER ); setTargetURL( url ); sprintf( request, "__mode=upload&" "magic_token=%s&" "temp=%s&" "path=&" "name=%s&" "overwrite_yes=%s", magic_token, temp, r, encodeURL(sjis2utf("ファイルを置き換えます")) ); setUpReceiveBuffer( response, sz ); ret = httpPostWithSession( xmlrpc_p->webServer, xmlrpc_p->webPage, "application/x-www-form-urlencoded", request, response, cookie, NULL, NULL ); if ( response[0] ) { if ( xmlrpc_p->verbose ) dputs("uploadCocologFiles: 置換リクエスト発行成功\n"); p = strstr( response, "\"/t/app/control/files\"" ); } else { if ( xmlrpc_p->verbose ) dputs("uploadCocologFiles: 置換リクエスト発行失敗\n"); } } } if ( p ) { char targetString[BUFSIZ]; p += 22; sprintf( targetString, ">%s</a>", r ); q = strstr( p, targetString ); if ( !q ) { /* ファイルをアップロードするとファイル名中の大文字が小文字 */ /* に変えられてしまうため、以下の対策を実施 */ char *s = targetString; while ( *s ) { if ( (*s >= 'A') && (*s <= 'Z') ) *s = (char)(*s - 'A' + 'a'); s++; } q = strstr( p, targetString ); } if ( q ) { while ( (q >= response) && *q && (strncmp( q, "href=\"", 6 ) != 0) ) q--; if ( !strncmp( q, "href=\"", 6 ) ) { q += 6; p = strchr( q, '"' ); if ( p ) { strncpy( url, q, p - q ); url[p - q] = NUL; if ( xmlrpc_p->verbose ) dprintf( "uploadCocologFiles: アップロードした" "ファイルのURL → %s\n", url ); } } } } } else { if ( xmlrpc_p->verbose ) dputs( "uploadCocologFiles: アップロードリクエスト発行失敗\n" ); } encodeURL( NULL ); free( response ); free( request ); return ( ret == -1 ? 0 : 1 ); }
BOOL renameTagOnDeliciousAPI( DELICIOUS_API_TYPE apiType, /* (I) API 提供元 */ const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *oldTag, /* (I) 古いタグ */ const char *newTag /* (I) 新しいタグ */ ) { BOOL ret = FALSE; char url[BUFSIZ * 2]; char *response; char *p; size_t sz; if ( !oldTag || !(*oldTag) || !newTag || !(*newTag) ) return ( ret ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; sz = MAX_CONTENT_SIZE; response = (char *)malloc( sz ); if ( !response ) return ( ret ); switch ( apiType ) { case DAPI_DELICIOUS: p = sjis2utf( oldTag ); sprintf( url, "https://api.del.icio.us/v1/tags/rename" "?old=%s", encodeURL( p ? p : oldTag ) ); break; case DAPI_BLUEDOT: p = sjis2utf( oldTag ); sprintf( url, // "https://secure.bluedot.us/v1/tags/rename" "https://secure.faves.com/v1/tags/rename" "?old=%s", encodeURL( p ? p : oldTag ) ); break; } p = sjis2utf( newTag ); sprintf( url + strlen(url), "&new=%s", encodeURL( p ? p : newTag ) ); setUpReceiveBuffer( response, sz ); http_getBASIC( url, userName, password, response ); if ( response && *response ) { p = strstr( response, "<result" ); if ( p ) ret = TRUE; } free( response ); return ( ret ); }
BOOL postEntryOnDeliciousAPI( DELICIOUS_API_TYPE apiType, /* (I) API 提供元 */ const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ DELICIOUS_ENTRY *entry /* (I) 登録する情報(投稿内容) */ ) { BOOL ret = FALSE; char *url; char *response; char *p; size_t sz; int retry = 1; if ( !entry || !(entry->url[0]) ) return ( ret ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; url = (char *)malloc( sizeof ( DELICIOUS_ENTRY ) + BUFSIZ ); if ( !url ) return ( ret ); sz = MAX_CONTENT_SIZE; response = (char *)malloc( sz ); if ( !response ) { free( url ); return ( ret ); } memset( url, 0x00, sizeof ( DELICIOUS_ENTRY ) + BUFSIZ ); switch ( apiType ) { case DAPI_DELICIOUS: sprintf( url, "https://api.del.icio.us/v1/posts/add" "?url=%s", encodeURL(entry->url) ); break; case DAPI_BLUEDOT: sprintf( url, // "https://secure.bluedot.us/v1/posts/add" "https://secure.faves.com/v1/posts/add" "?url=%s", encodeURL(entry->url) ); break; } if ( entry->description[0] ) { p = sjis2utf( entry->description ); sprintf( url + strlen(url), "&description=%s", p ? encodeURLex2( p ) : encodeURL( entry->description ) ); } if ( entry->extended[0] ) { // extended は(UTF-8で)最大255バイトまで (del.icio.us の場合のみ) // Blue Dot は255バイト以上でも問題なく投稿できる p = sjis2utf( entry->extended ); if ( p && ((apiType != DAPI_DELICIOUS) || (strlen( p ) <= 255)) ) sprintf( url + strlen(url), "&extended=%s", encodeURL( p ) ); else { // UTF-8で255バイト以下 → Shift_JISで170バイト以下 にする // -- 255 / 3 * 2 = 170 (いわゆる半角英数字が含まれていないと // 仮定した場合) char *q; p = normalizeExtended( entry->extended ); q = sjis2utf(p); sprintf( url + strlen(url), "&extended=%s", encodeURL( q ? q : p ) ); } } if ( entry->tag[0] ) { p = sjis2utf(entry->tag); sprintf( url + strlen(url), "&tags=%s", encodeURL( p ? p : entry->tag ) ); } if ( entry->dateTime[0] ) sprintf( url + strlen(url), "&dt=%s", encodeURL(entry->dateTime) ); if ( entry->shared == FALSE ) sprintf( url + strlen(url), "&shared=no" ); do { setUpReceiveBuffer( response, sz ); http_getBASIC( url, userName, password, response ); retry--; } while ( (response[0] == NUL) && (apiType == DAPI_BLUEDOT) && (retry >= 0) ); if ( *response ) { p = strstr( response, "<result" ); /* <result code="something went wrong" /> */ if ( p && !strstr( p, "<result code=\"something went wrong\" />" ) ) ret = TRUE; } free( response ); free( url ); encodeURLex2( NULL ); return ( ret ); }
// 発言を投稿 bool CJaiku::PostPresence( CString monologue, ProceedingDialog *pdlg ) { bool ret = false; size_t sz = MAX_CONTENT_SIZE; size_t len = monologue.GetLength() * 18; char *request = new char[BUFSIZ + len + 1]; char *response = new char[sz]; char url[MAX_URLLENGTH]; char cid[MAX_KEYLENGTH]; strcpy( url, "http://api.jaiku.com/json" ); cid[0] = NUL; if ( !strncmp( monologue, ">>", 2 ) ) { strncpy( cid, ((const char *)monologue) + 2, MAX_KEYLENGTH - 2 ); cid[MAX_KEYLENGTH - 2] = NUL; char *p = strchr( cid, ' ' ); if ( p ) { *p = NUL; monologue = strchr( monologue, ' ' ) + 1; } } char *p = sjis2utf( monologue ); if ( request && response ) { if ( m_useOAuth ) { // OAuth 認証 delete [] request; request = new char[sz]; char key[MAX_KEYLENGTH * 2]; char base[MAX_CONTENT_SIZE]; char param[MAX_CONTENT_SIZE]; key[0] = NUL; base[0] = NUL; param[0] = NUL; sprintf( request, "%s", p ? p : (const char *)monologue ); p = GetTinyURL( request ); sprintf( param, "message=%s&" "method=post&" "nick=%s&", encodeURLi( p ? p : monologue, FALSE ), (const char *)m_username ); MakeOAuthBase( url, "POST", key, base, param ); sprintf( param + strlen(param), "&" "user=%s", (const char *)m_username ); MakeOAuthRequest( url, "POST", request, key, base, param ); } else { // 従来の認証 sprintf( request, "status=%s", encodeURL( p ? p : (const char *)monologue ) ); setUpReceiveBuffer( response, sz ); sprintf( request, "user=%s&" "personal_key=%s&" "method=%s&" "message=%s&", (const char *)m_username, (const char *)m_apiKey, #ifdef JAIKU_LEGACY_API "presence.send", #else "post", #endif encodeURL( p ) ); #ifdef FEATURE_NOT_AVAILABLE if ( cid[0] ) { /* sprintf( url, "http://api.jaiku.com/presence/%s/json", cid ); */ sprintf( request, "user=%s&" "personal_key=%s&" "method=%s&" "presence=%s&" "message=%s&", m_username, m_apiKey, "presence.send", cid, encodeURL( p ) ); } #endif } SetUserAgent(); setUpReceiveBuffer( response, sz ); _http_post( url, request, response, pdlg ); if ( *response ) { if ( strstr( response, "{\"status\":\"ok\"}" ) ) ret = true; } } if ( response ) delete [] response; if ( request ) delete [] request; return ( ret ); }
void subcrawler( const char *rootURL, const char *username, const char *password, int verbose ) { char url[MAX_URLLENGTH]; char *request; char *response; char *cookie; time_t t; SYSTEMTIME systime; double s; char *p, *q; int offset; int total; int retry = 0; size_t sz = MAX_CONTENT_SIZE * 4; request = (char *)malloc( BUFSIZ * 4 ); if ( !request ) return; response = (char *)malloc( MAX_CONTENT_SIZE * 4 ); if ( !response ) { free( request ); return; } cookie = (char *)malloc( MAX_COOKIE_LEN ); if ( !cookie ) { free( response ); free( request ); return; } /* ログイン (+ 右フレーム取得) */ memset( cookie, 0x00, MAX_COOKIE_LEN ); sprintf( url, "%sindex.php", rootURL ); sprintf( request, "userid=%s&" "password=%s&" "keeplogin=1&" "submit=%s&" "logintarget=", username, password, encodeURL(sjis2utf("ログイン")) ); setUpReceiveBuffer( response, sz ); http_postEx( url, "application/x-www-form-urlencoded", request, response, cookie ); if ( !(*response) && !(*cookie) ) { fprintf( stderr, "ログインに失敗しました\n" ); goto EXIT; } #if 0 /* 左フレーム取得 */ sprintf( url, "%sfeedlist.php", rootURL ); setTargetURL( url ); setUpReceiveBuffer( response, sz ); http_getEx( url, response, cookie ); if ( !(*response) ) { fprintf( stderr, "エラーが発生しました。処理を中断します\n" ); goto EXIT; } #endif /* クロール開始指示発行 */ // 要求: http://www.example.com/freshreader/subcrawler.php?of=-1&d=1138605567781 // 応答: <continue param="453;0;"/> // 要求: http://www.example.com/freshreader/subcrawler.php?of=0&d=1138605568609 // …… // 応答: <continue param="453;XXX;"/> // 要求: http://www.example.com/freshreader/subcrawler.php?of=XXX&d=現在時刻 // …… // 応答: <continue param="453;444;"/> // 要求: http://www.example.com/freshreader/subcrawler.php?of=444&d=1138605989562 // 応答: <finished param="453;0;"/> // 要求: http://www.example.com/freshreader/feedlist.php?a=fin&t=453&d=1138605989562 // 応答: (略) t = time( &t ); GetSystemTime( &systime ); s = t * 1000.0 + systime.wMilliseconds; sprintf( url, "%ssubcrawler.php?of=-1&d=%.f", rootURL, s ); setTargetURL( url ); setUpReceiveBuffer( response, sz ); http_getEx( url, response, cookie ); while ( *response ) { if ( (p = strstr( response, "<continue param=\"" )) != NULL ) { p += 17; total = atol( p ); q = strchr( p, ';' ); if ( q ) { q++; offset = atol( q ); if ( verbose ) { if ( offset > 0 ) fprintf( stderr, "全 %d サイトのうち %d サイトの新着情報を受信完了\n", total, offset ); else fprintf( stderr, "全 %d サイト分の新着情報を受信開始\n", total ); } retry = 0; do { t = time( &t ); GetSystemTime( &systime ); s = t * 1000.0 + systime.wMilliseconds; sprintf( url, "%ssubcrawler.php?of=%d&d=%.f", rootURL, offset, s ); setTargetURL( url ); setUpReceiveBuffer( response, sz ); http_getEx( url, response, cookie ); if ( ++retry >= 3 ) break; } while ( !(*response) ); continue; } } else if ( (p = strstr( response, "<finished param=\"" )) != NULL ) { p += 17; offset = atol( p ); if ( verbose ) fprintf( stderr, "%d サイト分の新着情報を全て受信完了\n", offset ); t = time( &t ); GetSystemTime( &systime ); s = t * 1000.0 + systime.wMilliseconds; sprintf( url, "%sfeedlist.php?a=fin&t=%d&d=%.f", rootURL, offset, s ); setUpReceiveBuffer( response, sz ); setTargetURL( url ); http_getEx( url, response, cookie ); continue; } break; } EXIT: free( cookie ); free( response ); free( request ); }
BOOL deleteEntryOnDiigo( const char *username, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *url ) /* (I) 削除対象ブックマーク(対象のURL) */ { BOOL ret = FALSE; char *request; char *response; char targetUrl[MAX_URLLENGTH]; int sz = MAX_CONTENT_SIZE * 20; char *URLforJSON = NUL; char *urls = NUL; char *p; request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } strcpy( targetUrl, "http://api2.diigo.com/bookmarks" ); // URL URLforJSON = encodeURLforJSON( url ); #if 1 sprintf( request, "[{\"url\":\"%s\"}]", URLforJSON ); /* ↑ deleted: 0 bookmark が返ってくる (削除できない) */ #else sprintf( request, "[{\"%s\"}]", URLforJSON ); /* ↑ API 仕様書に書いてあるやり方通り(のはず) なぜか 400 Bad Request になる */ #endif urls = (char *)malloc( strlen( request ) * 8 + 1 ); if ( urls ) { sprintf( urls, "urls=%s", encodeURL(request) ); setUpReceiveBuffer( response, sz ); http_deleteBASIC( targetUrl, username, password, "application/x-www-form-urlencoded", urls, response ); if ( *response ) { p = strstr( response, "deleted" ); if ( p ) ret = TRUE; /* 削除成功 */ } free( urls ); } if ( URLforJSON ) free( URLforJSON ); free( response ); free( request ); return ( ret ); }
int loginColors( const char *username, // (I) COLORS ID (メールアドレス) const char *password, // (I) パスワード char *cookie ) // (O) クッキー { int ret = 0; char *request; char *response; char url[MAX_URLLENGTH]; size_t sz = MAX_CONTENT_SIZE * 2; if ( !username || !(*username) || !password || !(*password) || !cookie ) return ( ret ); // if ( !username ) // username = xmlrpc_p->userName; // if ( !password ) // password = xmlrpc_p->password; request = (char *)malloc( MAX_CONTENT_SIZE ); if ( !request ) return ( ret ); response = (char *)malloc( sz ); if ( !response ) { free( request ); return ( ret ); } memset( request, 0x00, MAX_CONTENT_SIZE ); memset( response, 0x00, sz ); strcpy( url, "http://clrs.jp/index.php" ); setTargetURL( url ); sprintf( request, "mode=sign&" "user=%s&" "password=%s&" "submit=%s&" "auto=on", username, password, encodeURL("ログイン") ); // ret = httpPostWithSession( xmlrpc_p->webServer, xmlrpc_p->webPage, // "application/x-www-form-urlencoded", // request, response, cookie, // NULL, NULL ); setUpReceiveBuffer( response, sz ); http_postEx( url, "application/x-www-form-urlencoded", request, response, cookie ); // if ( ret == -1 ) // ret = 0; /* サーバとの通信失敗 */ // else if ( *response ) { if ( strstr( response, " alt=\"ログアウト\" " ) != NULL ) ret = 1; /* ログイン成功 */ else ret = 0; /* ログイン失敗 */ } free( response ); free( request ); return ( ret ); }
BOOL removeTagOnDeliciousAPI( DELICIOUS_API_TYPE apiType, /* (I) API 提供元 */ const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *tag /* (I) 削除対象のタグ */ ) { BOOL ret = FALSE; char url[BUFSIZ * 2]; char request[2048]; char cookie[MAX_COOKIE_LEN]; char *response; size_t sz; int r; if ( !tag || !(*tag) ) return ( ret ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; url[0] = NUL; cookie[0] = NUL; sz = MAX_CONTENT_SIZE; response = (char *)malloc( sz ); if ( !response ) return ( ret ); switch ( apiType ) { case DAPI_DELICIOUS: r = loginDelicious( userName, password, cookie ); if ( r ) sprintf( url, "https://secure.del.icio.us/settings/%s/tags/delete", userName ); break; case DAPI_BLUEDOT: /* Blue Dot には、いまのところ、この機能はない */ break; } if ( url[0] ) { char *p = sjis2utf( tag ); sprintf( request, "deltag=%s&" "submit=delete+tag", encodeURL( p ? p : tag ) ); setUpReceiveBuffer( response, sz ); http_postEx( url, "application/x-www-form-urlencoded", request, response, cookie ); if ( *response ) ret = TRUE; } free( response ); return ( ret ); }
BOOL setBundleOnDelicious( const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *bundle, /* (I) 「分類」の名前 */ const char *tags /* (I) タグ (空白区切りで複数個指定可能) */ ) { BOOL ret = FALSE; char *url; char *response; char *p; size_t sz; if ( !tags || !(*tags) || !bundle || !(*bundle) ) return ( ret ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; url = (char *)malloc( BUFSIZ * 2 ); if ( !url ) return ( ret ); sz = MAX_CONTENT_SIZE; response = (char *)malloc( sz ); if ( !response ) { free( url ); return ( ret ); } memset( url, 0x00, BUFSIZ * 2 ); p = sjis2utf(bundle); sprintf( url, #ifdef BEFORE_20060809 "http://del.icio.us/api/tags/bundles/set" #else "https://api.del.icio.us/v1/tags/bundles/set" #endif "?bundle=%s", encodeURL( p ? p : bundle ) ); p = sjis2utf(tags); sprintf( url + strlen(url), "&tags=%s", encodeURL( p ? p : tags ) ); setUpReceiveBuffer( response, sz ); http_getBASIC( url, userName, password, response ); if ( response && *response ) { char *p = strstr( response, "<result" ); if ( p && (strstr( p + 7, "ok" ) != NULL) ) ret = TRUE; } free( response ); free( url ); return ( ret ); }
BOOL _putDiigo( const MyClip *mp, char *errorString, PARAM_PBM *args ) { // char *cookie = args->cookie; char *request = args->request; char *response = args->response; size_t sz = args->sz; PARAM_DIIGO *param = (PARAM_DIIGO *)(args->args); char url[MAX_URLLENGTH * 4]; char tmpTitle[2048]; char *p, *q; char *URLforJSON = NUL; char *tagsForJSON = NUL; char *bookmarks = NUL; int rate; BOOL ret = FALSE; errorString[0] = NUL; rate = 0; /* ブックマークを POST */ strcpy( url, "http://api2.diigo.com/bookmarks" ); p = any2utf( mp->title ); strcpy( tmpTitle, p ? p : mp->title ); // MM/Memo 形式の title を扱うための処理 rate = getEvaluation( tmpTitle, UTF8 ); q = tmpTitle; if ( rate == 0 ) if ( (mp->evaluation >= EVL_ONE) && (mp->evaluation <= EVL_FIVE) ) rate = mp->evaluation; // タイトル sprintf( request, "[{\"title\":\"%s\",", encodeContents( q ) ); // URL URLforJSON = encodeURLforJSON( mp->url ); sprintf( request + strlen(request), "\"url\":\"%s\",", URLforJSON ); // 公開・非公開 sprintf( request + strlen(request), "\"shared\":\"%s\",", mp->publication == PUB_PRIVATE ? "no" : "yes" ); // タグ (コンマ区切り) p = any2utf( mp->tags ); tagsForJSON = encodeTagsForJSON( p ? p : mp->tags ); sprintf( request + strlen(request), "\"tags\":\"%s\",", encodeContents( tagsForJSON ) ); // 説明 p = any2utf( mp->comment ); sprintf( request + strlen(request), "\"desc\":\"%s\"}]", encodeContents( p ? p : mp->comment ) ); bookmarks = (char *)malloc( strlen( request ) * 8 + 1 ); if ( bookmarks ) { sprintf( bookmarks, "bookmarks=%s", encodeURL(request) ); setUpReceiveBuffer( response, sz ); http_postBASIC( url, param->userName, param->password, "application/x-www-form-urlencoded", bookmarks, response ); if ( *response ) { p = strstr( response, "added" ); if ( p ) ret = TRUE; /* 登録成功 */ else { p = response; if ( (*p >= 'A') && (*p <= 'Z') && (strlen(p) <= 64) ) strcpy( errorString, p ); #ifdef _DEBUG else { FILE *fp = fopen( "./diigo.txt", "w" ); if ( fp ) { fputs( response, fp ); fclose( fp ); } } #endif } } } if ( bookmarks ) free( bookmarks ); if ( tagsForJSON ) free( tagsForJSON ); if ( URLforJSON ) free( URLforJSON ); return ( ret ); }
BOOL deleteEntryOnDeliciousAPI( DELICIOUS_API_TYPE apiType, /* (I) API 提供元 */ const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ const char *url /* (I) 削除するエントリの URL 要素 */ ) { BOOL ret = FALSE; char *target; char *response; size_t sz; if ( !url || !(*url) ) return ( ret ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; target = (char *)malloc( MAX_URLLENGTH + strlen( url ) * 3 ); if ( !target ) return ( ret ); sz = MAX_CONTENT_SIZE; response = (char *)malloc( sz ); if ( !response ) { free( target ); return ( ret ); } switch ( apiType ) { case DAPI_DELICIOUS: sprintf( target, "https://api.del.icio.us/v1/posts/delete" "?url=%s", encodeURL(url) ); break; case DAPI_BLUEDOT: sprintf( target, // "https://secure.bluedot.us/v1/posts/delete" "https://secure.faves.com/v1/posts/delete" "?url=%s", encodeURL(url) ); break; } setUpReceiveBuffer( response, sz ); http_getBASIC( target, userName, password, response ); if ( response && *response ) { char *p = strstr( response, "<result" ); if ( p ) ret = TRUE; } #if 0 if ( ret == FALSE ) { if ( apiType == DAPI_DELICIOUS ) { // private saving の場合 // -- エントリページを取得 sprintf( target, "http://del.icio.us/url/%s", encodeURL(url) ); setUpReceiveBuffer( response, sz ); http_getBASIC( target, userName, password, response ); if ( response && *response ) { // -- delete 用 URL を抽出 char *p = strstr( response, "?delete=&key=" ); if ( p ) { char delKey[BUFSIZ]; char *q = strchr( p, '"' ); if ( q ) { strncpy( delKey, p, q - p ); delKey[q - p] = NUL; sprintf( target, "http://del.icio.us/%s%s", userName, delKey ); // -- delete 実行 http_getBASIC( target, userName, password, response ); if ( response && *response ) { ret = TRUE; } } } } } } #endif free( response ); free( target ); return ( ret ); }
long getListOfDatesOnDeliciousAPI( DELICIOUS_API_TYPE apiType, /* (I) API 提供元 */ const char *userName, /* (I) ユーザ名 */ const char *password, /* (I) パスワード */ char *tag, /* (I) タグ */ long *numOfDates, /* (I) 取得する情報数 */ /* (O) 取得した情報数 */ DELICIOUS_DATES *dates /* (O) 取得した情報 */ ) { long num = 0; char url[BUFSIZ]; char *response; size_t sz; if ( !numOfDates || (*numOfDates <= 0) || !dates ) return ( num ); if ( !userName ) userName = xmlrpc_p->userName; if ( !password ) password = xmlrpc_p->password; sz = MAX_CONTENT_SIZE; response = (char *)malloc( sz ); if ( !response ) return ( num ); switch ( apiType ) { case DAPI_DELICIOUS: strcpy( url, "https://api.del.icio.us/v1/posts/dates" ); break; case DAPI_BLUEDOT: // strcpy( url, "https://secure.bluedot.us/v1/posts/dates" ); strcpy( url, "https://secure.faves.com/v1/posts/dates" ); break; } if ( tag && *tag ) sprintf( url + strlen(url), "?tag=%s", encodeURL(tag) ); setUpReceiveBuffer( response, sz ); http_getBASIC( url, userName, password, response ); if ( response && *response ) { char *p = strstr( response, "<dates tag=\"" ); if ( p ) { char *q, *r; long l; int yyyy, mm, dd; time_t t = time( NULL ); struct tm *tm = localtime( &t ); yyyy = tm->tm_year + 1900; mm = tm->tm_mon + 1; dd = tm->tm_mday; p += 12; while ( ( q = strstr( p, "<date " ) ) != NULL ) { q += 6; /* count */ dates[num].count = 0; r = strstr( q, "count=\"" ); if ( r ) { r += 7; l = atol( r ); dates[num].count = l; } /* date */ dates[num].yyyy = yyyy; dates[num].mm = mm; dates[num].dd = dd; r = strstr( q, "date=\"" ); if ( r ) { r += 6; l = atol( r ); dates[num].yyyy = l; r += 5; if ( *r == '0' ) r++; l = atol( r ); dates[num].mm = l; while ( *r && (*r != '-') ) r++; if ( *r == '-' ) { r++; l = atol( r ); dates[num].dd = l; } } num++; if ( num >= *numOfDates ) break; p = strchr( q, '>' ); if ( !p ) break; } *numOfDates = num; } } free( response ); return ( num ); }