Home > Computer | Internet | Review > Sinatra + OAuth + Twitter で遊んでみる

Sinatra + OAuth + Twitter で遊んでみる

IMG_0532 IMG_0536

今日は一日洗濯していた。

洗濯して思ったのだけど、実家暮らしや嫁さんがいるのならともかく、独り暮らしだったら週休二日は必要だなーと。お休みがまるまる一日家事でつぶれるからね。もちろん、家事をさぼって二日ごろごろしてもいいのだけど、それはそれで後で泣きを見るわけで。社会の分断、個人主義化、核家族化、そういったものが週休二日制を後押ししたのだなとなんとなく考える。

そのついでに、ちょっとWebアプリを作って遊んだ。
最近のつぶやきを取得して、つぶやきに費やした文字数の平均を出すだけの、ほんの Hello! World な内容だけど、やってみるといろいろ細かいところで躓くものだ。

#start.rb

require 'rubygems'
require 'sinatra'
require 'oauth'
require 'twitter'

helpers do
  include Rack::Utils
  alias_method :h, :escape_html
end

configure do # 初期化
  use Rack::Session::Cookie, :secret => Digest::SHA1.hexdigest(rand.to_s)
  KEY = "***********"
  SECRET = "************"

  set :public, File.dirname(__FILE__) + '/public'
end

before do
  if session[:access_token]
    twitter_oauth = Twitter::OAuth.new(KEY, SECRET)
    twitter_oauth.authorize_from_access(
      session[:access_token], session[:access_token_secret])
    @twitter = Twitter::Base.new(twitter_oauth)
  else
    @twitter = nil
  end
end

def base_url
  default_port = (request.scheme == "http") ? 80 : 443
  port = (request.port == default_port) ? "" : ":#{request.port.to_s}"
  "#{request.scheme}://#{request.host}#{port}"
end

def oauth_consumer
  OAuth::Consumer.new(KEY, SECRET, :site => "http://twitter.com")
end

get '/' do
  erb %{ <p><a href="/request_token">Please Login via Twitter OAuth</a></p> }
end

get '/request_token' do
  callback_url = "#{base_url}/access_token"
  request_token = oauth_consumer.get_request_token(:oauth_callback => callback_url)
  session[:request_token] = request_token.token
  session[:request_token_secret] = request_token.secret
  redirect request_token.authorize_url
end

get '/access_token' do
  request_token = OAuth::RequestToken.new(
    oauth_consumer, session[:request_token], session[:request_token_secret])
  begin
    @access_token = request_token.get_access_token(
      {},
      :oauth_token => params[:oauth_token],
      :oauth_verifier => params[:oauth_verifier])
  rescue OAuth::Unauthorized => @exception
    return erb %{ oauth failed: <%=h @exception.message %> }
  end
  session[:access_token] = @access_token.token
  session[:access_token_secret] = @access_token.secret

  redirect '/count'
end

get '/count' do
  redirect '/' unless @twitter

  @length = 0
  @count  = 0

  @twitter.user_timeline.each do |twit|
    @count  = @count + 1
    @length = @length + twit.text.split(//u).length
  end

  erb %{ <p><%=h @length * 1.0 / @count %> characters/tweet !</p> }
end

ほとんどまるまる http://www.machu.jp/diary/20090818.html#p01 を参照させていただいた。

image

Consumer Key と Consumer Secret の値は、

Twitter / Applications http://twitter.com/oauth_clients/

で取得できる。

追加でやったことは以下の3点。

1. レイアウトを利用

レイアウトを /views/lauout.erb へ作成。サイト共通の部品をまとめておける。独自の内容は、 <%= yield %> のなかへ挿入される仕組み。テンプレートエンジンは、今回は ERB で。そんなにたいそうな量じゃないしね(スタイルシートすら埋め込みだ!)。

#/views/lauout.erb

<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang='ja-JP' xml:lang='ja-JP' xmlns='http://www.w3.org/1999/xhtml'>

<head>
  <title>Tweet Average - How much characters do you use in a tweet ?</title>
  <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no">
</head>

<body style="">
  <div style="width: 300px; margin-left: auto; margin-right: auto; font-family: Meiryo, Sans-Serif; font-size: 12pt; background: url(/image/frontpage-bird.png) no-repeat right top;">
    <div id="header" style="border-bottom: 1px solid gray; padding-top: 1em; padding-bottom: 1em;">
      <h1 style="font-size: 16pt;"><a href="/" style="text-decoration: none;">Tweet Average</a></h1>
      <p style="font-size: 9pt;">How much characters do you use in a tweet ?</p>
    </div>

    <div id="content" style="padding: 1em;">
    <%= yield %>
    </div>

    <div id="footer" style="border-top: 1px solid gray; padding-top: 1em; font-size: 9pt;">
    <p>code by <a href="http://twitter.com/daruyanagi">daruyanagi</a>;
    powered by <a href="http://www.sinatrarb.com/">sinatra</a>.</p>
    </div>
  </div>
</body>

</html>

2. set :public, File.dirname(__FILE__) + ‘/public’

スタティックなファイルを参照する場合、このように公開フォルダを指定しておく。たとえば、デフォルトでは /image/sample.png を参照しようとしても、 Sinatra がルーティング、メソッドを探そうとしてエラーになる。そこで、公開フォルダ(/public)を指定しておく。そうすれば、/public/image/sample.png で参照できるようになる。

これは、レイアウトのスタイルシートで背景画像を参照する時に利用した。

3. iPhone 対応

メタタグで iPhone でのレイアウトを調整。これには、 ViewPort という仕組みがあるそうだ。ほうっておくと、iPhone は横幅980pxとみなしてレンダリングしようとするので、それを抑制する(ちなみに、Webページは幅300pxで作ってある。これだと、ちとPC向けが厳しい感じだw)。

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no">

詳細は http://www.projectdd.jp/2008/07/viewport_sample.html を参照。

あとは、なんという話題でもないけど、文字数のカウント。

twit.text.split(//u).length

ruby にはバイト数のカウントをする size、length があるけれど、文字数をカウントすることはできないようだ。なので、文字でスプリットして、返ってきた配列の数を数えている。 ruby では定番の処理のようだ。

ソースコードは BOMなしの UTF-8 で保存して、 ruby -Ku start.rb で実行。

blog comments powered by Disqus

Home > Computer | Internet | Review > Sinatra + OAuth + Twitter で遊んでみる

My Friend Feed

http://friendfeed.com/daruyanagi

Google Analyticator

615
 Unique Visitors 
 (1 day) 
Powered By Google Analytics

Return to page top