みなさんこんにちは。
traPアドベントカレンダー2017 の19日目くらい、つまり11月10日担当のnagatechです。
はじめに
突然ですがみなさん、Twitterやってますか?
ぼくはやってないですが、 Twitterをやったことがある人なら、botと呼ばれるアカウントが存在しているのを知っているでしょうか。
TwitterBotとは、
Twitterの機能を使って作られた、機械による自動発言システム。語源はロボットから来ている。特定の時間に自動ツイートするbot、ユーザーのbot宛の発言にリプライするbot、特定のキーワードに反応するbot等、様々なbotが存在する。
Twitterボット(bot)とは?|ツイッター用語 - ツイナビより引用
このようなものがTwitterBotと呼ばれます。
特定の時間に自動ツイートするbot
で有名なbotは「切り取り線」、
ユーザーのbot宛の発言にリプライするbot
で有名なbotは「キャプテン・ファルコン」(ツイート自体は手動ですが)、
特定のキーワードに反応するbot
で有名なものは「334Ranker」でしょうか。
このようなbotを自分で簡単に作れるなら面白くないですか?
また、この記事を見ているのが東工大生なら、コンピューターサイエンス(通称:根菜)の講義でRubyを触ったことがある人が多いのではないでしょうか。
そこでこの記事では、RubyでTwittrBotを作る方法を書いていきたいと思います。
なお、最新版のRubyがすでにはいってるものとして進めていきます。
Rubyが入ってないよって人は以下の記事を参考にして環境構築をしてください。
まずはbotとして使うTwitterアカウントの準備をします。
Twitterアカウントを作成する
今すぐ新規作
成
作成してください(投げやり)。
すでにアカウントを持ってる人はそれを用いても大丈夫です。
ただし、電話番号の登録をしないと次の作業に進めません。
Twitterのデベロッパーサイトからアプリケーション(bot)を作成する
bot用のアカウントを作成したら、以下のサイトにアクセスします。
botとして使うアカウントでログインして、Create New App
をクリックしてください。
twitterアプリケーション(bot)の作成画面になります。必要項目を埋めてその下のCreate your Twitter application
をクリックしてください。
今回はnagatech_bot
という名前で作成しました。この名前の部分がツイートしたときのクライアント名になります。
次に、アプリケーションのページからKeys and Access Tokens
というところをクリックします。
そして下までスクロールして、Create my access token
をクリックしてください。
そして表示されたページの、
- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Token
- Access Token Secret
という4つのコードをメモするなり保存するなりして控えてください。
以下の画像のオレンジ色の部分を参考にしてください。
この4つのコードがあればアカウントを乗っ取ることができてしまうので管理には十分気を付けてください。
これでbotとして使用するアカウントの準備は完了です。
次にRuby側の作業に移りましょう。
Twitterライブラリを導入
RubyにはTwitterのAPIの仕様についての知識やHttpClientなどのサーバサイドの知識なしにTwitterbotのプログラミングができる、「twitter」というライブラリがあります。
興味がある人は、オープンソースで開発が行われているので、github上からソースコードを見ることができます。
このtwitterライブラリを用いてbotを作っていきましょう。
Windowsならコマンドプロンプト、Macならターミナルを開き、次のコマンドを入力します。
おそらく大抵の人(主にWindowsの人)は以下のエラーがでてインストールできないでしょう。
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のサイト
から「DEVELOPMENT KIT」の32bit版または64bit版(環境にあわせて適切なほうを選択してください)をダウンロードします。ダウンロードした.exeファイルを実行するとファイルの展開が始まります。
展開先はどこでもいいですが、この先の手順は「C:\tools\DevKit」に展開したものとして進めていきます。
次にコマンドプロンプトを開き、C:\tools\DevKitに移動して以下のコマンドを実行します。
C:\tools\DevKit> ruby dk.rb install
うまくいけばこれでDevKitがインストールされます。(うまくいかないのがWindowsでの環境構築です。)
以下のようなエラーが出たら、
[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 #このようにパスを追加する。
そして再度以下のコマンドを実行してください。
では、長くなりましたが再度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を作成したいと思います。
- 更新せずともTL(タイムライン)を見ることができる。
- 「あの」とつぶやいたユーザーに「おめでとうございます!」というリプライを返す。
- さらにそのツイートを「いいね」する。
ファイル名はなんでもいいですが、今回は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つのコード
- Consumer Key (API Key)
- Consumer Secret (API Secret)
- Access Token
- Access Token Secret
に置き換えてください。
ツイートしてみる
ちょっと寄り道して、botを通してツイートしてみたいと思います。
ツイートはclient.update("内容")
で投稿することができます。
main.rb
に以下のコードを追記してください。
main.rbclient.update("test")
これでbotに「test」とつぶやかせることができます。
実行してみましょう。
環境によっては (主に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')
再度実行してみましょう。
今度はうまくツイートできたと思います。
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()
で出力をします。
それでは実行してみましょう。
このように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.update
のoptions
にin_reply_to_status_id
というオプションを設定し、どのツイートに返信するかをtweet.id
で指定しています。
ツイートをいいねする
ツイートのいいねは
main.rbclient.favorite(tweet.id)
ですることができます。
main.rb
の返信している部分の下に追記しておきましょう。
bot完成
長くなりましたがこれで最初の目的であった、
- 更新せずともTL(タイムライン)を見ることができる。
- 「あの」とつぶやいたユーザーに「おめでとうございます!」というリプライを返す。
- さらにそのツイートを「いいね」する。
ということを実行する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を起動してみましょう。
おめでとうございます!
— ながてち (@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さんです。
お楽しみに~