お手軽簡単!30分でできるTwitterアプリ
こんにちは、@coralreefs1です。
今回はTwitterのAPIを使って何か作りたい!という方にさっくりとベースの部分を作成する方法をご紹介します。
環境
Twitterにアプリを登録
まずは https://dev.twitter.com/ にて自分のTwitterアカウントを使ってサインイン! ログイン後、右上のアイコンの My applications をクリックします。
画面右側の Create a new application をクリック。
すると、アプリの詳細を入力する画面が出てきます。
Name はアプリ名、Descriptionは紹介文、Websiteは http://192.168.0.1:8080 として、Callback URL はとりあえず適当なURLでOkです。
登録後、以下の画面に表示される、Consumer key と Consumer secret の値を後ほど使います。この2つの値は外部の人に漏れてしまわないよう注意です!
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叩いてると、すぐリミットに達しちゃうので注意です。