はじめに
前回記事で作成した、以下のコードを改造していきます!
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つのアクションとして」作成してみます。
parroting
とimage
の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本、お読みいただきありがとうございました!
次は何を書こうかしら・・・