介绍
这次,在开发通勤时发送奇塔趋势文章的LINE Bot的同时,您可以有效利用通勤时间。将 Rails 与外部 API 连接起来,如何使用LINE Messaging API SDK,如何使用 LINE Flex 消息我要学习。
我们将以教程的形式在实际开发 LINE Bot 时解释开发方法。
本文的目标受众
- 想要开始 LINE Bot 开发的人
- 想要学习如何将 Rails 与外部 API 链接的人
- 想通过个人发展制作LINE Bot的人
目标可交付成果
一个 LINE Bot,当 LINE 发送“现在开始工作”时,它会返回 Qiita 上的前 5 篇热门文章。
关于 LINE 机器人
什么是 LINE 机器人?
LINE Bot 是一个聊天机器人,可以自动回复 LINE 上的消息。
聊天机器人是一个自动响应用户消息的程序。
通过使用 LINE Bot,您可以为用户提供各种途径,例如客户支持、产品优惠券和预订功能。
[您可以使用 LINE Bot 做什么]
- 自动回复来自用户的消息
- 响应
- 提供选项
- 发行和使用优惠券
- 网站方向
在本次开发中,我们将开发自动向用户发送消息的功能。
LINE 机器人的工作原理
LINE Bot 由 LINE 提供消息 API可用于开发。
这个消息 API牙齿LINE 开发者控制台它可以在管理上为开发人员创建称为渠道用作通信路径。
用户向 LINE Bot 发送消息,然后收到回复的流程可以表示如下。
① 用户使用智能手机应用程序发送消息
② 发送的消息通过渠道到达LINE平台,到达Rails app
③ 分析Rails app收到的消息
④ Rails 请求发送给用户的消息到 LINE 平台
⑤ 从LINE平台向用户的智能手机发送消息
尝试做一个简单的欧姆返回应用程序
首先,我们将按照官方文档中的流程,开发一个简单的欧姆返回应用程序。
为消息传递 API 创建通道
首先,通过前面介绍的消息渠道的LINE 开发者控制台将使用 .
首先,访问下面的官方网站。
首先,使用您的 LINE 帐户登录。
初学者在这里线开发人员请注册一个新帐户
注册完成后,从侧边栏提供者选择创造请点击。
注册完成后,就可以看到自己创建的provider了。
在下面创建一个新频道。
当您转到创建屏幕时,从顶部输入以下内容。
- 频道类型 - 消息 API
- Provider - 您刚刚注册的名称
- 公司或所有权国家 - 日本
- 频道图标 - 任何图像
- 频道名称 - 任何名称
- 频道说明 - 可选说明
- 类别 - Web 服务
- 子类别 - Web 服务
注册完成后,将显示以下屏幕。
当您切换到 Messaging API 选项卡时,会出现一个 QR 码,因此您可以从那里在您的 LINE 上注册 LINE Bot(还没有工作)
现在已经创建了通道,让我们准备 Rails 应用程序端。
准备 LINE Messaging API SDK
Rails环境搭建
在对应目录执行以下命令,创建一个Rails应用。
rails new . --api
此外,我们将继续假设已经构建了 Ruby 和 Rails 环境。如果您还没有这样做,请完成您自己的环境搭建。
安装 LINE Messaging API SDK for Ruby
接下来,安装gem 来做上图的以下部分。
您可以使用 LINE Messaging API SDK 轻松开发 LINE Bots。
这次是为Ruby准备的LINE Messaging API SDK for Ruby使用。
将以下内容添加到 gem 文件中。
gem 'line-bot-api'
描述完成后,使用以下命令执行安装。
bundle install
路由设置
接下来,设置 Rails 以便它可以接收从 LINE 平台发送的请求。
Rails.application.routes.draw do
post 'callback' => 'line_bot#callback'
end
控制器设置
接下来,创建一个用于处理的控制器以与路由器关联。
rails g controller LineBot
将创建以下文件。
app/controllers/line_bot_controller.rb
输入下面的值
class LineBotController < ApplicationController
def callback
end
end
现在 Rails 端的准备工作已经完成,我们将继续准备接收来自 LINE 的消息。
使用 ngrok
接下来使用ngrok进行设置,使本地创建的app可以临时对外发布。
安装ngrok 和Homebrew。
brew install ngrok
安装完成后,如果通过以下命令显示版本,则完成。
ngrok --version
接下来,前往 ngrok 网站并注册一个帐户。
注册完成后,从侧面菜单的Your Authtoken 获取令牌。
执行以下命令以链接您的 PC 和 ngrok 帐户。
ngrok authtoken 作成したトークン
现在 ngrok 已经准备好了,让我们运行它。
使用以下命令启动本地环境。
rails s
然后执行以下命令执行ngrok。
我的端口号是3000,所以我设置为3000。
ngrok http 3000
执行后显示的 URL 将是可以从外部访问的 URL。
Forwarding https://xxxx -> http://localhost:3000
第一次尝试访问它时,我收到错误消息。
这个错误是由Rails中设置的网络攻击对策引起的,所以我们将更改设置。
Rails 安全设置
Rails 有标准的安全设置,所以我们将禁用安全措施。
有关 Rails 安全性的更多信息,请参阅官方文档。
这次我只写结论代码。
Rails.application.configure do
# 省略
config.hosts.clear
end
现在 Rails 可以接收来自 LINE 平台的 POST 请求,我们将继续合作。
将 LINE 频道与 Rails 链接
接下来,设置 Rails 应用程序和 LINE 频道,以便它们可以交换消息。
在 LINE 的频道上获取令牌
获取创建通道时发出的通道密钥和通道访问令牌,并将其与 Rails 应用程序链接。
打开 LINE Developers 并检查创建的提供程序页面。
选项卡基本设置向下滚动。
向下滚动到频道秘密什么时候断言签名密钥有一个项目叫做,所以检查值。
然后制表符消息 API向下滚动。
然后,有地方为通道颁发访问令牌,所以令牌被颁发。
现在channel secret和channel access token都准备好了,我们来设置Rails端的值。
导轨设置
导轨侧环境变量,设置您之前获得的访问令牌。
首先,我们将添加一个 gem 来管理环境变量。
gem 'dotenv-rails'
bundle install
创建一个定义环境变量的文件
touch .env
输入之前发布的密钥和令牌。
LINE_CHANNEL_SECRET='xxxxxxxx'
LINE_CHANNEL_TOKEN='xxxxxxxx'
准备 LINE Messaging API SDK
LINE Messaging API SDK 有一个名为Line::Bot::Clien 的类用于LINE Bot 处理,所以我们将实例化这个类并创建一个消息解析和回复函数。
我会参考这个来了解如何编写。
class LineBotController < ApplicationController
def callback
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
Line::Bot::Client 类可以通过这个描述来实例化。
将 Rails 应用注册到 LINE 频道
既然已经根据环境变量完成了与 Rails 端通道的链接,接下来我们来链接通道端的 Rails 应用。
选项卡消息 API改成Webhook URL,输入您之前通过 ngrok 获得的 URL。
还将使用 Webhook 设置为 ON。
* 由于可以从 ngrok 中获取的 URL 有过期日期,因此每次启动 ngrok 时都需要更新 URL。
最后,设置为消除向 LINE Bot 发送消息时返回的自动消息。
如下设置转移目标。
现在准备工作已经完成,我们来实现 ohm 返回函数,将用户发送的消息原样返回。
检查从 LINE 发送到 Rails 的消息
将代码添加到 Rails 端控制器,以便可以在 Rails 端检查从 LINE 发送的消息。
class LineBotController < ApplicationController
def callback
puts "======="
puts body = request.body.read
puts "======="
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
写下这个描述并在LINE上发送消息。
然后,您可以在命令行上确认已获取消息,如下所示。
接下来,我们将实现该实现,以便从 LINE 实际接收到的消息按原样返回。
参考GitHub,将回调方法改写如下。
def callback
body = request.body.read
events = client.parse_events_from(body)
end
-
您可以通过将正文放入参数
parse_events_from来获取事件数组
实际上,events 数组中包含以下数据。 (仅显示消息部分)
"{
"events":
[
{
// 省略
"message":
{
"type":"text",
"id":"xxxxxxxxx",
"text":"Hello world"
}
}
],
}"
由于events 是一个数组,所以使用each 方法获取message["text"] 并获取LINE 发送的消息。
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
我将详细解释代码。
首先,它检查下面代码循环的event 是否是Line::Bot::Event::Message 类。
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
在这个过程中,我们检查从LINE收到的事件是否是消息事件。
另外,由于除了message事件外,都是在官方文档中发布的,请查收。
接下来,如果它实际上是一条消息,则将接收到的文本值存储在哈希 message 中。
此外,回复功能是使用响应令牌给出的。
case event.type
when Line::Bot::Event::MessageType::Text
message = {
type: "text",
text: event.message["text"]
}
client.reply_message(event['replyToken'], message)
end
响应令牌的处理请参考以下内容。
当您在LINE上实际发送消息时,您可以检查数据是否返回。
目标开发
至此,您已经了解了 LINE Bot 开发的基础知识。
从这里开始,这次的目标是“通勤时接收Qiita趋势文章的LINE Bot我们将继续开发
功能如下。
- 到 LINE 机器人去工作如果您发送消息“
由于Qiita官方API无法获取Qiita的趋势文章,我们将使用非官方的Qiita趋势API。
实施方针
目标将通过以下步骤实现
- 设置为从 Rails 向 LINE 发送多条消息
- 通过 Rails 访问 Qiita 的趋势 API 获取响应数据
- "去工作”消息被发送回LINE。
我们将立即着手实施。
设置从 Rails 向 LINE 发送多条消息
首先,让我们看看如何从 Rails 向 LINE 写入多条消息。
在前面实现的
client.reply_message的描述中,通过使第二个参数中传递的消息为数组对象格式,可以向LINE发送多条消息。应用程序/控制器/line_bot_controller.rbmessage = [{type: "text", text: "メッセージ1"}, {type: "text", text: 'メッセージ2'}] client.reply_message(event['replyToken'], message)当 LINE 确认时,您可以确认已收到两条消息。
也就是说,点击 Qiita 趋势 API 获取趋势文章的 URL 并将其存储为哈希以创建多个趋势文章 URL。
通过使用 Rails 访问 Qiita 的趋势 API 获取响应数据
接下来,点击 Qiita 趋势 API 以获取 URL 并创建数据以发送到 LINE 应用程序。
目标如下所示:
应用程序/控制器/line_bot_controller.rbmessage = [{type: "text", text: "トレンドURL1"}, {type: "text", text: 'トレンドURL2'}] client.reply_message(event['replyToken'], message)使用
Net::HTTP.get_response点击Qiita趋势API并获取数据。添加如下描述,并在发送LINE消息的时机输出是否从Qiita趋势API获取数据。
应用程序/控制器/line_bot_controller.rbwhen Line::Bot::Event::MessageType::Text uri = URI('https://qiita-api.vercel.app/api/trend') res = Net::HTTP.get_response(uri) puts res.body if res.is_a?(Net::HTTPSuccess) # 出力の確認 message = [ {type: "text", text: "メッセージ1"}, {type: "text", text: 'メッセージ2'} ] client.reply_message(event['replyToken'], message) end检查终端,可以确认Qiita的趋势API的数据显示出来了。
仅从中提取链接的值。尝试获取响应数据的第一个值的趋势文章 URL。
uri = URI('https://qiita-api.vercel.app/api/trend') response = Net::HTTP.get_response(uri) response = JSON.parse(response.body) puts "===========" p response[0]["node"]["linkUrl"] // # 出力 puts "==========="您可以确认已获取数据,如下所示。
创建一条消息以实际循环并返回到 LINE。
uri = URI('https://qiita-api.vercel.app/api/trend') response = Net::HTTP.get_response(uri) response = JSON.parse(response.body) # LINEへ返すレスポンス message = [] # トレンド上位5記事のみ抽出 5.times {|i| hash = {} hash[:type] = "text" hash[:text] = response[i]["node"]["linkUrl"] message.push(hash) } client.reply_message(event['replyToken'], message)-
message = []正在准备返回LINE的数据的初始值 -
5.times循环 5 次获取前 5 篇热门文章 -
使用
hash[:text] = response[i]["node"]["linkUrl"]获取热门的 i 排名 ULR -
将
message.push(hash)得到的数据添加到数组中
当我实际检查它时,将返回数据。
"去工作”消息被发送回LINE。
最后,添加一个条件分支,这样只有在 LINE 端发送消息“去上班”时才会返回响应。
应用程序/控制器/line_bot_controller.rbdef 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 # ユーザーからのメッセージが「出勤なう」だった場合のみにメッセージを返す if event.message["text"] == "出勤なう" uri = URI('https://qiita-api.vercel.app/api/trend') response = Net::HTTP.get_response(uri) response = JSON.parse(response.body) # LINEへ返すレスポンス message = [] # トレンド上位5記事のみ抽出 5.times {|i| hash = {} hash[:type] = "text" hash[:text] = response[i]["node"]["linkUrl"] message.push(hash) } client.reply_message(event['replyToken'], message) end end end end end让我们检查一下实际行为。
我把数据拿回来了。
目标现已完成。
在最后
怎么样。这一次,我们以教程的形式开发了 LINE Bot。
这次我没有设置回复消息的样式,所以URL显示原样,但我想我可以使用
Flex Message自定义这个区域,所以我想尝试一下。另外,我想添加一个更新等,以便通过设置时间在工作时自动传递消息。
该区域建成后将对公众开放。 (我不好意思在现在的情况下发布它lol)
我们希望您在尝试开发 LINE 机器人或开发自己的机器人时,可以参考这篇文章。
我正在写很多其他文章,所以如果你能阅读它,我会很高兴。
-
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308622238.html