任意のWebページにはてなスターの ☆ をつけるプログラム

観測気球

収集物の記録書庫 a data archive of collection -- collectible toys

[要旨] ついすたを chirrup でもやってみたくて、書いてみました。
[キーワード] はてなスター,ついすた,Twitter

« ソーシャルブックマーク管理ツール bookey 0.40版 ― FC2BOOKMARK と Buzzurl 関連の修正を実施 | トップページ | インフォシークのラッキーサーチ »

2007.08.24

任意のWebページにはてなスターの ☆ をつけるプログラム

ついすた」機能を chirrup に取り込むための前段階として、「任意のWebページにはてなスターの ☆ をつける」コードを C で書いてみました。「ついすた」というのは、Twitter の任意の「発言」に☆をつける機能のことです。Twitter と「はてなスター」のコラボレーションですね。

chirrup や bookey で使っているライブラリ(xmlRPC.dll)を使うことを前提にしたコードになってますが、このライブラリがどういうものかは知らなくても、何をやってるかは、以下のソースコードを見ていただければわかると思います。「はてなスター」であれこれしたい人の参考になればいいんですが。

ということで、以下、ソースコードです。


#include "xmlRpc.h"
#include <time.h>

char    *getTitle( const char * url ); // Webページの title を取得
char    *any2utf( const char *p );     // 任意の charSet から UTF-8 に変換

// はてなスターにログインする
BOOL
loginHatenaStar(
    const char *username,   // (I) はてなID
    const char *password,   // (I) パスワード
    char       *cookie )    // (O) クッキー
{
    int     ret = FALSE;
    char    *request;
    char    *response;
    char    url[MAX_URLLENGTH];
    size_t  sz = MAX_CONTENT_SIZE * 2;

    if ( !cookie || !username || !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 );

    strcpy( url,
            "https://www.hatena.ne.jp/login?"
            "location=http%3A%2F%2Fs.hatena.ne.jp%2F" );
    setUpReceiveBuffer( response, sz );
    http_getEx( url, response, cookie );

    strcpy( url, "https://www.hatena.ne.jp/login" );
    setTargetURL( url );
    sprintf( request,
             "name=%s&"
             "password=%s&"
             "persistent=1&"
             "location=http://s.hatena.ne.jp/",
             username, password );
    setUpReceiveBuffer( response, sz );
    http_postEx( url, "application/x-www-form-urlencoded",
                 request, response, cookie );
    if ( *response ) {
        if ( strstr( response, sjis2utf("ログイン中です") ) != NULL ) {
            setUpReceiveBuffer( response, sz );
            http_getEx( "http://s.hatena.ne.jp/", response, cookie );
            if ( *response ) {
                if ( strstr( response, sjis2utf(">ログアウト</a>") ) != NULL )
                    ret = TRUE;     /* ログイン成功 */
            }
        }
    }

    free( response );
    free( request  );

    return ( ret );
}



// targetURL で指定したWebページに ☆ をつける
BOOL
setHatenaStar( const char *targetURL,   // (I) ☆をつけたいWebページURL
               const char *username,    // (I) はてなID
               const char *password )   // (I) パスワード
{
    size_t  sz = MAX_CONTENT_SIZE;
    char    *request;
    char    *response;
    char    *url;
    char    cookie[MAX_COOKIE_LEN];
    BOOL    r;
    BOOL    ret = FALSE;

    memset( cookie, 0x00, MAX_COOKIE_LEN );
    request  = (char *)malloc( sz );
    if ( !request )
        return ( ret );
    response = (char *)malloc( sz );
    if ( !response ) {
        free( request );
        return ( ret );
    }
    url = (char *)malloc( strlen( targetURL ) + MAX_CONTENT_SIZE );
    if ( !url ) {
        free( response );
        free( request );
        return ( ret );
    }

    // はてなスターにログイン
    r = loginHatenaStar( username, password, cookie );
    if ( r ) {
        time_t      t = time( NULL );
        struct tm   *tm = localtime( &t );
        char        timeStr[BUFSIZ];

        strftime( timeStr, BUFSIZ - 1,
                  "%a %b %d %H:%M:%S UTC+0900 %Y", tm );

        // rks を取得
        setUpReceiveBuffer( response, sz );
        sprintf( url,
                 "http://s.hatena.ne.jp/entries.json?"
                 "uri=%s&"
                 "callback=Ten.JSONP.callback&",
                 encodeURL( targetURL ) );
        sprintf( url + strlen(url),
                 "%s",
                 encodeURL( timeStr ) );
        http_getEx( url, response, cookie );
        if ( *response ) {
            char        rks[BUFSIZ];
            char        title[BUFSIZ];
            const char  *p, *q;

            p = strstr( response, "\"rks\":\"" );
            if ( p ) {
                p += 7;
                q = strchr( p, '"' );
                if ( q ) {
                    strncpy( rks, p, q - p );
                    rks[q - p] = NUL;
                }

                // ☆をつける
                t = time( NULL );
                tm = localtime( &t );
                strftime( timeStr, BUFSIZ - 1,
                          "%a %b %d %H:%M:%S UTC+0900 %Y", tm );

                strcpy( title, getTitle( targetURL ) );

                setUpReceiveBuffer( response, sz );
                sprintf( url,
                         "http://s.hatena.ne.jp/star.add.json?uri=%s&",
                         encodeURL( targetURL ) );
                sprintf( url + strlen(url),
                         "title=%s&"
                         "rks=%s&"
                         "callback=Ten.JSONP.callback&",
                         encodeURL( any2utf(title)), rks );
                sprintf( url + strlen(url),
                         "%s",
                         encodeURL( timeStr ) );
                http_getEx( url, response, cookie );
                if ( *response ) {
                    if ( strstr( response, username )      ||
                         strstr( response, "\"name\":\"" )    )
                        ret = TRUE;
                }
            }
        }
    }

    free( url );
    free( response );
    free( request );

    return ( ret );
}

投稿者: tsupo 2007.08.24 午後 08:29 | 固定リンク | このエントリーをはてなブックマークに追加 | このエントリを del.icio.us に登録 このエントリの del.icio.us での登録状況 | このエントリを Buzzurl に追加このエントリの Buzzurl での登録状況 | このエントリをlivedoorクリップに登録 このエントリのlivedoorクリップでの登録状況 このエントリをlivedoorクリップに登録している人の数 | 酢鶏巡回中

楽天市場


プログラミング」カテゴリ内の最近の記事

品揃え豊富で安い!NTT-X Store


アマゾンわくわく探検隊

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/6737/16225512

この記事へのトラックバック一覧です: 任意のWebページにはてなスターの ☆ をつけるプログラム:

» Twitter クライアント chirrup 1.51版 ― Twitterと「はてなスター」のコラボレーション「ついすた」に対応しました from 観測気球
bookey に先立って「ついすた」機能を実装してみていた chirrup ですが、だいたい安定してきましたので、この辺で最新版を公開することにします。 続きを読む

受信: 2007.08.29 午前 09:18

» ソーシャルブックマーク管理ツール bookey 0.42版 ― 「はてなスター」に対応しました from 観測気球
今回の目玉は「はてなスター」対応。「はてなスター」未設置のサイトにも ☆ をつけることができます。ただし、☆ のつけすぎに注意(結構、習慣性があるようです)。 続きを読む

受信: 2007.08.29 午前 09:22

コメント

コメントを書く




※イタズラ防止のため、メールアドレスを入力しないと投稿できません。

次からのコメント入力の手間を省くために、名前やメールアドレスをcookieに記憶しますか?


URL を入力すると、その URL にリンクがはられます。
なお、メールアドレスは公開されません。ご安心ください。


ワード

ニッセン

fujisan.co.jp

楽天市場