feature image

2017年11月10日 | ブログ記事

RubyでTwitterBotを作ろう!【導入編】

みなさんこんにちは。

traPアドベントカレンダー2017 の19日目くらい、つまり11月10日担当のnagatechです。

はじめに

突然ですがみなさん、Twitterやってますか?

ぼくはやってないですが、 Twitterをやったことがある人なら、botと呼ばれるアカウントが存在しているのを知っているでしょうか。

TwitterBotとは、

Twitterの機能を使って作られた、機械による自動発言システム。語源はロボットから来ている。特定の時間に自動ツイートするbot、ユーザーのbot宛の発言にリプライするbot、特定のキーワードに反応するbot等、様々なbotが存在する。
Twitterボット(bot)とは?|ツイッター用語 - ツイナビより引用

このようなものがTwitterBotと呼ばれます。


特定の時間に自動ツイートするbotで有名なbotは「切り取り線」、

切り取り線(@kiri_tori) | Twitter
毎時0分に切り取り線と時刻が出ます。詳しい使い方はWebをご覧下さい。お問合わせ @kiri_tori_info 公認ショップ「きりとりや」 http://t.co/qzSdtu8CvL 製作チーム @okihuran @icconico @d3gk
 

ユーザーのbot宛の発言にリプライするbotで有名なbotは「キャプテン・ファルコン」(ツイート自体は手動ですが)、

キャプテン・ファルコン(@falcon_lunch) | Twitter
Falcon punch!!
 

特定のキーワードに反応するbotで有名なものは「334Ranker」でしょうか。

334Ranker(@334Ranker) | Twitter
午前3時34分につぶやかれる「334」というツイートを集計し、投稿時刻の速い順にランキングを付けます。またその結果を毎日蓄積し、ユーザーの世界ランクを計算しています。個人の集計結果はリプライによって呼び出すことができます。稼働時間: 03:30~04:00, 12:00~24:00
 

このようなbotを自分で簡単に作れるなら面白くないですか?

また、この記事を見ているのが東工大生なら、コンピューターサイエンス(通称:根菜)の講義でRubyを触ったことがある人が多いのではないでしょうか。

そこでこの記事では、RubyでTwittrBotを作る方法を書いていきたいと思います。

なお、最新版のRubyがすでにはいってるものとして進めていきます。
Rubyが入ってないよって人は以下の記事を参考にして環境構築をしてください。

Rubyダウンロード及びインストール | Rubyインストール
最新版のRubyのダウンロード方法及びインストール方法について手順を解説します。
 

まずはbotとして使うTwitterアカウントの準備をします。

Twitterアカウントを作成する

あなたとTWITTER,
今すぐ新規作

無料Twitterの作成

作成してください(投げやり)。

すでにアカウントを持ってる人はそれを用いても大丈夫です。
ただし、電話番号の登録をしないと次の作業に進めません

Twitterのデベロッパーサイトからアプリケーション(bot)を作成する

bot用のアカウントを作成したら、以下のサイトにアクセスします。

Twitter Application Management
Application registration & configuration for developers using the Twitter REST & Streaming APIs.
 

botとして使うアカウントでログインして、Create New Appをクリックしてください。

twitterアプリケーション(bot)の作成画面になります。必要項目を埋めてその下のCreate your Twitter applicationをクリックしてください。

今回はnagatech_botという名前で作成しました。この名前の部分がツイートしたときのクライアント名になります。

次に、アプリケーションのページからKeys and Access Tokensというところをクリックします。

そして下までスクロールして、Create my access tokenをクリックしてください。

そして表示されたページの、

という4つのコードをメモするなり保存するなりして控えてください。
以下の画像のオレンジ色の部分を参考にしてください。

この4つのコードがあればアカウントを乗っ取ることができてしまうので管理には十分気を付けてください。


これでbotとして使用するアカウントの準備は完了です。

次にRuby側の作業に移りましょう。

Twitterライブラリを導入

RubyにはTwitterのAPIの仕様についての知識やHttpClientなどのサーバサイドの知識なしにTwitterbotのプログラミングができる、「twitter」というライブラリがあります。

興味がある人は、オープンソースで開発が行われているので、github上からソースコードを見ることができます。

sferik/twitter - GitHub
twitter - A Ruby interface to the Twitter API.
 

このtwitterライブラリを用いてbotを作っていきましょう。


Windowsならコマンドプロンプト、Macならターミナルを開き、次のコマンドを入力します。

$ gem install twitter
運がよければ(というかMacの人は)このコマンドをたたくだけでtwitterライブラリがインストールされると思います。

おそらく大抵の人(主にWindowsの人)は以下のエラーがでてインストールできないでしょう。

$ gem install twitter
ERROR: Error installing twitter:
The 'http_parser.rb' native gem requires installed build tools.

これは「DevKit」と呼ばれるビルドツールがインストールされていないことから起こるエラーです。
DevKitとは、C/C++ 言語で書かれた拡張ライブラリをビルドできるようにするためのツールです。
twitterライブラリは拡張ライブラリを使用しているので、このDevKitがないとtwitterライブラリをインストールすることはできません。
ではDevKitをインストールしましょう。

DevKitのインストール(Windows向け)

まず、以下のRubyInstallerのサイト

Downloads - RubyInstaller for Windows
The easy way to install Ruby on Windows This is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important...
 
から「DEVELOPMENT KIT」の32bit版または64bit版(環境にあわせて適切なほうを選択してください)をダウンロードします。

ダウンロードした.exeファイルを実行するとファイルの展開が始まります。
展開先はどこでもいいですが、この先の手順は「C:\tools\DevKit」に展開したものとして進めていきます。

次にコマンドプロンプトを開き、C:\tools\DevKitに移動して以下のコマンドを実行します。

C:\tools\DevKit> ruby dk.rb init
C:\tools\DevKit> ruby dk.rb install

うまくいけばこれでDevKitがインストールされます。(うまくいかないのがWindowsでの環境構築です。)

以下のようなエラーが出たら、

C:\tools\DevKit> ruby dk.rb install
[ERROR] Unable to find RubyGems in site_ruby or core Ruby. Please install RubyGems and rerun 'ruby dk.rb install'.

Ruby本体がインストールされているフォルダを確認し(僕の場合は C:\tools\ruby24 でした)、DevKitフォルダの中にあるconfig.ymlというファイルを開いて、以下のようにRubyのパスを追加してください。

config.yml# This configuration file contains the absolute path locations of all

# installed Rubies to be enhanced to work with the DevKit. This config
# file is generated by the 'ruby dk.rb init' step and may be modified
# before running the 'ruby dk.rb install' step. To include any installed
# Rubies that were not automagically discovered, simply add a line below
# the triple hyphens with the absolute path to the Ruby root directory.
#
# Example:
#
# ---
# - C:\tools\ruby23
#
---
- C:\tools\ruby24 #このようにパスを追加する。

そして再度以下のコマンドを実行してください。

C:\tools\DevKit> ruby dk.rb install
今度はうまくインストールできると思います。 これでDevKitがインストールされました。

では、長くなりましたが再度twitterライブラリを入れましょう。

$ gem install twitter

これでTwitterBotを作る準備はできました。

おつかれさまでした。



TwittrBotを作ってみる

ここでこの記事を終わるのもなんかアレなので、実際にRubyを用いてTwitterBotを作ってみたいと思います。


僕の所属するサークルtraPでは何か報告があるとき、


「あの」

あの

— ながてち (@syobon_titech) 2017年4月25日

「報告があります」

報告があります

— ながてち (@syobon_titech) 2017年4月25日

「(報告したいこと)」

traPに入部しました

— ながてち (@syobon_titech) 2017年4月25日

わざわざ3回に分けてツイートする文化があったりなかったりします。

さらに、報告する瞬間を見てる人は報告内容がツイートされる前に、


「おめでとうございます!」

おめでとうございます!

— 幼女@-1500yen (@youjo_itimotu) 2017年4月25日

を送る戦いに巻き込まれるという文化があったりなかったりします。


前置きが長くなりましたが、この記事を通して、次のようなbotを作成したいと思います。

ファイル名はなんでもいいですが、今回はmain.rbというファイルを用意してbot作成を進めていきます。

botの接続の準備をする

まず、botの接続情報を設定するために以下のようなコードを準備します。

main.rbrequire 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "MY_CONSUMER_KEY"
  config.consumer_secret     = "MY_CONSUMER_SECRET"
  config.access_token        = "MY_ACCESS_TOKEN"
  config.access_token_secret = "MY_ACCESS_TOKEN_SECRET"
end

stream_client = Twitter::Streaming::Client.new do |config|
  config.consumer_key        = "MY_CONSUMER_KEY"
  config.consumer_secret     = "MY_CONSUMER_SECRET"
  config.access_token        = "MY_ACCESS_TOKEN"
  config.access_token_secret = "MY_ACCESS_TOKEN_SECRET"
end

clientはツイートやいいねなどの処理用(REST)、stream_clientはTLを逐次読み込む用(Streaming)の接続です。

ここで、MY_CONSUMER_KEY MY_CONSUMER_SECRET MY_ACCESS_TOKEN MY_ACCESS_TOKEN_SECRETはそれぞれ上で用意した4つのコード

に置き換えてください。

ツイートしてみる

ちょっと寄り道して、botを通してツイートしてみたいと思います。

ツイートはclient.update("内容")で投稿することができます。

main.rbに以下のコードを追記してください。

main.rbclient.update("test")

これでbotに「test」とつぶやかせることができます。

実行してみましょう。

$ ruby main.rb
このまま実行できればいいのですが、
SSL_connect returned=1 errno=0 state=error: certificate verify failed (Twitter::Error)

環境によっては (主にWindows) このようなエラーがでると思います。
これはSSL証明書の検証に失敗したときに出るエラーで、以下の手順で解決することができます。

1.証明書のダウンロード

以下のリンクからダウンロードできます。

http://curl.haxx.se/ca/cacert.pem

これをmain.rbと同じ階層のフォルダに保存します。

2.以下のコードをmain.rbに追記

main.rbENV['SSL_CERT_FILE'] = File.expand_path('./cacert.pem')

どこでもいいですが、requireの下あたりがいいと思います。

main.rbrequire 'twitter'
ENV['SSL_CERT_FILE'] = File.expand_path('./cacert.pem')

再度実行してみましょう。

$ ruby main.rb

今度はうまくツイートできたと思います。

test

— ながてち (@syobon_titech) 2017年11月7日

クライアント名もbotの名前(nagatech_bot)になっています。

TLにストリーミング接続する

次にTLを読み込んでみます。

main.rbに以下のコードを追記してください。

main.rbstream_client.user do |tweet|
  if tweet.is_a?(Twitter::Tweet)
    puts(tweet.user.name)
    puts("@#{tweet.user.screen_name}")
    puts(tweet.text)
    puts("-----")
  end
end

ここでtweet.user.nameはアカウント名、tweet.user.screen_nameはアカウントのID、tweet.textはツイート本文を受け取って、puts()で出力をします。

それでは実行してみましょう。

$ ruby main.rb

このようにTLが表示されたと思います。

実行を止めるにはCtrl + Cを押します。

「あの」というツイートに「おめでとうございます!」と返信する

これまでの例から、TLにストリーミング接続中に、tweet.textが「あの」だったらtweet.user.screen_nameのIDに「おめでとうございます!」とclient.updateすれば実装できそうです。

そこでmain.rbのTL取得部分を以下のように書き直します。

main.rbstream_client.user do |tweet|
  if tweet.is_a?(Twitter::Tweet)
    puts(tweet.user.name)
    puts("@#{tweet.user.screen_name}")
    puts(tweet.text)
    puts("-----")
    if tweet.text == "あの"
      client.update("@#{tweet.user.screen_name}\nおめでとうございます!", options = {:in_reply_to_status_id => tweet.id})
    end
  end
end

ここで、client.updateoptionsin_reply_to_status_idというオプションを設定し、どのツイートに返信するかをtweet.idで指定しています。

ツイートをいいねする

ツイートのいいねは

main.rbclient.favorite(tweet.id)

ですることができます。

main.rbの返信している部分の下に追記しておきましょう。

bot完成

長くなりましたがこれで最初の目的であった、

ということを実行するbotが完成しました。

main.rbの全体はこんな感じになります。

main.rbrequire 'twitter'

ENV['SSL_CERT_FILE'] = File.expand_path('./cacert.pem') #実行時SSLのエラーが出る場合に追記

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "MY_CONSUMER_KEY"        #Consumer Key (API Key)
  config.consumer_secret     = "MY_CONSUMER_SECRET"     #Consumer Secret (API Secret)
  config.access_token        = "MY_ACCESS_TOKEN"        #Access Token
  config.access_token_secret = "MY_ACCESS_TOKEN_SECRET" #Access Token Secret
end

stream_client = Twitter::Streaming::Client.new do |config|
  config.consumer_key        = "MY_CONSUMER_KEY"        #Consumer Key (API Key)
  config.consumer_secret     = "MY_CONSUMER_SECRET"     #Consumer Secret (API Secret)
  config.access_token        = "MY_ACCESS_TOKEN"        #Access Token
  config.access_token_secret = "MY_ACCESS_TOKEN_SECRET" #Access Token Secret
end

stream_client.user do |tweet|
  if tweet.is_a?(Twitter::Tweet)
    puts(tweet.user.name)
    puts("@#{tweet.user.screen_name}")
    puts(tweet.text)
    puts("-----")
    if tweet.text == "あの"
      client.update("@#{tweet.user.screen_name}\nおめでとうございます!", options = {:in_reply_to_status_id => tweet.id})
      client.favorite(tweet.id)
    end
  end
end

ではこのbotを起動してみましょう。

$ ruby main.rb

おめでとうございます!

— ながてち (@syobon_titech) 2017年11月9日

おめでとうございます!

— ながてち (@syobon_titech) 2017年11月9日

おめでとうございます!

— ながてち (@syobon_titech) 2017年11月9日

こんな感じにbotを動かすことができました。


おわりに

いかがだったでしょうか。

このようにRubyを使うと簡単にTwitterBotが作れちゃいます。

Rubyがある程度扱える人なら、自動返信してくれるチャットbotを作ったり、天気予報や図書館の閉館時間を教えてくれるbotを作ったり、大岡山から一番近いすき家を教えてくれるbotを作ったり...と夢が広がりますね。

これでこの記事は終わりますが、まだまだ書きたいこと、書き足りないことがたくさんあるので、近いうちにまた続編の記事を出したいと思います。アドベントカレンダー2017の55日目くらいに。

この記事はtraPアドベントカレンダー2017の19日目くらいの担当、nagatechがお送りしました。

ではでは~


traPアドベントカレンダー2017の20日目、11月11日の担当はPS6Sさん、CulMenさん、nariさんです。

お楽しみに~

nagatech icon
この記事を書いた人
nagatech

ながてちです Rubyが好きです 最近興味がWeb寄り

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2017年11月14日
IBIS2017参加報告
Keijan icon Keijan
2017年11月17日
そばやのワク☆ワク流体シミュレーション~MPS編~
sobaya007 icon sobaya007
2017年12月26日
RustでMCMC(Metropolis-Hasting)
David icon David
2017年12月13日
チズケ破壊論
whiteonion icon whiteonion
2017年12月1日
WaltZ
Double_oxygeN icon Double_oxygeN
2017年11月4日
文章をよしなに分散表現しよう
David icon David
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記