LoginSignup
8
3

かんたんLINE botをつくろう!【Rails 応用編】

Last updated at Posted at 2024-03-26

はじめに

前回記事で作成した、以下のコードを改造していきます!

class LinebotController < ApplicationController
  def callback
    body = request.body.read
    events = client.parse_events_from(body)
    
    events.each do |event|
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
            text: event.message['text']
          }
          client.reply_message(event['replyToken'], message)
        end
      end
    end
  end

  private
   
  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV['LINE_CHANNEL_SECRET']
      config.channel_token = ENV['LINE_CHANNEL_TOKEN']
    }
  end
end

コピペして楽しむのもよし!
自分で実装してみるもよし!
コードは折りたたみで隠されているので、お好きにご活用ください。

公式を参考にしたい方は

こちらをご覧ください!

語尾を変更

語尾を「にゃん!」に変更します。

差分

+ 'にゃん!'を追加するだけ!

class LinebotController < ApplicationController
  def callback
    body = request.body.read
    events = client.parse_events_from(body)
    
    events.each do |event|
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
-            text: event.message['text']
+            text: event.message['text'] + 'にゃん!'
          }
          client.reply_message(event['replyToken'], message)
        end
      end
    end
  end

  private
   
  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV['LINE_CHANNEL_SECRET']
      config.channel_token = ENV['LINE_CHANNEL_TOKEN']
    }
  end
end

一定のメッセージを返す

機能としては退化しますが、コードの理解を深めるためにやってみましょう。

差分
class LinebotController < ApplicationController
  def callback
    body = request.body.read
    events = client.parse_events_from(body)
    
    events.each do |event|
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
-            text: event.message['text']
+            text: 'ニホンゴワカリマセーン🤷‍♂️'
          }
          client.reply_message(event['replyToken'], message)
        end
      end
    end
  end

  private
   
  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV['LINE_CHANNEL_SECRET']
      config.channel_token = ENV['LINE_CHANNEL_TOKEN']
    }
  end
end

messageの中のtext: の後が返信される内容になってるんですね〜

分離してみる

メッセージ内容は別のアクションで定義してみましょう。
これで、callback関数の中は条件分岐して返信するだけになりました。

差分

parrotingは「オウム返し」の意味です。)

class LinebotController < ApplicationController
  def callback
    body = request.body.read
    events = client.parse_events_from(body)
    
    events.each do |event|
+      message = []
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
-          message = {
-            type: 'text',
-            text: event.message['text']
-          }
+          message.push(parroting(event))
        end
      end
+     client.reply_message(event['replyToken'], message)
    end
  end

  private

+  def parroting(event)
+    {type: 'text', text: event.message['text']}
+  end

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV['LINE_CHANNEL_SECRET']
      config.channel_token = ENV['LINE_CHANNEL_TOKEN']
    }
  end
end
コードそのもの(コピペ用)
class LinebotController < ApplicationController
  def callback
    body = request.body.read
    events = client.parse_events_from(body)
    
    events.each do |event|
      message = []
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message.push(parroting(event))
        end
      end
      client.reply_message(event['replyToken'], message)
    end
  end

  private

  def parroting(event)
    {type: 'text', text: event.message['text']}
  end

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV['LINE_CHANNEL_SECRET']
      config.channel_token = ENV['LINE_CHANNEL_TOKEN']
    }
  end
end

画像(イメージ)を返信

オンラインスクールRUNTEQのキャラクター「らんてくん」を表示してみましょう!
(RUNTEQ宣伝も兼ねて。怒られたら変えますw)

先程のparrotingと同じく、privateの下に「1つのアクションとして」作成してみます。
parrotingimageの2つのメッセージを返信するようにしてみましょう。

差分

message.pushの形で、messageに追加をしていくと複数のメッセージを返信できます。

class LinebotController < ApplicationController
  def callback
    body = request.body.read
    events = client.parse_events_from(body)
    
    events.each do |event|
      message = []
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message.push(parroting(event))
+          message.push(runtequn_image)
        end
      end
      client.reply_message(event['replyToken'], message)
    end
  end

  private

  def parroting(event)
    {type: 'text', text: event.message['text']}
  end

+  def runtequn_image
+    runtequn = 'https://stickershop.line-scdn.net/stickershop/v1/product/18201714/LINEStorePC/main.png?v=1'
+    {type: 'image', originalContentUrl: runtequn, previewImageUrl: runtequn}
+  end

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV['LINE_CHANNEL_SECRET']
      config.channel_token = ENV['LINE_CHANNEL_TOKEN']
    }
  end
end

スタンプを返信

スタンプを返信してみましょう!

先ほどと同じく、message.pushも忘れず!

追加アクション
def sticker
  {
    "type": "sticker",
    "packageId": "11537",
    "stickerId": "52002734"
  }
end

小説家になろう!の小説情報を取得

なろう小説APIというものがあります。

こちらを使って、特定の小説(ncode: 'n8920ex')の最終更新日を取得してみましょう!

追加アクション
def narou_api
  uri = URI('https://api.syosetu.com/novelapi/api/')
  params = {
    out: 'json',
    ncode: 'n8920ex',
  }
  uri.query = URI.encode_www_form(params)

  res = Net::HTTP.get_response(uri)
  novel = JSON.parse(res.body)
  p novel
  {type: 'text', text: "#{novel[1]['title']}\n\n最終更新:#{novel[1]['general_lastup']}"}
end

ncode: 'n8920ex'は個人的に大好きな小説ですw

なろう小説APIは語句検索やトレンド作品一覧も取得できます!
また、なろう小説に限らず様々なAPIがあります。APIを活用し、趣味の情報を送ってくれるLINEbotを作ってみるのもおすすめです!

確認テンプレート

「確認テンプレート」を使用してみましょう!

追加アクション
  def confirm_template
    {
      "type": "template",
      "altText": "これは確認テンプレートです",
      "template": {
        "type": "confirm",
        "text": "本当に?",
        "actions": [
          {
            "type": "message",
            "label": "はい",
            "text": "はい"
          },
          {
            "type": "message",
            "label": "いいえ",
            "text": "いいえ"
          }
        ]
      }
    }
  end

LINEっぽいメッセージ!
テンションが上がります。

条件分岐をしてみよう!

これで最後です!

差分
def callback
  body = request.body.read
  events = client.parse_events_from(body)
  
  events.each do |event|
    message = []
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
+        case event.message['text']
+        when 'クラッカー' then
+          message.push(sticker)
+        when 'らんてくん' then
+          message.push(runtequn_image)
+        else
+          message.push(parroting(event))
+        end
      end
    end
    client.reply_message(event['replyToken'], message)
  end
end

これで、メッセージに応じて返信することができるようになりました!

先ほどの確認テンプレートを組み合わせてもいいですね!

おわりに

おつかれさまでした!
できることはまだまだたくさんあります!
ぜひ以下の公式リンクも見てみてください〜

さらにアドバンスな内容をやりたい方は、
postbackを利用したクイズを3問作ってみる」のが良いと思います!
~~もしかしたら記事を書くかも。~~記事書きました!

ここまで全3本、お読みいただきありがとうございました!

次は何を書こうかしら・・・

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3