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

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

nagatech

みなさんこんにちは。

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,
今すぐ新規作

無料Twitterの作成

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

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

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

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

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上からソースコードを見ることができます。


この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のサイト

から「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では何か報告があるとき、


「あの」
「報告があります」
「(報告したいこと)」

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

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


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

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


前置きが長くなりましたが、この記事を通して、次のような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

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


クライアント名も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

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


おわりに

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

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

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

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

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

ではでは~


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

お楽しみに~

この記事を書いた人
nagatech

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

この記事をシェア

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

関連する記事

2017年12月16日
RubyでTwitterBotを作ろう!【公開編】
nagatech
2017年10月31日
DiscordのBotを作ってみよう!
Yosotsu
2018年11月15日
君だけの「にゃーんボタン」を作ろう!
nagatech
2018年7月7日
ますにかえる ハッカソン参加記
yusuke
2017年12月27日
Splatoon2~ボムの使い方~
shigurure
2017年12月26日
RustでMCMC(Metropolis-Hasting)
David

活動の紹介

カテゴリ

タグ