Twitterタイムライン取得もどきサンプル
meitsu@free-logic
Program notes for myself
「rails3」タグが付けられている投稿
認証が完了したのでタイムラインを取得するためにcontrollerに追記していく.
app/controllers/index_controller.rb
def index
#ここから
return unless session[:oauth]
access_token = OAuth::AccessToken.new( self.class.consumer, session[:oauth][:token], session[:oauth][:secret] )
rubytter = OAuthRubytter.new(access_token)
begin @tweets = rubytter.friends_timeline rescue Rubytter::APIError session.delete :oauth end
#ここまで追加
end
認証されていない場合は認証ボタンのみを表示させるようにする.
されている場合は,sessionに保存していたaccess tokenを取り出してOAuth::AccessTokenのインスタンスを作成する.
このインスタンスからツイートしたり,タイムラインを取得することができる.
フレンドタイムラインの取得はfriends_timelineメソッドである.
ユーザがaccess tokenを無効化したりアクセス拒否をした場合はRubytter::APIError exceptionが返される.
その場合はsessionのaccess tokenを消去する.
app/views/index/index.html.erb
<% unless session[:oauth] %>
<%= form_tag :oauth, method: :get do |f| %>
<%= submit_tag("apply") %>
<% end %>
<% else %>
<div id="friends_timeline">
<dl>
<% @tweets.each do |t| %>
<dt><%= image_tag t.user.profile_image_url, size: '40x40' %></dt>
<dd><%= t.user.name %></dd>
<dd><%= t.text %></dd>
<% end %>
</dl>
</div>
<% end %>
これで認証されている場合はタイムイランを取得することができる.
サンプル画像等は参考サイトを参照にしてみてね.
callbackアクションを作成
Twitterから認証されたときの後処理を行うcallbackアクションを作成
app/controller/index_controller.rb
def callback
#ここから
if params[:denied] session.delete :oauth else request_token = OAuth::RequestToken.new( self.class.consumer, session[:request_token][:token], session[:request_token][:secret] ) access_token = request_token.get_access_token( {}, oauth_token: params[:oauth_token], oauth_verifier: params[:oauth_verifier] ) session[:oauth] = { token: access_token.token, secret: access_token.secret } end session.delete :request_token redirect_to :action => :index
#ここまで追加
end
まず認証が拒否された場合,deniedパラメータが送られてくる.
セッションに保存されたoAuth::Request Takenがあった場合,削除する.indexにredirectをかける.
認証された場合,セッションに保存しておいたrequest tokenとrequest sercretを復元してOAuth::RequestTokenのインスタンスを作成する.
oauth_tokenとoauth_veriferパラメータが送られてくるのでOAuth::RequestTokenのget_access_tokenメソッドに渡して,access token(oauth token)と交換する.
これでOAuth::AccessTokenインスタンスが取得可能となる.
request tokenは用済みであるのでsessionから削除し,代わりにaccess tokenとaccess sercretをsessionに保存する.
これ以降はaccess tokenを使用してtwitterにアクセスすることができる.
redirectの方法が参考サイトと異なるので注意
ここまでの作業でOAuthでtwitterに認証してもらうことが可能となったので試してみる.
認証後,callbackアクションを経由してindexへ戻ることが成功したら完了である.
認証ボタンを押したときTwitterへ転送するためのOAuthアクションを記述
app/controllers/index_controller.rb
def oauth
#ここから
callback_url = "http://#{request.host_with_port}/callback" request_token = self.class.consumer.get_request_token(oauth_callback: callback_url) session[:request_token] = { token: request_token.token, secret: request_token.secret } redirect_to request_token.authorize_url
#ここまで追加
end
request tokenの発行のためにOAuth::Comsumerのインスタンスからget_requset_tokenメソッドを呼び出す.これでOAuth::RequestTokenを取得することができる.
このときにcallback先を指定する.発行して貰ったrequest tokenは後に使用するので,tokenとsercretをセッションに保存しておく.認証するためのURLはOAuth::RequestTakenのauthorize_urlメソッドで取得可能なのでURLにリダイレクトさせる.
Twitterアプリケーション登録
アクセス→ログイン→Create Application
Nameはアプリケーションの名前
Descriptionは適当な説明
WebSiteは使用するwebsite
Callback URLはweb applicationでcallbackされるURL
昔はbrowser applicationとcliant applicationが選択可能であったが
callback URLを入力することでブラウザアプリケーションとして設定されるようになったらしい
website callback URLは適当で良い
参考サイトに従ってhttp://example.comにした
create後,settingsでapplication typeでread/writeの設定ができる
今後のことも考えてRead and Writeとした
Detailsに記述されている
“Consumer key” と “Consumer secret” を覚えておく
applicationcontrollerにconsumerのインスタンスを作成するメソッドを記述
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base protect_from_forgery
#ここから protected def self.consumer OAuth::Consumer.new( 'consumer key', 'consumer secret', {site: "http://api.twitter.com"} ) end #ここまで追加 end
参考サイトでは “http://twitter.com” となっているが
現在は “https://api.twitter.com/” となっているので注意
Twitterにアプリを認証してもらうボタンを作成
app/views/index/index.html.erb
<%= form_tag :oauth, method: :get do |f| %>
<%= submit_tag("apply") %>
<% end %>
くれぐれも “=” を忘れないように
public/index.htmlが不要となったので消す
$ rm public/index.html
一度railsを起動してボタンが表示されているか確認
$ rails s
ボタンが表示され,押したときにOAuthがどうのこうとエラーがでても今は大丈夫