Chatbot#2(見本版)

Webサービスプログラミングコース

Chatbot#2(見本版)

メッセージによって返す文章を変えよう

if文条件分岐
見本用の教材

本教科書は見本用です。一部省略している箇所がございますので、実際のSchool で提供している教科書と異なる点があることにご留意ください。

はじめに

Chat02_チャットに打ち込んでみよう03

前回の教科書で、オウム返し Bot を作ることができました。

しかし、まだ何を送っても同じ言葉が返ってきてしまい、会話をしているように感じられません。そこで、今回は上の画像のように、送ったメッセージによって返す文章を変えられるようにしていきましょう。

返す文章が変わる仕組みを理解しよう

Chat02_イントロダクション02

送るメッセージと返す文章を紐付けることによって、メッセージによって違う文章を返すことができます。

今回であれば、バラというメッセージに対して花言葉は「愛情」だよという文章を、チューリップというメッセージに対して花言葉は「思いやり」だよという文章を、ひまわりというメッセージに対して花言葉は「あなただけを見つめる」だよという文章を紐付けます。

また、何も紐付けていないメッセージに対して返す文章も、設定します。

メッセージによって返す文章を変えれるようにしよう

バラの返事を作ろう

それでは、実際に送るメッセージによって返す文章を変えます。

今回は、花の名前を送るとその花言葉が返ってくるようにします。花言葉については、前の画像にもあったこちらの表を参考にします。

Chat02_イントロダクション02

さっそく、バラの花言葉から作ります。

app.rbを開いて、以下のコードと同じ箇所を見つけましょう。

app.rb
post '/callback' do
  body = request.body.read

  signature = request.env['HTTP_X_LINE_SIGNATURE']
  unless client.validate_signature(body, signature)
    logger.warn("400")
    error 400 do 'Bad Request' end
  end

  events = client.parse_events_from(body)

  events.each do |event|
    message = {
      type: 'text',
      text: event.message['text']
    }
    client.reply_message(event['replyToken'], message)
  end

  "OK"
end

バラと送ったら花言葉は「愛情」だよと返すように、以下のようにハイライトの部分のコードを書き換えます。

app.rb
post '/callback' do
  body = request.body.read

  signature = request.env['HTTP_X_LINE_SIGNATURE']
  unless client.validate_signature(body, signature)
    logger.warn("400")
    error 400 do 'Bad Request' end
  end

  events = client.parse_events_from(body)

  events.each do |event|
    if event.message['text'] == 'バラ'
      message = {
        type: 'text',
        text: '花言葉は「愛情」だよ'
      }
    else
      message = {
        type: 'text',
        text: 'その花は知らないよ'
      }
    end
    client.reply_message(event['replyToken'], message)
  end

  "OK"
end

動作を確認しよう

ターミナルに次のコマンドを入力してサーバーを起動します。

ruby app.rb
キャラクターの画像

下の画像みたいに、チャットに「バラ」と打って正しい言葉は返ってきたかな?

Chat02_チャットに打ち込んでみよう02

if-else文を理解しよう

if event.message['text'] == 'バラ'
  message = {
    type: 'text',
    text: '花言葉は「愛情」だよ'
  }
else
  message = {
    type: 'text',
    text: 'その花は知らないよ'
  }
end

今コードを書き換えた部分は、if文を使って、もし送った文章event.message['text']がバラであれば花言葉は「愛情」だよという文章を返し、それ以外(else)であればその花は知らないよという文章を返すように、条件分岐しています。

条件式には==が使われているけど、これはプログラミングにおいては等しいという意味を表します。

if文とは

Chat02_if文01

条件によって場合分けし、それぞれに違う処理を実行したい時に用いるのが、if文(条件分岐)です。

今回であれば、上の図のように条件分岐をすることによって、バラというメッセージに指定の文章を紐付けることができます。

if文は多くのプログラミング言語で用意されており、とても便利な仕組みなので、是非覚えましょう。

Rubyで条件分岐

if文(条件分岐)
if 条件式
  # 条件式を満たした時に実行するコード
else
  # 条件式を満たさなかった時に実行するコード
end

Rubyで条件分岐をしたい時には、ifの隣に一つスペースを空けて条件式を書きます。この条件式には、主に関係演算子<,>,==,=!などを使います。
もし条件式が満たされる時(true)ならば条件式を満たした時に実行するコードが実行されます。
満たされなければ(false)、条件式を満たさなかった時に実行するコードが実行されます。
必要がなければ、elseは書かなくても構いません。この場合、条件が満たされなければ、if文の次のコードが実行されます。

if文の具体例

ここでは、if文(条件分岐)を使ってプログラムの実行内容を変化させる具体例を見ていこう!Executeボタンをクリックすると実行されるよ!
以下のコードは実際に編集する事ができます。"バラ" == "バラ"から"チューリップ" == "バラ"にしてその花は知らないよと出力させよう。

(初回実行時は結果出力するまで10秒ほど時間がかかります)

Ruby Playground

初回実行時のみ、出力までに10秒ほどかかります。

返事をたくさん作ろう

app.rbにコードを打ち込もう

文章が返ってくるメッセージがバラだけではつまらないので、返事をたくさん作りましょう。まずは、上の表にも載っている、チューリップとひまわりの花言葉も返せるようにします。

先ほどと同じeach文の中に、新しくハイライトになっている部分のコードを追加していきます。

キャラクターの画像

ここまではelse(その他の処理)を書いていたが、条件を増やす処理を書くのでelsifを使っているぞ!

app.rb
events.each do |event|
  if event.message['text'] == 'バラ'
    message = {
      type: 'text',
      text: '花言葉は「愛情」だよ'
    }
  elsif event.message['text'] == 'チューリップ'
    message = {
      type: 'text',
      text: '花言葉は「思いやり」だよ'
    }
  elsif event.message['text'] == 'ひまわり'
    message = {
      type: 'text',
      text: '花言葉は「あなただけを見つめる」だよ'
    }
  else
    message = {
      type: 'text',
      text: 'その花は知らないよ'
    }
  end
  client.reply_message(event['replyToken'], message)
end

花言葉が返ってくるか確認してみよう

Chat02_チャットに打ち込んでみよう03

バラ、チューリップ、ひまわりと打って正しい花言葉が返ってくるか確認してみましょう。

CHECKPOINT:もし花言葉が返ってこなかった場合はメンターに確認してもらおう!

もし花言葉が返ってこなかった場合は教科書を進めずメンターを呼んで、確認してもらおう。

復習:確認方法

1. 編集したファイルを保存

  • macOS の方は、 command + s
  • Windows の方は、 ctrl + S

2. 確認用のタブを開き、更新

  • macOS の方は、command + shift + R
  • Windows の方は、ctrl + F5
復習:確認する時に遭遇する問題

1. Oops と表示される

サーバーが起動していないため、以下のコマンドをターミナルに入力してください。

ターミナル
ruby app.rb

2. タブを誤って閉じてしまいました。URLがわかりません。

ターミナルを選択し ctrl + c をした後、以下のコマンドをターミナルに入力してください。

ターミナル
ruby app.rb

Preview → Preview Running Application を選択後、右上の 「四角に矢印」のアイコン(Pop Out Into New Window) をクリックしよう。

サーバー立ち上げ

if-elsif-else文について理解しよう

if event.message['text'] == 'バラ'
  message = {
    type: 'text',
    text: '花言葉は「愛情」だよ'
  }
elsif event.message['text'] == 'チューリップ'
  message = {
    type: 'text',
    text: '花言葉は「思いやり」だよ'
  }
elsif event.message['text'] == 'ひまわり'
  message = {
    type: 'text',
    text: '花言葉は「あなただけを見つめる」だよ'
  }
else
  message = {
    type: 'text',
    text: 'その花は知らないよ'
  }
end

elsifは、ifを用いた条件式の後で、それ以前の条件式に当てはまらなかったものに対してさらに条件分岐を増やしたい時に用いられるものです。elsifを使えば、どんどん条件式を追加していくことができます。

チャレンジ: 花の種類を自分で増やしてみよう

自分でも花言葉を調べて、さらにバリエーションが出るようにelsifを使ってコードを増やしてみましょう。

条件分岐とは

Chat02_if文03

条件によって場合分けし、それぞれに違う処理を実行したい時に用いるのが、if文(条件分岐)です。
今回であれば、上の図のように条件分岐をすることによって、それぞれのメッセージに指定の文章を紐付けることができます。

キャラクターの画像

条件分岐は、とても便利な仕組みなので、覚えておこう!
Ruby以外のプログラミング言語でも使われることが多いぞ!

条件分岐の具体例

ここでは、if-elsif-else文を使ってプログラムの実行内容を変化させる具体例を見ていこう!Executeボタンをクリックすると実行されるよ!
以下のコードは実際に編集する事ができます。flower == "バラ"からflower == "ひまわり"にして花言葉は「あなただけを見つめる」だよと出力させよう。

(初回実行時は結果出力するまで10秒ほど時間がかかります)

Ruby Playground

初回実行時のみ、出力までに10秒ほどかかります。

メッセージによって返す文章を変える機能の完成

以上で、メッセージによって返す文章を変える機能の完成です。
この教科書を通じて、以下のことを学びました。

用語や内容学んだこと
返す文章が変わる仕組み送信されたメッセージと返信の文章を紐付けることによって、異なるメッセージに対して異なる返信を生成する仕組みを学びました。例えば、花の名前に応じて花言葉を返すようなプログラムを作成することができました。
if文条件分岐を行うための制御構造であり、ある条件が満たされているかを判断します。if文は「もし~ならば」という形式で記述され、条件式が満たされる場合に実行する処理を指定します。また、必要に応じてelse節を追加して、条件式が満たされない場合の処理を指定することもできます。
elsifif文において、最初の条件式が満たされない場合に、さらに別の条件を評価し、条件が満たされる場合に対応する処理を実行するための制御構造です。elsifは必要に応じて複数追加することができます。条件式が満たされる場合には最初にマッチしたelsif節の処理が実行され、それ以外の場合には次のelsif節の条件式が評価されます。