SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Ruby on Rails + Curl(AD)

Curl+JRuby+Google App EngineでTwitter風アプリを作る
~ローカル環境構築編~

第4回

  • このエントリーをはてなブックマークに追加

Curlで作るTwitterクライアント

 最初にCurlを使い、Twitterの簡単なクライアントを作ってみましょう。Curlクライアントはそのままではインターネット上のサービスにはアクセスできません。そこでCurlコントロールパネルで、Curlコードをダウンロードするサーバに特権を与える必要があります。手順はセキュリティの設定(特権設定)を参考にしてください。

 さらにpublicディレクトリに置くライセンスキー「curl-license-5.dat」は Curl IDEディレクトリ内 C:¥Program Files¥Curl Corporation¥Surge¥8¥ide¥etc¥localhost-pro¥curl-license-5.dat を使ってください(連載第1回目でコピーしたライセンスファイルでは外部のサーバにはアクセスできません)。

Twitter API

 TwitterはAPIを公開しており、Webページ以外からの利用ができます。これらのAPIを使い、Curl からTwitterサービスをアクセスすることにします。Twitter APIの仕様はTwitter API Wiki / Twitter API Documentationに公開されています。また非公式の日本語訳が観測気球 Twitter API 仕様書 (勝手に日本語訳シリーズ) にあります。

 TwitterのAPIはRESTに準拠しています。またデータ形式もXMLやJSONに対応しています。 Twitterは当初Ruby on Railsで作られたので、APIもとてもRailsらしいスタイルになっています(現在はユーザーの増加に対応するため、つぶやき処理はRuby on Railsではないようです)。

 さて、Twitterのホームページで表示される友人(フォローしている人)の最近のつぶやきは、「http://twitter.com/statuses/friends_timeline.json」URLをGETすると取得できます(データ形式がJSONの場合)。ただし、GET時にはBasic認証やOAuth認証が必要です。取得したデータはHashを持つ配列になっています。

{"favorited"=>false, "created_at"=>"Sat Aug 15 05:46:29 +0000 2009", "truncated"=>false, "text"=>"...発言....", 
"id"=>3323897846, "in_reply_to_user_id"=>nil, "source"=>"web", "in_reply_to_screen_name"=>nil, 
"user"=>{"profile_sidebar_border_color"=>"87bc44", "name"=>"Yuumi Yoshida", "profile_sidebar_fill_color"=>"e0ff92", 
"profile_background_tile"=>false, "location"=>"\350\207\252\347\224\261\343\201\214\344\270n230,Tokyo", 
"created_at"=>"Tue Aug 21 15:15:41 +0000 2007", 
"profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/20404812/kurage_normal.jpg", 
"profile_link_color"=>"0000ff", "url"=>"http://d.hatena.ne.jp/yuum3/", "favourites_count"=>5, "id"=>8331722, 
"utc_offset"=>32400, "profile_text_color"=>"000000", "protected"=>false, "followers_count"=>98, "notifications"=>nil, 
"time_zone"=>"Tokyo", "verified"=>false, "profile_background_color"=>"9ae4e8", "description"=>"...自己紹介...", 
"profile_background_image_url"=>"http://static.twitter.com/images/themes/theme1/bg.gif", "statuses_count"=>76, 
"friends_count"=>83, "screen_name"=>"yuumi3", "following"=>nil}, "in_reply_to_status_id"=>nil}

 このHashには「text=>発言」「created_at=>発言日時」「user=>発言者プロフィール」などが入っています。発言者プロフィールのHashには「screen_name=>ユーザー名」「profile_image_url=>アイコンのURL」などが入っています。Twitterクライアントではこれらの情報を取得し、表示すればよさそうです。

Curlを使ったクライアント

 Curlで作った、簡単なTwitterクライアントのコードを説明します。

サーバ通信部

 http://twitter.com/statuses/friends_timeline.json をアクセスすることでJSON形式のデータが取得できます。また下のコードの set-http-authenticationプロシージャでBASIC認証のログイン名、パスワードを指定しています。ログイン名 XXXXXX、パスワード YYYYYY のところは、あなたのTwitterログイン名、パスワードに置き換えてください。

{curl 7.0 applet}
{curl-file-attributes character-encoding = "utf8"}

{import * from CURL.IO.JSON}

{let server_url = "http://twitter.com/"}
{let json_data_path = "statuses/friends_timeline.json"}
{let login = "XXXXXX"}
{let password = "YYYYYY"}

{set-http-authentication {url server_url}, login, password}

データ取得部分

 取得されるデータの形式はTwitterとほぼ同じですが項目は少なくなっています、ここでは以下の情報のみを取り出しています。

{text=>発言、user=>{screen_name=>ユーザー名、profile_image_url=>アイコンのURL}}

 コードは次のようになります。

{let twittersJsonValue: JsonValue =
    {JsonValue-parse
        {url server_url & "statuses.json"}
    }
}

{let twitters: RecordSet =
    {RecordSet
        {RecordFields
            {RecordField "screen_name", caption = "", domain = String},
            {RecordField "text", caption = "", domain = String},
            {RecordField "icon", caption = "", domain = String}
        }
    }
}

{define-proc public {add-rec
                        text: String,
                        screen_name: String,
                        profile_image_url: String
                    }: void
    let new-rec: Record = {twitters.new-record}
    {new-rec.set "text", text}
    {new-rec.set "screen_name", screen_name}
    {new-rec.set "icon", profile_image_url}
    {twitters.append new-rec}
}

{for twitter: JsonObject in twittersJsonValue do
    let found?: bool = false
    let text: String = {String}
    let screen_name: String = {String}
    let profile_image_url: String = {String}

    let user: JsonObject = {twitter.get "user"}
    set (text, found?) = {twitter.get-if-exists "text"}
    set (screen_name, found?) = {user.get-if-exists "screen_name"}
    set (profile_image_url, found?) = {user.get-if-exists "profile_image_url"}
    {if found? then
        {add-rec text, screen_name, profile_image_url}
    }
}

表示部分

 取得したデータをRecordGridを使って表示しています。発言者のアイコン画像を表示する部分は、Curl IDE付属ドキュメント「データ レコードとグリッド」のカスタムセルの作成を参考に、アイコンのURLから画像を読み込んでセルのバックグラウンドに設定しています。拡張子と実際の画像形式が異なる場合など、画像が表示できないこともあります。

{define-class public open IconCell
  {inherits StandardRecordGridCell}
  
  field private icon:Frame = 
      {Frame width={make-elastic}, height={make-elastic}}

  {constructor public {default}
    {construct-super}
    set self.height = 48px
    {self.add-internal self.icon}
    set self.cells-take-focus? = self.can-update?
  }
  
  {method public open {refresh-data}:void
    let (data:String, valid?:bool) = {self.get-formatted-data}
    {try
        set self.icon.background = {url data}
     catch e:Exception do
        {unset self.icon.background}
        {output "icon get error " & e.message & " " & data }        
    }
  }
}

{value
    {RecordGrid
        width=20cm,
        height=12.7cm,
        editable? = false,
        record-source = twitters,
        {RecordGridColumn  "icon", width = 48px, 
                column-resizable? = false, cell-spec = IconCell},
        {RecordGridColumn  width = 3cm, "screen_name"},
        {RecordGridColumn  width = 15cm, "text"}
    }
}

 これだけでTwitterのつぶやきを受信できるCurlクライアントは完成です。実行してみてください。うまくタイムラインを表示できたでしょうか?

次のページ
Twitter風サービスの構築

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Ruby on Rails + Curl連載記事一覧

もっと読む

この記事の著者

吉田裕美(ヨシダユウミ)

有限会社 EY-Office 取締役CADのベンチャー企業でCADのコア部分や図面管理システムなどの開発に従事した後、独立しJava,Ruby,PerlでWebアプリを中心に開発してきた。現在は殆どの開発はRuby on Rails。ここ数年はソフトウェアエンジニアの教育に興味をもち、従来の知識偏重な教育ではなく現実の問題を解決できるエンジニアを育てる教育に注力している。またLisp等に関心...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4307 2009/09/24 15:08

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング