meitsu@free-logic

Program notes for myself

rails3」タグが付けられている投稿

3月 23

Twitterタイムライン取得もどきサンプル


認証が完了したのでタイムラインを取得するために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へ戻ることが成功したら完了である.


3月 20

認証ボタンを押したとき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アプリケーション登録

https://dev.twitter.com/apps

アクセス→ログイン→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がどうのこうとエラーがでても今は大丈夫


ページ 1 / 2