読者です 読者をやめる 読者になる 読者になる

器用貧乏です。はげたかです。日記です。

どうも、はげたかです。今まで器用貧乏に生きてきました。ジェネラリスト・フルスタックエンジニアを目指しています。

今日の一言:カテゴリ分けをしっかりしたらPVあがるかな?

2015年最新情報:RailsとTwitterを連携させる

はじめに

f:id:hagetak:20150127003744p:plain

本キャッチ画像を彼女に見せたところダメ出しを食らいまくった。デザインって難しいな。

RailsTwitterを連携させる記事は多くあるが、最新情報がまとまって書かれているものはない。

そこで、今回は2015年最新情報として、本記事を書く。

(先ほど記事を書いたのだが、うっかりしてちょろめを消してしまった == 記事を削除してしまった ちょっとやる気が削がれて、端折る可能性があるが再度執筆する。)

目次

  1. TwitterAPIを取得する
  2. アクセスキーを取得する
  3. テストツイートをする
  4. RailsTwitterを連携させる

TwitterAPIを取得する

以下のサイトへアクセスする。

Twitter Application Management

f:id:hagetak:20150126232421p:plain

f:id:hagetak:20150126232513p:plain

ウェブサイト: 持っていない・テストの場合は、適当にかけば良い。形式が合っていれば何でも通るらしい。以下でもおkだと思う。

http://hogehogehgoe.com/

f:id:hagetak:20150126232636p:plain

Permissionをクリックし、

Read and Write を選択する。これをしないとツイートが出来ない。また、あとからツイートをしたいと思ったときは、再度登録をしなければいけないため、今やっておくのが吉だろう。

2. アクセスキーを取得する

  • gemをインストールする

    ~/RailsApp > gem install oauth

  • irbを実行し、下記のコードを打つ。

~/RailsApp > irb

> require 'oauth'

# 先ほど登録したTwitterAppsに書いてある Consumer key/secret を記入する
> CONSUMER_KEY = 'Consumer key を入力'
> CONSUMER_SECRET = 'Consumer Secret を入力'
> consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => "https://twitter.com")
> request_token = consumer.get_request_token
> request_token.authorize_url
    # => "https://twitter.com/oauth/authorize?oauth_token=xxxxxx" 

最後のURLをブラウザで開く。以下の部分ね。

=> "https://twitter.com/oauth/authorize?oauth_token=xxxxxx"

ブラウザを開くと以下の画像のようになるのでクリッククリック。

f:id:hagetak:20150126233223p:plain

f:id:hagetak:20150126233237p:plain

先ほどのirb実行画面に移り、下記のコードを入力する。

> access_token = request_token.get_access_token(:oauth_verifier => 'ブラウザでメモしたPINを貼り付け')
> puts access_token.token
    => "this is a Access Token. please you take notes." #<= これがAccess Tokenです。メモをする
puts access_token.secret
    => "this is a Access Secret. please you take notes." #<= これがAccess Secretです。メモをする

意外と簡単にここまでこれた。次の項目では、テストツイートをする。

3. テストツイートをする

'twitter'のgemが必要なので、Gemfile に以下を記述する。

gem 'twitter'

そして、ぶんどる

sudo bundle install

続いて、テストツイートをするためのタスクを作成する。RailsApp/lib/tasks/ に twitter.rake を作成する。

require 'twitter'

namespace :twitter do
    desc "ツイートする"
    task :tweet => :environment do

        ## アプリ登録時に取得したCONSUMER_KEY/CONSUMER_SECRETを記入する
        CONSUMER_KEY = 'please write your consumer_key'
        CONSUMER_SECRET = 'please write your consumer_secret'
        ## irbで取得した Access Token/Access Secret を記入する
        OAUTH_TOKEN = 'please write your access_token'
        OAUTH_TOKEN_SECRET = 'please write your acces_secret'

        client = Twitter::REST::Client.new do |config|
          config.consumer_key       = CONSUMER_KEY
          config.consumer_secret    = CONSUMER_SECRET
          config.access_token        = OAUTH_TOKEN
          config.access_token_secret = OAUTH_TOKEN_SECRET
        end

        tweet = "テストツイート!"
        client.update(tweet)

    end
end

このタスクの概要を以下に示す。

  1. 取得したCONSUMER_KEY/SECRET, ACCESS_TOKEN/SECRETを定数化する
  2. client変数に、上記で定数化した情報を元にログイン情報を代入する
  3. client.updateでツイートをする

さて、実行してみよう。実行の仕方は以下のコマンドを打つだけ

rake twitter:tweet

"テストツイート!"とつぶやかれたでしょう。確認して下さい。

さて、これをRailsのアプリケーション内に導入することにする。

4. RailsTwitterを連携させる

まずは、前項で定数化したものを RailsApp/config/twitter.yml に入れておくことにする。これは、コントローラやヘルパー内に記述してしまうとセキュリティの問題や可読性の問題があるので、configに入れておく。

# twitter api.
development:
    ## アプリ登録時に取得したCONSUMER_KEY/CONSUMER_SECRETを記入する
    CONSUMER_KEY : 'please write your consumer_key'
    CONSUMER_SECRET : 'please write your consumer_secret'
    ## irbで取得した Access Token/Access Secret を記入する
    OAUTH_TOKEN : 'please write your access_token'
    OAUTH_TOKEN_SECRET : 'please write your access_secret'

さて、これでいつでもこの定数を使えるようになった。次は RailsApp/app/helper/application_helper.rb にツイートする仕組みを記述する。(コントローラ内に記述すると可読性が悪くなるので、今回はヘルパーに記述する。 ベストプラクティスがわからないので、ぜひ教えて下さい)

module ApplicationHelper
    def tweet(text)

        twitter_item = YAML.load_file("#{Rails.root}/config/twitter_settings.yml")
        [Rails.env]

            client = Twitter::REST::Client.new do |config|
              config.consumer_key       = twitter_item["development"]["CONSUMER_KEY"]
              config.consumer_secret    = twitter_item["development"]["CONSUMER_SECRET"]
              config.access_token        = twitter_item["development"]["OAUTH_TOKEN"]
              config.access_token_secret = twitter_item["development"]["OAUTH_TOKEN_SECRET"]
            end 
        client.update(text)
    end
end

これは先ほどテストツイートしたものと仕組みがあまり変わらない。

  • twitter_item に YAML.load_fileで取得したtwitterの定数を取得する

  • twitter_item["development"]["CONSUMER_KEY"]でCONSUMER_KEYを取得できる、同様に必要な定数にアクセスして、config に入れる

  • client.update でツイートをする。

さて、これをツイートさせてみる。今回は、messages_controller.rb に記載し、message#indexにアクセスした時ツイートさせるようにする.

class MessagesController < ApplicationController

  def index
    # Tweet 
    ApplicationController.helpers.tweet("Hello World")
  end

end

messages#index にアクセスすると..."Hello World"とつぶやかれるでしょう!

さいごに

素人ながら少し長い記事を書いた。素人なのでベストプラクティスが分からない。どこにファイルを置くのがいいのか、どこに記述をすればいいのか。全くわかっていない。その辺を教えてくださると助かる。

今回は、あくまでもテストツイート。どのようなロジックでツイートシステムを実現できるか、というのを知るのが目標だ。後は自分がしたいように出来るだろう。

例えば、"hello world"の部分をインスタンス変数から抽出したものにして、つぶやかせることも可能だ。

参考サイト

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

Head First Rails ―頭とからだで覚えるRailsの基本

Head First Rails ―頭とからだで覚えるRailsの基本

広告を非表示にする