# おしゃべりBotを作ろう 文責: MIS.W 51代 むさしん(プロ研・CG研・MIDI研) [@musaprg](https://twitter.com/musaprg) ==このように色付けされているのはすべて注釈です== ## 講座概要 Microsoftが開発した「りんな」ちゃんをご存知でしょうか。あのようなBotは、難しそうに見えますが、意外と簡単に作れます。今回は、プログラミングの専門知識を必要としません。コピペを駆使してBotを作っていきます。 ## はじめに わからないことがあったらすぐにGoogle先生に聞きましょう。 [(Google)](https://www.google.co.jp/) <ぼくに聞いてね! /||||||||||\ 「(わからないこと) やり方」とかいったふうに検索すれば必ず見つかります。検索する力はプログラミングにかぎらず必要です。Google先生と仲良くなりましょう。(例:「Twitter Bot 作り方」) また、この講座はプログラミングの基礎知識を教えるということに関しては**ガン無視**しています。プログラミングの**難しい部分はとりあえず抜き**にして、なるべく**コピペでBotを作っていこう**と思います。 最近は、プログラミングブーム(?)というのもあってなのでしょうか、とても素晴らしい入門サイトが世の中には大量に溢れています。そのため、プログラミングの文法について学びたい、という方は、以下参考サイトを頭からじっくりやっていただくことを強くおすすめします。 - [Progate - プログラミングの入門なら基礎から学べるProgate](https://prog-8.com/languages/ruby) <span style="color:red"><オススメ!></span> - [paizaラーニング](https://paiza.jp/works/ruby/primer/beginner-ruby1) - [ドットインストール - 3分動画でマスターする初心者向けプログラミング学習サイト](http://dotinstall.com/lessons/basic_ruby_v3) また注釈で==このようにいろいろ書いてあると思いますが==「難しそう」「なにこれ気持ち悪い」「プロ研やめます」と思ったら**すっ飛ばしてもらって構いません**。 Rubyもそうですが、大抵の言語は環境構築に一苦労します。環境構築で挫折してしまう人も少なくはありません。 しかし、環境構築さえ済んでしまえばあとは**プログラミングし放題**です。 **一緒に頑張りましょう!** ## 目次 0. 環境構築編 1. Twitterへの登録 2. あらかじめ設定した文章をツイートするプログラム 3. リプライに反応する機能の追加 4. 【応用編】自動短文生成機能の追加 ## 0. 環境構築編 ==Ruby+Gem(RubyGems)の環境がすでに構築済みの方は飛ばしてください== 自分の環境に合わせた項目を参照してください。 今回は、Rubyと一緒にRubyGemsという便利なプログラムもインストールします。 > RubyGemsは、Ruby言語用のパッケージ管理システムであり、Rubyのプログラムと("gem" と呼ばれる)ライブラリの配布用標準フォーマットを提供している。gemを容易に管理でき、gemを配布するサーバの機能も持つ。 > ― [RubyGems - Wikipedia](https://ja.wikipedia.org/wiki/RubyGems) RubyGemsは、簡単にいうと、Rubyで使える便利な拡張機能(ライブラリといいます。ここではgemのことを指す。)を簡単にインストールするためのツールみたいなものです。 ### Windows #### 1. RubyInstallerを導入 [Downloads - RubyInstaller](https://rubyinstaller.org/downloads/)から最新版(現時点では2.3.3)をダウンロードし、実行してください。 ==64bit版のWindowsの場合はx64と書いてあるものをインストールしてください。== インストール中に出る以下の画面では、`Rubyの実行ファイルへ環境変数PATHを設定する`と`.rbと.rbwファイルをRubyに関連づける`にチェックを入れてください。 ![](https://i.imgur.com/vZXwyqu.png) インストールが完了したら、コマンドプロンプトを開いて、`ruby -v`と打ち込んでください。以下のようにバージョンが出たらインストール完了です。(表示されている文字がだいたい同じなら大丈夫です。) ``` ruby 2.3.3p222 (2016-11-21 revision 56859) [i386-mingw32] ``` #### 2. RubyGemsのインストール 先程のダウンロードページの下の方に、"DEVELOPMENT KIT"というものがあるはずです。 ![](https://i.imgur.com/1bQk3Fn.png) 上から二番目の`DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe`を選択しダウンロード、実行してください。 ==先程64bit版をインストールした人は、上から3番目の`DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe`をダウンロード、実行してください。== ダウンロードしたファイルを実行すると、以下のような画面が出ると思いテキストボックスに、以下の文字を入力してください。 ``` C:¥Ruby23¥devkit ``` 入力すると以下の画像のようになると思います。確認後、Extractボタンを押してください。 ![](https://i.imgur.com/XVs3K82.png) 完了後、コマンドプロンプトを開いて、以下のコマンドを一行ずつ入力、実行していってください。 ==コマンドプロンプトは、Windowsキー+Rで"プログラムの指定と実行"を起動し、cmdと入力しEnterを押すことでも起動できます== ``` cd C:¥Ruby23¥devkit ruby dk.rb init ruby dk.rb install ``` 以上でRubyGemsのインストールは完了です。 ### MacOSX #### 1. Command Line Tools for Xcodeのインストール Homebrewのインストールに必要なのでまずはこれをインストールします。 インストールの際には、標準でインストールされているターミナルというソフトを使います。 > ターミナルとは、<b>コマンドと呼ばれる命令文を用いてMacの操作や設定をおこなうためのツール</b>です。 > 通常は利用する必要はありませんが、高度な設定をする場合や、Macでプログラミングをおこなう場合には利用する必要があります。 > Windowsにおけるコマンドプロンプトと呼ばれているものとほぼ同じものです。 > 【出典】[今さら聞けない!ターミナルの使い方【初心者向け】](https://techacademy.jp/magazine/5155) ここでは、詳しい使い方は省略しますので、気になる人は上記リンクを辿ってみてください。 まずは、ターミナルを起動してください。ターミナルは、「アプリケーション」フォルダの中の「ユーティリティ」フォルダ内にあります。 また、Control+SpaceでSpotlightを開いて、"Terminal"と打ち込み、Enterを押しても起動します。 ターミナルを起動すると、以下のような画面が出ると思います。 ![](https://i.imgur.com/FATqUgY.png) 引用: http://www.supportdoc.net/support-general/mac-terminal.html `hoge-no-MacBook-Pro:~ hoge$`と出てる状態であれば、コマンドを入力することができます。(機種によってここに出る文字は違いますがだいたい同じです) しばらく待ったのち、以下の文字列(コマンドと呼びます)を打ち込み、Enterを押し、コマンドを動かしてください。 ``` xcode-select --install ``` ==コマンドを動かすことを"実行"といいます。コマンドが"動く"ことを"走る"ともいいます。== ==多くのサイトでは、上記コマンドを`$ xcode-select --install`と記載しているところが多いです。この時、頭についている"$"という文字は、この文字列がコマンドであることを示す記号なので、実際に打ち込むコマンドはこの記号を抜いた文字列です。== 上記コマンドを実行すると、以下のような画面がでます。 ![](https://i.imgur.com/LA6bRgy.png) Xcodeは、プログラミングを強力に手助けしてくれるIDE(統合開発環境)という種類のソフトです。 プログラミングをする上では欠かせないソフトであり、今後も使う機会が多いため、__インストールしておくことを推奨します。__ ==インストール推奨ですが、Xcodeのダウンロードにはそれなりに時間がかかります。「Xcodeいらないよ」っていう人は「__インストール__」を押してください。== Xcodeをインストールするには、この画面の「__Xcodeを入手__」を押してください。Mac App Storeが開くと思うので、左上の「入手」→「Appをインストール」をクリックし、インストールを開始してください。 ==Xcodeの詳細については、公式サイトをチェックしてください。 [Xcode - Apple Developer](https://developer.apple.com/jp/xcode/)== #### 2. Homebrewのインストール Homebrewは、Appleの提供していないさまざまなソフトをインストール・管理するためのパッケージマネージャーという種類のソフトです。 インストールするには、以下のコマンドを実行してください。 ``` $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ``` ==Homebrewの詳細については公式サイトをチェックしてください。[Homebrew - macOS 用パッケージマネージャー](https://brew.sh/index_ja.html)== #### 3. Rubyのインストール 実はMacにはRubyが標準で入ってます。ただ、バージョンがものすごく古いので、最新のバージョンをインストールして使います。 Rubyには様々なバージョンがあり、自分で管理するのは非常に面倒です。そこで、rbenvというツールを使います。 インストールするには、以下のコマンドを一行ずつ実行してください。 ``` $ brew update $ brew install rbenv ruby-build $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile $ source ~/.bash_profile ``` これでrbenvのインストールは完了です。 では、実際にRubyをインストールします。(最新の安定版であるv4.0.0を使用します。) インストールするには、以下のコマンドを実行してください。 ``` $ rbenv install 2.4.0 $ rbenv global 2.4.0 ``` これで、インストールは完了です。`ruby -v`と打ち込み、以下のような文字が出てきたらインストール完了です。 ``` $ ruby -v ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16] ``` #### 4. RubyGemsのインストール RubyGemsはMacの場合Rubyのインストールと同時に導入されるので、特にやることはありません。 ### Linux 気になる人は調べてね。 だいたいMacと同じで、rbenvをインストールすれば大丈夫です。 ## 1. Twitterへの登録 ここでは、プログラムからツイートするために必要なTwitterへの登録作業を行います。 ### 1. Bot用アカウントの作成 ==Bot用アカウントが不要、自分のアカウントで試しても平気というかたはスキップしてください。== まずは、以下のリンクからBot用のアカウントを作成します。 https://twitter.com/signup メールアドレスが別に必要なので、もし使ってないメールアドレス等がない場合は、Gmail等のフリーメールを新たに作成してください。 - Gmail : https://accounts.google.com/SignUp ==ワンタイムメールというものを使用する手もあります。ワンタイムメールは、指定時間のみ有効のメールアドレスです。そのため、指定時間が経つとメールアドレスが使えなくなってしまいます。注意しましょう。特段の理由がない限りは**Gmail等で新たにメールアドレスを作るほうが安全**です== ### 2. アカウントの電話番号認証 アカウントを作成したら、アカウントに電話番号を紐付けます。 ==TwitterでBotを作るには、アカウントへの電話番号登録が必須条件になっています。== ![](https://i.imgur.com/bpy8nhY.png) twitterのトップ画面の右上にあるアイコンをクリックし、`設定とプライバシー`をクリックします。 ![](https://i.imgur.com/67hPEDE.png) `モバイル`をクリックし、自分のスマホの番号を入力してください。 入力する際に、必ず**頭の0を取って**入力してください。 例:080-1234-5678 → 80-1234-5678 ==理由はわかりませんが国際的にはこのように入力しないとダメみたいです。よくわかりませんね…== ![](https://i.imgur.com/dnDw8kX.png) 入力ができたら`続ける`を押してください。間もなくしてSMS(メッセージ)がTwitterから届くと思うので、そこに書かれている番号を入力し、`携帯電話を認証する`を押してください。 ![](https://i.imgur.com/WtsODWQ.png) もし、正常に完了しなかったり、メッセージがいつまでたっても来なかった場合は、`新しい確認コードをリクエストする`を押してください。間もなくして新しい番号が届きます。 これにて電話番号の登録は完了です。 ### 2. Twitter Appの登録 Botも一つのアプリです。プログラムからTwitterにツイートするためには、このBotをTwitter Appとして登録しなければなりません。 まずは、以下サイトにアクセスしてください。 https://apps.twitter.com アクセスすると以下のような画面になると思います。右上に`Sign in`と表示されている方は、`Sign in`をクリックした上で、先程作成したBot用アカウントでサインインしてください。 ![](https://i.imgur.com/GvNm2bx.png) サインインすると、右上にアイコンが表示されます。 ![](https://i.imgur.com/JMGbqbT.png) `Create New App`をクリックしてください。すると、以下のような画面になります。 ==ここは、Twitterの連携アプリの登録画面です。今回は、プログラムを通じてツイートをするため、連携アプリの登録が必要となります== ![](https://i.imgur.com/erZowT2.png) 各項目は以下のようになっています。 |項目名|内容|記入例| |---|---|---| |Name|アプリの名前です。Botの名前などを入れてください。|クソリプちゃん| |Description|アプリの説明欄です。Botの説明をいれてください。|自動でクソリプを送りつけます| |Website|アプリの公式サイトへのアドレスをいれます。公式サイトなんて存在しないので、ここではとりあえずhttps://twitter.com/[Botのアカウント名]という形式で登録します。|https://twitter.com/kusorep_chan| |Callback URL|コールバックアドレスの入力欄です。必須ではないのでここでの説明は省きます。|(空欄)| ==Callback URLは、OAuth認証完了後のリダイレクト先です。== 上記事項の入力が完了したら、下の`Developer Agreement`のチェックボックスにチェックを入れた上で、`Create your Twitter application`をクリックしてください。 これにて、登録は完了です。 ### 3. ツイートをするための鍵を取得 プログラムからツイートができることはいいのですが、誰でも好き勝手に投稿できては困ります。 そのため、Twitterには、Appごとに”鍵”が用意されています。プログラムを使ってツイートするときは、その”鍵”を使わないとツイートができないようになっています。 この鍵にあたるのが、以下の4つのキーワードです。 - Consumer Key (API Key) - Consumer Secret (API Secret) - Access Token - Access Token Secret ==この4つの鍵は、とても重要なものです。決して他人に伝えたりしないようにしましょう。 この鍵さえあれば、あなたのBotアカウントを乗っ取ることは容易いものです。 **絶対に他人に教えたりしないようにしてください。**== この4つの鍵は、先程作成したアプリの詳細ページにて確認することができます。 もう一度以下アドレスにアクセスすると、先程作成したアプリが追加されていると思います。 https://apps.twitter.com ![](https://i.imgur.com/Y9DDdvp.png) アプリの名前をクリックすると、詳細ページにとぶことができます。 ![](https://i.imgur.com/z186LbS.png) `Keys and Access Tokens`というところをクリックしてください。名前的にいかにもここにありそうですね。 クリックすると以下のようなページに移ります。 ![](https://i.imgur.com/t4P2mfp.png) `Application Settings`という文字の下に`Consumer Key`と`Consumer Secret`が表示されています。 また、`Access Token`と`Access Token Secret`は、下のほうの`Create my access token`というボタンをクリックすることで生成、表示されます。 この4つの値は後で使うので、このページは開いたままでお願いします。 ## 2. あらかじめ設定した文章をツイートするプログラム ### 1. プログラムをつかってツイートをしてみる ==…さて、おまたせしました。やっとこ本題です。設定が恐ろしく面倒だったと思いますが、ここまで読み進められる根気さえあれば、もう怖いものなんてありません。一緒に頑張りましょう!== ここからは、適宜コマンドを使っていきます。Windowsの方はコマンドプロンプトを、Macの方はターミナルを起動しておいてください。 最初に、プログラムからTwitterの機能を使うためのgemをインストールします。コマンドプロンプト(ターミナル)に、以下のコマンドを打ち込んで実行してください。 ``` gem install twitter ``` これで、RubyからTwitterの機能を使うことができます。 それでは、プログラムを書いていきましょう! まずは、メモ帳(あるいはテキストエディット)を開いて、以下のコードをコピペしてください。 (1)~(4)の部分は、適宜前項でメモした4つの鍵をそのままコピペしてください。 ```ruby require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end client.update("はじめてのツイート! from Tweet Bot") ``` このファイルを、`botscript.rb`という名前で、デスクトップ等に保存してください。 ==.rbという部分は”拡張子”と呼ばれる文字で、ファイルの種類を表しています。普通のテキストファイルは、.txtという拡張子を持っています== 保存ができたら、コマンドプロンプト(ターミナル)に目を移してください。 コマンドプロンプト(ターミナル)に、`ruby`と打ち込み、半角スペースを一つあけた上で、先程保存したファイルをコマンドプロンプト(ターミナル)の画面上にドラッグ&ドロップしてください。 結果的に以下のようなコマンドになれば大丈夫です。 ``` <Windowsの人> ruby C:¥Users¥Hoge¥Desktop¥botscript.rb <Macの人> ruby /Users/Hoge/Desktop/botscript.rb ``` 確認ができたら、Enterを押して実行してください。 何もエラーがでなかったら成功です。 ==Macの方へ。```/Users/Hoge/Desktop/botscript.rb:8:in `<main>': undefined local variable or method `“はじめてのツイート! from Tweet Bot”' for main:Object (NameError)```というエラーが出る場合、テキストエディットの「編集」→「自動置換」→「スマート引用符」がオフになっていることを確認してください。オフになってない場合はオフにしてください。== タイムラインを確認してみましょう。 「はじめてのツイート! from Tweet Bot」とツイートされているはずです。 試しに文章などをいろいろ変えて実行してみてください。 ==エラーが出る場合、正常にツイートされない場合は、同じ文章を二回投稿しようとしていないか確認してくださいね!== さて、リプライを送るにはどうすればよいでしょうか? ==以降は、先程作成したbotscript.rbというファイルを書き換えて改良していきます。実行手順はすべて同じです。== ### 2. 定型文ツイーターをつくろう いちいち文章を書き換えるのは面倒ですね?面倒ですね??(面倒ですね!) そこで、あらかじめ用意した定型文の中から選んで投稿できるように改良したいとおもいます。 先程のコードに少し手を加えたものが以下のコードです。 ```ruby require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end num = 1 if num == 1 then client.update("おはよう") elsif num == 2 then client.update("こんにちは") elsif num == 3 then client.update("こんばんは") else print("その番号の定型文は登録されてないよ") end ``` ==numという文字は、”変数”と呼ばれています。変数は、あらゆる値を格納できる箱のようなものです。`num = 1`は、numという名前の変数に1を入れる(代入といいます)、という動作を指します。== ==新たに追加されたif-then-elsif-else-endという文は、”条件分岐”と呼ばれる処理です。一番上から、numの中身が1だったときの場合、numの中身が2だったときの場合、numの中身が3だったときの場合、それ以外の場合といった順番に処理が並んでいます。== この状態で実行すると、一番上の「おはよう」が投稿されると思います。 さて… このコードのある値を2にすると、「こんにちは」と投稿されるようになります。どこでしょうか…? また、定型文を増やしたいときはどうすればいいでしょうか…? … … 正解は… ```ruby require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end num = 4 if num == 1 then client.update("おはよう") elsif num == 2 then client.update("こんにちは") elsif num == 3 then client.update("こんばんは") elsif num == 4 then client.update("新しい定型文だよ!") else print("その番号の定型文は登録されてないよ") end ``` おわかりいただけただろうか。 このコードの場合は、4つ目の「新しい定型文だよ!」がツイートされます。 定型文を増やしてみたり、いろいろといじってみてください! ### 3. おみくじを作ろう さて、値によって投稿する文章を変える、つまりBotの動作を変えられることがわかりました。 ここでは更に、乱数を使ってランダムに投稿文章を変えたいと思います。 乱数、とは、その字のとおり「乱れた数」、つまり、ランダムな数です。 ==プログラム上で用いられる乱数は厳密には乱数ではなく、微量ながら規則性が存在しています。しかし、完全な乱数を作り出すことはコンピュータ上では不可能なため、擬似的な乱数、”擬似乱数”を用いています。気になる方は調べてネ== 先程のコードに少し手を加えます。 ```ruby require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end num = rand(6) + 1 if num == 1 then client.update("大吉") elsif num == 2 then client.update("中吉") elsif num == 3 then client.update("小吉") elsif num == 4 then client.update("吉") elsif num == 5 then client.update("凶") elsif num == 6 then client.update("大凶") else print("なにかがちがうよ") end ``` 妙な文字が追加されましたね? `rand(6)`? 実は、これが乱数なんです。 `rand(n)`は、0〜n-1の値をランダムに選んでくれます。 ==このような文字のあとにカッコがついたものを”関数”といいます。nをこの関数randの”引数(ひきすう)”といいます。関数は、引数として受け取った値に処理を加えて返してくれます。関数が返す値のことを”返り値”と呼びます。== 例えば、実行したタイミングでたまたま`rand(6)`が1を選んだときは、 ```ruby num = 1 + 1 ``` というコードに置き換わります。つまり、 ```ruby num = 2 ``` というわけです。そのため、この場合は「中吉」とツイートされます。 ==厳密には置き換わる、という表現には語弊があります。気になる方は「プログラミング 関数」で調べてね== ## 3. リプライに反応する機能の追加 ### 1. 自動的に新着ツイートを受け取って出力する さて、Botたるもの会話できなければ話になりませんね。 そこで、さらに賢いBotにするために、リプライに反応する機能を追加してみましょう。 リプライに反応 先程のコードにさらに修正を加えます。 ```ruby require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end stream = Twitter::Streaming::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end stream.user do |status| if status.is_a?(Twitter::Tweet) puts status.user.screen_name #ツイートした人のid(screen_nameのこと) puts status.user.name #ツイートした人の名前 puts status.text #ツイート本文 end end ``` 突然現れた`#なんとかかんとか`という文は、**コメント**という文です。 '#'のあとに続く文字は、プログラムからは見えなくなるので、実行されなくなります。 そのため、コードの中にメモを残したいときは、`#こんな感じに書いてください。` 新しく追加した`stream`は、Streaming APIというものを使うためのものです。対して、先程から使っていた`client`は、REST APIというものを使うためのものです。 ==API(Application Programming Interface)とは、サービスの機能の一部を解放し、自由に使えるようにするためのものです。TwitterのAPIは、本来公式サイトからでないとできない「ツイート」という機能を、自分でつくったプログラムで行うことができるようにしています。詳しいことについてはこちら→[いまさら聞けない!APIとは何か?〜基礎の基礎を学ぼう〜](http://www.sejuku.net/blog/7087)== ==**REST API**のRESTは「休む」という意味の英単語です。つまり、REST APIは通常は休んでいる状態です。そのため、**呼び出す度に立ち上がり**、決められた機能を実行してくれます。Twitterの公式アプリを思い浮かべてみてください。新しいツイートを見るために、皆さんはどうしてますか?ツイートを取得するために、毎回毎回上から下にスライドしてタイムラインを更新しているとおもいます。== ==**Streaming API**のStreamは「流れ」という意味の英単語です。何の流れかというと、今回の場合は**ツイートの流れ**です。Streaming APIは、流れてくるツイートを扱うためのAPIです。人によっては公式のTwitterアプリではないものを使ってる人もいると思います。非公式アプリ(クライアントともいいます)の中には、タイムラインの更新をしなくても、**自動でツイートがどんどん流れてくる**機能を備えているものがあります。その機能がStreaming APIです。== 今回は、リプライに反応するbotを作ります。 **リプライは突然やって来ます**。そのため、常にツイートの流れ(Stream)、つまり**タイムラインを監視**しなければなりません。 そんなときに使うのがStreaming APIです。 先程載せたコードの下の部分(↓)が、Streamに関する処理です。 ```ruby stream.user do |status| if status.is_a?(Twitter::Tweet) puts status.user.screen_name # ツイートした人のid(screen_nameのこと) puts status.user.name #ツイートした人の名前 puts status.text #ツイート本文 end end ``` `stream.user do |status|`〜`end`までがStreaming APIの処理です。流れてきたツイートに関する動作は、この間に書きます。 流れてきたツイートは、`status`という変数に入ります。statusの中にはさらにたくさんの情報が入ってます。それらは、`status.user`などとすることによって取り出すことができます。 ただ、流れてくるものはツイートだけではありません。「誰が誰かをフォローしました」とか「誰が誰かをふぁぼしました」みたいな通知も送られてきます。この通知のことをイベント(Event)といいます。 `if status.is_a?(Twitter::Tweet)`〜`end`という部分は、「もし`status`がツイート(Twitter::Tweet)だったら、間に書いてあるコードを実行しなさい」という命令を指します。 statusの中に入ってる情報にはそれぞれ名前が決まっています。 例えば、ツイート本文は、`status.text`と書くことで取り出せます。 ==今回使うのは、このくらい情報で十分です。もっとたくさんありますが、気になる人は調べてね== 2. リプライに反応させる さて、ついにリプライに反応させます。 先程の修正でタイムラインの新着ツイートを自動取得することはできました。 あとは、**流れてきたツイートがリプライかどうか**を判断して、そのツイートに対する返信をツイートすればいいですね。 その機能を実装したものが以下になります。 ```ruby require 'twitter' client = Twitter::REST::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end stream = Twitter::Streaming::Client.new do |config| config.consumer_key = "(1)" config.consumer_secret = "(2)" config.access_token = "(3)" config.access_token_secret = "(4)" end botinfo = client.user(client.verify_credentials.id) #botのアカウント情報の取得(screen_nameとか) # 以下がストリームに関する処理 stream.user do |status| if status.is_a?(Twitter::Tweet) # @(自分のbotのscreen_name)という文字が含まれてたらリプライとみなす。 例: @musaprg ぽきた!w if (status.text.match(/^@#{botinfo.screen_name}\s/)) client.update("@#{status.user.screen_name} すごーい!君はリプライができるフレンズなんだね!", in_reply_to_status: status) end end end ``` これでとりあえず投げたリプライに反応するbotが作れました。わーい!すごーい! さて、このままだと二回目以降実行したときにツイート文が重複して投稿ができないことがあります。また、単調なリプライは面白くありません。もう少し遊んでみたい人は、先のおみくじbotみたいにリプライ内容を適宜変えるように書き換えてみましょう。 ## 4. 【応用編】自動短文生成機能の追加 ここまでのBotは、ただ決められた文章を吐くだけの、いわゆる”人工無能”でした。 「もっとIntelligenceなBotがほしい…はやりの人工知能を作りたい…」 そんな貴方に、更にAI(っぽい)機能を追加していただきます。 - - - さて、ここからはかなり高度になってきます。 初心者の方はここまでやらなくても大丈夫だと思います。 というより… Rubyをはじめ、プログラミングの基礎知識を踏まえた上でやったほうが知識定着の観点としてはとてもいいと思います。 ぜひ、一度「はじめに」のセクションでお伝えした参考サイトを一通り修了してもらうことをおすすめします。 そして、腕試しという意味をこめて、この機能を一から実装してもらうと、力をものにできると思います。 ### 1. 理論 ここから先は、自動短文生成機能を支える理論と、それに付随した機械学習にまつわる基礎知識をお伝えします。 実装に関していえばこの講座の趣旨からはずれてしまうので、”わたしはコピペプログラミングしに来たんだぞ!!”っていう方はどんどん実装のほうに進んでもらって構いません! ==新歓ブログリレーで`51代しくがわ`が[機械学習概論](http://misw.jp/archives/2162)という記事を書いています。数式に触れないようにざっくり、かつ丁寧にわかりやすく機械学習について触れられているとてもよい記事です。正直ここから書く理論の項目は、機械学習を全く知らない素人が書いてるため、あまり参考にはならないと思います。もし理論に興味がある方がいましたら、新歓ブログリレーの方の記事を参照していただくといいかもしれません。== #### 1. 機械学習の考え方 執筆中だよ! #### 2. 教師あり学習と教師なし学習 執筆中だよ! #### 3. 隠れマルコフモデル 執筆中だよ! #### 4. マルコフ連鎖 執筆中だよ! ### 2. 実装 さて、理論はともかくとして、早速実装していきます。 ここで作ったbotを長く動かしていくと、かの有名なしゅまいくん([@shuumai](https://twitter.com/shuumai))のようなものが作れます。 処理の流れは、大まかに以下のとおりです。 1. 直近100件のツイートを取得し、単語に分解してデータベースにためる 2. データベースからマルコフ連鎖を用いて短文を生成、ツイート。 ストリームから常にツイートを取得してデータベースにためていく方法もあります。これは、常時稼働させておくbotなどに向いています。 とにかく、今回は手っ取り早くやりたいので、直近100件のツイートでデータベースを作ります。 #### 1. データベースの作成 データベースを扱うためには、SQLというクエリ言語を本来は使用します。しかし、SQLはとても煩雑です。そのため、今回は`ActiveRecord`というGemを使います。 ==ActiveRecordは、ORマッパーと呼ばれるライブラリの一種です。ORマッパーとは、オブジェクト(Object)とリレーショナルデータベース(Relational Database)を関連付けて扱いやすくするためのライブラリです。ActiveRecord自体は、Railsと呼ばれるWebフレームワークに包含されていますが、今回の場合のように単体でも使用することができます。詳しくは→[ActiveRecordの基礎](https://railsguides.jp/active_record_basics.html)== まずは、ActiveRecordのGemをインストールします。同時にSQLiteというGemも必要なのでインストールします。 ``` $ gem install activerecord sqlite3 ``` ==SQLiteは、リレーショナルデータベース管理システム(RDBMS)と呼ばれるものの一つです。RDBMSは、他にもMySQL、PostgreSQL、SQL Serverなどがあり、それぞれ無料だったり有料だったりします。SQLiteは無料かつとても動作が軽量なRDBMSなので、小規模なデータベースで十分という場合には最適です。よく使います。== インストールが完了したら、データベースを作成するコードを書いていきます。 ==新しくフォルダを作って、その中で作業していただくことをオススメします。== エディタ等で新規ファイルを作成し、以下のコードを貼り付けた上で、`dbinit.rb`という名前で保存してください。 ```ruby require 'active_record' ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => 'db.sqlite3' ) ActiveRecord::Migration.create_table :corpus do |t| t.string :word1 t.string :word2 t.string :word3 t.timestamps end ``` ちなみに、SQLで書くと以下のようになります。 ```sql create table corpus( id integer primary key, word1 text, word2 text, word3 text, create_at, updated_at ); ``` 書けて保存ができたら、実行しましょう。 ``` $ cd <スクリプトがあるディレクトリ(フォルダ)> $ ruby dbinit.rb -- create_table(:corpus) -> 0.0183s ``` こんな感じに表示されると思います。 実行が完了したとき、スクリプトがあるフォルダに`db.sqlite3`というファイルが作成されていたら成功です。 #### 2. タイムラインから流れてきたツイートを形態素解析しよう さて、マルコフ連鎖を使って短文を生成するには、文を単語ごとに分解(分かち書き)しなければなりません。 英語の場合は、単語と単語がスペースでわかれているので、半角スペースごとに分解すれば簡単です。 しかし、日本語の場合はどう切り分ければいいのでしょうか…? 実は、日本語の場合は、**形態素解析**というものを用いて単語に分解します。 形態素解析のライブラリは色々種類がありますが、今回は`MeCab`と呼ばれる形態素解析ライブラリを使います。 Rubyには、`MeCab`を使うための`natto`と呼ばれるGemがあるので、今回はそれを活用します。 ==詳しい説明は→ [natto - GitHub](https://github.com/buruzaemon/natto)== とりあえずはnattoをインストールしましょう。 ``` $ gem install natto ``` ## 参考サイト http://qiita.com/shimoju/items/41035b213ad0ac3a979e https://tsuchikazu.net/mac_rail_setup/ http://qiita.com/ringo/items/4351c6aee70ed6f346c8 http://qiita.com/kimioka0/items/8c10e01def23fdbf3aa6 http://qiita.com/foloinfo/items/6ecfe3c5fd1b56f1dceb http://tondol.hatenablog.jp/entry/20120311/1331470586