おもしろツイート投稿サイト Twippy オープン!
お手軽簡単!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叩いてると、すぐリミットに達しちゃうので注意です。
Ruby認定試験Goldに合格する3つのポイント!
はじめまして、@coralreefs1です。
みなさんRubyは好きですか?
まだRuby書いたことない方、一度書いてみてください。楽しいですよ!
そんなRubyの理解を深める意味もあって認定試験(Gold)を取りましたが、これからRubyを使う方はこれで勉強してから実務に入ると、APIを調べる回数も減りますし、スムーズに開発を進められると思うのでオススメです。
とはいえ受験料が高いので、試験で抑えときたいポイントをご紹介!
出題範囲の問題配分はどんな感じ?
僕が受けた時はだいたい以下のような感じでした。
実行環境
- コマンドラインオプション
- 組み込み変数/定数
ここからは2、3問かな。試験直前に一覧を見直しておくと吉です。
文法
- 変数と定数
- 演算子
- ブロック
- 例外処理
- 大域脱出
15問くらい。変数と定数はクラス、サブクラス、インスタンス、特異クラス、モジュールを複雑に絡めて出題されるので、クラスオブジェクトのインスタンス変数と、インスタンスオブジェクトのインスタンス変数の違いなど、確認しときましょう。
ブロックは変数の束縛とブロック内でreturnやbreakされた時の動作を抑えときましょう。
例外クラスの階層は覚えとかないとです。NoMethodErrorはNameErrorのサブクラスなので、以下のコードはNoMethodErrorを表示します。
begin "John".cooking rescue NameError => e puts e.class # NoMethodError を表示 end
オブジェクト指向
- メソッドの詳細
- メソッドの可視性
- クラスの詳細
- クラスの継承
- モジュールの詳細
試験の肝の部分です。25問くらい。他の試験項目と絡めて出題されるので、試験の半分以上に関係してると思います。super と super() は動作が異なります。initialize を定義しない場合は親クラスの initialize が自動で呼ばれます。注意しとくことはたくさんありますが、メソッドと定数の探索経路、スコープに関しては確実に抑えときましょう。
組み込みライブラリ
- よく使用されるクラス(Object、Kernel、Module等)
- よく使用されるモジュール(Enumerable、Comparable等)
- 数値
- 正規表現
10問くらい。よく使われるクラスとモジュールはリファレンスに一度目を通しておきましょう。正規表現は基本的な使い方以外にも、 *? や +? などの最短マッチも出題されます。
標準添付ライブラリ
- よく使用されるライブラリ(socket、rdoc等)
3問くらい。全滅は痛いので、rdoc、yaml、stringio、date など、リファレンスで一通り目を通しときましょう。
あら?問題数の合計が50問以上ある?
ざっくり勘定ですごめんなさい。
抑えておきたい参考書
Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)
- 作者: 増井雄一郎,小川伸一郎,(株)日立ソリューションズ藁谷修一,川尻剛,牧俊男,Rubyアソシエーション,CTCテクノロジー(株)監修
- 出版社/メーカー: 技術評論社
- 発売日: 2012/02/22
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 204回
- この商品を含むブログ (9件) を見る
誤字がとっても多いですが、この本の模擬試験からも出題されたりするのでオススメ。
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2010/08/28
- メディア: 大型本
- 購入: 18人 クリック: 533回
- この商品を含むブログ (112件) を見る
メタプログラミングとありますが、試験範囲のオブジェクト指向に該当する内容が多く、特にRubyをこれから書こうという人はこれでメソッド、定数の探索経路や特異クラス、スコープについて理解しておくといいです。
何はともあれ irb
試験ではクラス、モジュール、インスタンスなどが複雑に組み合わされて出題されるので、単純に暗記して知識で解くよりも、自分でirb で似たような複雑な構成を書いて、細かく動作確認をしておくといいと思います。
おまけ
以下の2つのコード、include の位置を変えると表示される結果が異なります。
- コード1
module M @@x = 100 end class A @@x = 500 include M end module M puts @@x # 100 と表示される end class A puts @@x # 500 と表示される end
- コード2
module M @@x = 100 end class A include M @@x = 500 end module M puts @@x # 500 と表示される end class A puts @@x # 500 と表示される end
ややこしいですね!