Coral Reefs

- ケアンズの海が好き -

お手軽簡単!30分でできるTwitterアプリ

f:id:coralreefs:20130511203029j:plain


こんにちは、@coralreefs1です。

今回はTwitterAPIを使って何か作りたい!という方にさっくりとベースの部分を作成する方法をご紹介します。


環境


Twitterにアプリを登録


まずは https://dev.twitter.com/ にて自分のTwitterアカウントを使ってサインイン! ログイン後、右上のアイコンの My applications をクリックします。


f:id:coralreefs:20130511144115p:plain


画面右側の Create a new application をクリック。


f:id:coralreefs:20130511144407p:plain


すると、アプリの詳細を入力する画面が出てきます。


f:id:coralreefs:20130511144751p:plain


Name はアプリ名、Descriptionは紹介文、Websiteは http://192.168.0.1:8080 として、Callback URL はとりあえず適当なURLでOkです。


登録後、以下の画面に表示される、Consumer key と Consumer secret の値を後ほど使います。この2つの値は外部の人に漏れてしまわないよう注意です!


f:id:coralreefs:20130511150403p:plain


TwitterにOAuth認証ログイン


下準備は整ったので、ユーザーがTwitterにログインできるようにしましょう。 まずはプロジェクトの作成。


 $ rails new TwitterTest


Gemfile には twitter と omniauth-twitter を追加します。


source 'https://rubygems.org'
ruby '2.0.0'

gem 'rails', '4.0.0.beta1'
gem 'sqlite3'

gem 'twitter'
gem 'omniauth-twitter'

group :assets do
  gem 'sass-rails',   '~> 4.0.0.beta1'
  gem 'coffee-rails', '~> 4.0.0.beta1'

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.0.1'


bundle を実行して。


$ bundle


Twitter にアプリを登録した際に表示された Consumer key と Consumer secret を、 以下の2つのファイルに設定します。


  • config/initializers/omniauth.rb
  • config/initializers/twitter.rb


# config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, "Consumer key", "Consumer secret"
end


# config/initializers/twitter.rb

Twitter.configure do |config|
  config.consumer_key = "Consumer key"
  config.consumer_secret = "Consumer secret"
end


Controller の作成。


$ rails g controller tweets


中身はとりあえずindexのみ追加しときます。

class TweetsController < ApplicationController                                             
  def index
  end
end


config/routes.rb にルーティングを追加。


TwitterTest::Application.routes.draw do
  root to: 'tweets#index'
  resources :tweets
end


トップページの app/views/tweets/index.html.erb を追加します。 中身はとっても簡単。


<h1>こんにちはこんにちは!</h1>
<a href="/auth/twitter">Twitter にサインインする</a>
<a href="/signout">サインアウト</a>


以上でTwitterにログインできるようになりました!


ログイン後のコールバック対応


ユーザーがTwitterにログインすると、/auth/twitter/callback のURLがコールバックされるので、こちらを作りましょう。


$ rails g controller sessions


SessionsController の create では、DBのUserテーブル(後ほど作成します)をチェックし、ユーザーが登録されていない場合、新規登録します。


class SessionsController < ApplicationController
  def create
    auth = request.env['omniauth.auth']

    user = User.find_by_provider_and_uid(auth['provider'], auth['uid'])
    user ||= User.create_with_omniauth(auth)

    session[:user_id] = user.id
    redirect_to root_url, notice: 'login'
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, notice: 'logout'
  end
end


コールバックのルーティングを設定します。


TwitterTest::Application.routes.draw do
  root to: 'tweets#index'
  resources :tweets

  get "/auth/:provider/callback" => "sessions#create"
  get "/signout" => "sessions#destroy"
end


Userモデルを作成します。


$ rails g model user provider:string uid:string name:string screen_name:string token:string secret:string


DBをマイグレート。


$ rake db:migrate


app/models/user.rb ではTwitterのユーザー情報を保存します。 そして、client メソッドで、ユーザーのツイートやフォロワー等の情報にアクセスするための、クライアントを取得します。


class User < ActiveRecord::Base
  def self.create_with_omniauth auth
    create! do |user|
      user.provider    = auth["provider"]
      user.uid            = auth["uid"]
      user.name        = auth["info"]["name"]
      user.screen_name = auth["info"]["nickname"]
      user.token        = auth['credentials']['token']
      user.secret        = auth['credentials']['secret']
    end
  end

  def client
    Twitter::Client.new(oauth_token: token, oauth_token_secret: secret)
  end
end


最後にApplicationController にカレントユーザーを設定するメソッドを追加。


class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_filter :set_current_user

  private

  def set_current_user
    @current_user ||= User.find session[:user_id] if session[:user_id] 
  end
end


以上でコールバックの処理が完成です!


ツイートしたり一覧を表示したり


準備ばっちしOKです! あとはTwitterのリストを取得するもよし、ツイートするもよしです。


# ツイートする
@current_user.client.update 'test tweet'

# フォロワーを取得する
@current_user.client.followers

# タイムラインを取得する
@current_user.client.user_timeline


例外処理やテストなどは端折っちゃってますが、以上でTwitterにアクセスできるようになりました!

TwitterAPIはアクセス回数の制限があるので、テストでばしばしAPI叩いてると、すぐリミットに達しちゃうので注意です。