CodeZine(コードジン)

特集ページ一覧

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

第4回

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/08/27 14:00
目次

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クライアントは完成です。実行してみてください。うまくタイムラインを表示できたでしょうか?


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

著者プロフィール

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

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

バックナンバー

連載:Ruby on Rails + Curl
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5