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