あかんわ

覚えたことをブログに書くようにすれば多少はやる気が出るかと思ったんです

RubyでTwitter Botを作ってHerokuで動かす

Web APIの勉強を兼ねて、Sinatraを使ってHerokuで動かすTwitter Botを作りました。

基本的にこちらの記事の丸写しですが、Ruby 2.3.0とSinatra 1.4.7にあわせて微修正してます。

目次

Twitter APIを使うための準備

BotがつぶやくためのTwitterアカウント*1を用意し、BotTwitterに接続するために必要となるコンシュマーキー*2やアクセストークン*3を準備します。

TwitterBotを登録

TwitterのDeveloperサイトにサインインして必要事項を登録し、Twitter APIを利用するアプリ*4を作成します。

項目 登録内容
Name b0npubot 適当にアプリに名前を付ける
Description チャットボットを作りました 適当にアプリの説明を書く
Website https://twitter.com/b0npu とりあえずTwitterアカウントのURL*5を記述
Callback URL 必須項目ではなかったので空白にしました
Botの接続に必要なアクセストークンを取得

Twitterに登録したアプリケーションKeys and Access Tokensの項目にConsumer KeyConsumer Secretは記載されているので、Create my access tokenからAccess TokenAccess Token Secretを生成します。

Botのアクセスレベルの確認

BotTwitter につぶやきますので、 Access levelの項目がRead and writeになっていることを確認*6しておきます。

Botアプリ作成の事前作業

Rubyで作ったWebアプリをHeorkuで動かすためには、GitリポジトリとGemfileが必要になるので、準備します。
なお、Gitの使い方Herokuの使い方Railsチュートリアルの第2版を参考にしています。
また、Rubyの開発環境はこちらの記事を参考に構築しています。

Gitリポジトリのセットアップ

適当なディレクトリを作成して、ディレクトリの中に移動します。

~
$mkdir twitterbot
~
$cd twitterbot
~/twitterbot

git initコマンドで、Gitリポジトリとしてセットアップ*7します。

~/twitterbot
$git init
Initialized empty Git repository in /Users/b0npu/twitterbot/.git/
Gemfileを作成

HerokuではGemfileを使ってgem*8を管理するそうなので、アプリケーションディレクトリの直下にGemfileを作成し、Botアプリで利用するgemを記述します。

~/twitterbot
$touch Gemfile
~/twitterbot
$vim Gemfile 

Twitter APIを使うためのgemtwitterと、WebフレームワークのSinatraを使うためのgemsinatraを記述*9します。

source 'https://rubygems.org'    # gemを探しに行く場所
ruby '2.3.0'                     # rubyのバージョンを指定

gem 'sinatra', '1.4.7'
gem 'twitter', '5.16.0'

bundle installコマンドで、Gemfileに記述したgemをインストールします。

~/twitterbot
$bundle install

とりあえずこの辺でgit commitして、Gitリポジトリに作業内容を保存します。

~/twitterbot
$git add -A
~/twitterbot
$git commit -m "First commmit"

Twitter Botのコードを書く

Webアプリのメインファイルになるapp.rbBotの本体を記述するtweet.rbに加え、Herokuで使う設定ファイルのconfig.ruを作成し、コードを記述します。

~/twitterbot
$touch app.rb tweet.rb config.ru
ディレクトリの構成
~/twitterbot
    |- app.rb             // Webアプリのメインファイル
    |- tweet.rb           // Twitter Botの本体
    |- config.ru          // Herokuで使うWebアプリの設定ファイル
    |- Gemfile            // 使用するgemを管理するファイル
    |- Gemfile.lock       // インストールしたgemのバージョンを管理するファイル
    |- .git               // Gitリポジトリの管理フォルダ
tweet.rb

@textに格納した文字列を、Twitter APIのコンシュマーキーやアクセストークンを使用してTwitterにつぶやきます。

require 'twitter'

class Tweet

  def initialize
    @text = ["ちゃうねん",
             "せやないねん",
             "どないやねん",
             "ええねん",
             "これや!!",
             "いけるで!!",
             "こっからや!!"]

    @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
  end

  def random_tweet
    tweet = @text[rand(@text.length)]
    update(tweet)
  end

  private

   def update(tweet) 
     begin
       @client.update(tweet)
     rescue => e
       nil #TODO
     end
   end

end

# random_tweetを実行する
if __FILE__ == $0
  Tweet.new.random_tweet
end

tweet.rbだけでもTwitter APIを使ってつぶやけるようなので、確認してみます。

~/twitterbot
$ruby tweet.rb 

コードやアクセストークンに間違いが無ければ、Twitterで新着メッセージが確認できます。 f:id:b0npu:20160618154959p:plain

app.rb

Twitter BotをHerokuで動かすために、SinatraでWebアプリにします。

require 'sinatra'
require_relative 'tweet.rb'

# URL'/'でアクセス
get '/' do
  'under construction'
end

# URL'/random_tweet'でアクセス
get '/random_tweet' do
  Tweet.new.random_tweet
end

app.rbを動かして、Webサーバを起動させます。

~/twitterbot
$ruby app.rb
[2016-06-11 16:04:28] INFO  WEBrick 1.3.1
[2016-06-11 16:04:28] INFO  ruby 2.3.0 (2015-12-25) [x86_64-darwin15]
== Sinatra (v1.4.7) has taken the stage on 4567 for development with backup from WEBrick
[2016-06-11 16:04:28] INFO  WEBrick::HTTPServer#start: pid=28495 port=4567

Webサーバが起動したら、ブラウザからhttp://localhost:4567/random_tweetを入力するか、 f:id:b0npu:20160618162808p:plain

curlコマンドでhttp://localhost:4567/random_tweetに接続してみます。

$curl http://localhost:4567/random_tweet
Please check your tweet%

app.rbのコードに間違いが無ければ、tweet.rbの動作確認時と同様に新着メッセージが確認できます。
f:id:b0npu:20160618163147p:plain

config.ru

HerokuでSinatraアプリとして動かすため、config.ruSinatraアプリである旨を記述します。

require_relative 'app.rb'

run Sinatra::Application

Herokuにデプロイする

Twitter BotをHerokuで動かすために、Gitを使用してHerokuにデプロイします。

Gitリポジトリにコミット

Herokuにデプロイする前に作業内容を保存しておく必要がありますので、git commitします。

~/twitterbot
$git add -A
~/twitterbot
$git commit -m "Add tweet bot"
Herokuにアプリのリポジトリを作成

heroku createで、HerokuにTwitter Botアプリのリポジトリを作成します。

~/twitterbot
$heroku create b0npubot

Herokuにリポジトリを作成したら、BotアプリのGitリポジトリをHerokuにpushします。

~/twitterbot
$git push heroku master
HerokuでTwitter Botの動作確認

heroku openで、Herokuに作成されたWebサイトを開きます。

~/twitterbot
$heroku open

app.rbに記述したようにunder constructionの文字が表示されます。 f:id:b0npu:20160619121910p:plain

Herokuに作成されたWebサイトのURLにrandom_tweetを加えて、接続します。 f:id:b0npu:20160619122115p:plain

Twiiterに新着メッセージが表示されていれば、万々歳です。 f:id:b0npu:20160619122325p:plain

動作確認の機能を削除

HerokuにデプロイしたTwitter Botの動作確認ができたら、念のため、app.rbを編集して動作確認機能を削除しておきます。

require 'sinatra'
require_relative 'tweet.rb'

get '/' do
  'under construction'
end

get '/random_tweet' do
  # Tweet.new.random_tweet
  # 'Please check your tweet'
  'Closed'
end

app.rbの変更をgit commitでGitリポジトリに保存し、Herokuにpushして反映させます。

~/twitterbot
$git commit -am "Remove manual tweet" 
~/twitterbot      
$git push heroku master              

random_tweetのURLに接続して、変更が反映されている事を確認します。 f:id:b0npu:20160619132813p:plain

Heroku SchedulerでBotを自動で動かす

HerokuでTwitter Botが動作する事を確認したら、Botらしくするために、Schedulerアドオン*10を使って自動で動くようにします。

~/twitterbot
$heroku addons:create scheduler:standard

SchedulerアドオンをTwitter Botアプリに加えたら、Schedulerの設定画面を開きます。

~/twitterbot
$heroku addons:open scheduler           

コマンドの欄にbundle exec ruby tweet.rbを入力し、実行する頻度を設定して保存します。 f:id:b0npu:20160619132020p:plain

Schedulerの設定した後は、無課金で使えるリソースが使い果たされない事を祈ります(´・ω・`)

参考記事

Twitter Botに関しては、こちらの記事を参考にさせていただきました。

RubyのWebフレームワークに関しては、こちらの記事を参考にさせていただきました。

開発環境

*1:Twitter APIを使う場合は電話番号の登録も必要なようです

*2:IDのようなもの

*3:パスワードのようなもの

*4:Twitter連携アプリ

*5:連携アプリの場合はサイトのURLとか

*6:変更が必要な場合はPermissionsから変更できるようです

*7:.gitディレクトリが作成されます

*8:Rubyのライブラリ

*9:gemのバージョンは最新版を選びました

*10:アドオンの利用にはアカウント情報にクレジットカードの登録が必要です