Пример #1
0
 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);
 }
Пример #2
0
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 );
}
Пример #3
0
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;
                }
            }
        }
    }
}
Пример #4
0
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 );
}
Пример #5
0
/*
 *  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 );
}
Пример #6
0
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 );
}
Пример #7
0
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 );
}
Пример #8
0
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 );
}
Пример #9
0
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 );
}
Пример #10
0
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 );
}
Пример #11
0
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 );
}
Пример #12
0
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;
}
Пример #13
0
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;
                    }
                }
            }
        }
    }
}
Пример #14
0
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 );
}
Пример #15
0
/* 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 );
}
Пример #16
0
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 );
}
Пример #17
0
/* 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 );
}
Пример #18
0
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 );
}
Пример #19
0
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 );
}
Пример #20
0
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 );
}
Пример #21
0
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 );
}
Пример #22
0
// 発言を投稿
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 );
}
Пример #23
0
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 );
}
Пример #24
0
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 );
}
Пример #25
0
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 );
}
Пример #26
0
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 );
}
Пример #27
0
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 );
}
Пример #28
0
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 );
}
Пример #29
0
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=&amp;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 );
}
Пример #30
0
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 );
}