RailsでTwitterログインしてつぶやく(つぶやく編)

昨日の続きです

概要

twitter というgemを使って、つぶやく部分の実装をしていきます

Twitter API v1.1 requires you to authenticate via OAuth, so you'll need to register your application with Twitter.

この記事を書くまで気づきませんでしたが、アプリケーションをTwitterに登録して、OAuth経由での認証しておくことが必要みたいですね。そうでないとPOSTができない(つまりつぶやけない?)っぽいです。

つぶやき機能実装のためには、consumer key/secret のペア(アプリをtwitterに登録した時に取得する値)と、OAuth access token/secretのペア(OAuth認証時に取得する値)が必要なようです。

その値を渡して以下のようにオブジェクトを生成して、updateメソッドを実行してやればそれだけでつぶやいてくれます。他にもフォロワー一覧を出力したり、タイムラインを取得できるようです。

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "YOUR_CONSUMER_KEY"
  config.consumer_secret     = "YOUR_CONSUMER_SECRET"
  config.access_token        = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_ACCESS_SECRET"
end

client.update("I'm tweeting with @gem!")

実装

実際にRailsアプリで以下のように実装したら無事にtwitter上でつぶやくことができました。もっとスマートなやり方がある気がしてしょうがないですがとりあえずよしとします。

User#twitter_clientメソッドでオブジェクトを生成します。consumer key/secret は.envファイルのものを、access token/token_secretはuser自身が保持している値をそれぞれ割り当てています。そしてルーティングを追加して、SchedulesControllertweetアクションを実行するとparams[:text]の値をtwitter上でつぶやいてくれます。

# app/models/user.rb
def twitter_client
  @twitter_client ||= Twitter::REST::Client.new(
    consumer_key:        ENV['API_KEY'],
    consumer_secret:     ENV['API_SECRET'],
    access_token:        token,
    access_token_secret: secret
  )
end

# config/routes.rb
resources :schedules do
  post 'tweet', on: :collection
end

# app/views/schedules/_modal.html.haml
= button_to 'Tweet', { action: :tweet, params: { text: 'hoge' } }

# app/controllers/schedules_controller.rb
def tweet
  current_user.twitter_client.update(params[:text])
  redirect_to schedules_path, notice: 'Tweeted!'
end