Wakotech Blog

ポエム

RubyでTwitterにStreaming接続してbotを作ってるお話

Twitterでリマインダをするのが一番楽なのではないかと思いRubyのTwitterGemを使いbotを作りはじめました。
とりあえず今回はRubyTwitterに接続するお話を、前回の短すぎる内容ではなく、調べながら理解したことを踏まえて書いていきます。

# twitter-reminder.rb

require 'twitter'
require 'yaml'

def connect_twitter
  keys = YAML.load_file('./config.yml')
  @client = Twitter::Streaming::Client.new do |config|
    config.consumer_key = keys['twitter']['consumer_key']
    config.consumer_secret = keys['twitter']['consumer_secret']
    config.access_token = keys['twitter']['access_token']
    config.access_token_secret = keys['twitter']['access_token_secret']
  end

  @rest_client = Twitter::REST::Client.new do |config|
    config.consumer_key = keys['twitter']['consumer_key']
    config.consumer_secret = keys['twitter']['consumer_secret']
    config.access_token = keys['twitter']['access_token']
    config.access_token_secret = keys['twitter']['access_token_secret']
  end

  @user_screen_name = @rest_client.user.name
end

def stream
  @client.user do |status|
    if status.is_a?(Twitter::Tweet)
      puts "#{status.user.name} (#{status.user.screen_name})"
      puts status.text
      puts '---'
    end
  end
end

def tweet
  @rest_client.update(ARGV[0])
end

connect_twitter
unless ARVG[0]
  stream
else
  update
end

consumer_key等の情報は利便性を考え別ファイルにyamlとして記述します。

# config.yml
twitter:
  consumer_key: "YOUR_CONSUMER_KEY"
  consumer_secret: "YOUR_CONSUMER_SECRET"
  access_token: "YOUR_ACCESS_TOKEN"
  access_token: "YOUR_ACCESS_TOKEN_SECRET"

consumer_key等の取得は、Twitter Developersから新規アプリを登録し、その中のAPI keysにある情報を記述してください。また投稿やDMを使用するため、Permissions内のRead, Write and Access direct messagesにチェックを入れてください。

まず最初にconnect_twitterTwitterに接続します。ここでは自分自身のアクセストークンを記録し、自分自身のアカウントの情報にアクセスできるようにします。
Twitter::Streaming::ClientクラスではStreaming APIを操作できるのですが、こちらからは投稿やユーザ情報の取得ができないため、REST API操作用のTwitter::REST::Clientクラスのインスタンスも生成します。
引数がある場合はtweetメソッドを呼び引数の値をツイート、ない場合は自分のタイムラインをストリーミングする、というコードにしています。
Twitter::REST::Clientクラスのupdateメソッドでは引数をそのままツイートします。
Twitter::Streaming::Clientのuserメソッドでは、Streaming APIと繋ぎっぱなしにし、認証ユーザのタイムラインをストリーミングします。
流れてきたstatusがTwitter::Tweet型である場合のみそのツイートを表示するようにしました。ここではuserメソッドtextメソッドを使ってツイートの詳細を取得しています。

ここからリマインダとしては、ツイートの発言者(status.user.screen_name)とリプライ先(status.in_reply_to_screen_name)が自分(@user_screen_name)と同じだった場合にリマインダであると判断し、細かい条件分けにかけていく感じです。(多分status.textに対して正規表現使うより処理が早そう。)

という感じでTwitterbotを作るのはこんな感じです。すぐ出来ると思うので試してみてください。(なかなかしっくりくる記事がなかった(updateだけどかstreamingだけとか)のでがんばって書いたつもりです。)
リマインダの部分は長いのとまだコードをきれいにしているところなので2回に分けて次回書きます。