介绍

这次,在开发通勤时发送奇塔趋势文章的LINE Bot的同时,您可以有效利用通勤时间。将 Rails 与外部 API 连接起来,如何使用LINE Messaging API SDK,如何使用 LINE Flex 消息我要学习。

我们将以教程的形式在实际开发 LINE Bot 时解释开发方法。

本文的目标受众

  • 想要开始 LINE Bot 开发的人
  • 想要学习如何将 Rails 与外部 API 链接的人
  • 想通过个人发展制作LINE Bot的人

目标可交付成果

一个 LINE Bot,当 LINE 发送“现在开始工作”时,它会返回 Qiita 上的前 5 篇热门文章。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

关于 LINE 机器人

什么是 LINE 机器人?

LINE Bot 是一个聊天机器人,可以自动回复 LINE 上的消息。

聊天机器人是一个自动响应用户消息的程序。

通过使用 LINE Bot,您可以为用户提供各种途径,例如客户支持、产品优惠券和预订功能。

[您可以使用 LINE Bot 做什么]

  • 自动回复来自用户的消息
  • 响应
  • 提供选项
  • 发行和使用优惠券
  • 网站方向

在本次开发中,我们将开发自动向用户发送消息的功能。

LINE 机器人的工作原理

LINE Bot 由 LINE 提供消息 API可用于开发。

这个消息 API牙齿LINE 开发者控制台它可以在管理上为开发人员创建称为渠道用作通信路径。

用户向 LINE Bot 发送消息,然后收到回复的流程可以表示如下。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

① 用户使用智能手机应用程序发送消息
② 发送的消息通过渠道到达LINE平台,到达Rails app
③ 分析Rails app收到的消息
④ Rails 请求发送给用户的消息到 LINE 平台
⑤ 从LINE平台向用户的智能手机发送消息

尝试做一个简单的欧姆返回应用程序

首先,我们将按照官方文档中的流程,开发一个简单的欧姆返回应用程序。

为消息传递 API 创建通道

首先,通过前面介绍的消息渠道LINE 开发者控制台将使用 .

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

首先,访问下面的官方网站。

首先,使用您的 LINE 帐户登录。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

初学者在这里线开发人员请注册一个新帐户

注册完成后,从侧边栏提供者选择创造请点击。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

注册完成后,就可以看到自己创建的provider了。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

在下面创建一个新频道。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

当您转到创建屏幕时,从顶部输入以下内容。

  • 频道类型 - 消息 API
  • Provider - 您刚刚注册的名称
  • 公司或所有权国家 - 日本
  • 频道图标 - 任何图像
  • 频道名称 - 任何名称
  • 频道说明 - 可选说明
  • 类别 - Web 服务
  • 子类别 - Web 服务

注册完成后,将显示以下屏幕。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

当您切换到 Messaging API 选项卡时,会出现一个 QR 码,因此您可以从那里在您的 LINE 上注册 LINE Bot(还没有工作)

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

现在已经创建了通道,让我们准备 Rails 应用程序端。

准备 LINE Messaging API SDK

Rails环境搭建

在对应目录执行以下命令,创建一个Rails应用。

rails new . --api

此外,我们将继续假设已经构建了 Ruby 和 Rails 环境。如果您还没有这样做,请完成您自己的环境搭建。

安装 LINE Messaging API SDK for Ruby

接下来,安装gem 来做上图的以下部分。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

您可以使用 LINE Messaging API SDK 轻松开发 LINE Bots。

这次是为Ruby准备的LINE Messaging API SDK for Ruby使用。

将以下内容添加到 gem 文件中。

宝石文件
gem 'line-bot-api'

描述完成后,使用以下命令执行安装。

bundle install

路由设置

接下来,设置 Rails 以便它可以接收从 LINE 平台发送的请求。

配置/路由.rb
Rails.application.routes.draw do
  post 'callback' => 'line_bot#callback'
end

控制器设置

接下来,创建一个用于处理的控制器以与路由器关联。

 rails g controller LineBot

将创建以下文件。

app/controllers/line_bot_controller.rb

输入下面的值

应用程序/控制器/line_bot_controller.rb
class LineBotController < ApplicationController
  def callback
  end
end

现在 Rails 端的准备工作已经完成,我们将继续准备接收来自 LINE 的消息。

使用 ngrok

接下来使用ngrok进行设置,使本地创建的app可以临时对外发布。

安装ngrokHomebrew

brew install ngrok

安装完成后,如果通过以下命令显示版本,则完成。

ngrok --version

接下来,前往 ngrok 网站并注册一个帐户。

注册完成后,从侧面菜单的Your Authtoken 获取令牌。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

执行以下命令以链接您的 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 安全性的更多信息,请参阅官方文档。

这次我只写结论代码。

配置/环境/development.rb
 Rails.application.configure do
    # 省略
    config.hosts.clear
  end

现在 Rails 可以接收来自 LINE 平台的 POST 请求,我们将继续合作。

将 LINE 频道与 Rails 链接

接下来,设置 Rails 应用程序和 LINE 频道,以便它们可以交换消息。

在 LINE 的频道上获取令牌

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

获取创建通道时发出的通道密钥和通道访问令牌,并将其与 Rails 应用程序链接。

打开 LINE Developers 并检查创建的提供程序页面。

选项卡基本设置向下滚动。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

向下滚动到频道秘密什么时候断言签名密钥有一个项目叫做,所以检查值。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

然后制表符消息 API向下滚动。

然后,有地方为通道颁发访问令牌,所以令牌被颁发。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

现在channel secret和channel access token都准备好了,我们来设置Rails端的值。

导轨设置

导轨侧环境变量,设置您之前获得的访问令牌。

首先,我们将添加一个 gem 来管理环境变量。

宝石文件
gem 'dotenv-rails'
bundle install

创建一个定义环境变量的文件

touch .env

输入之前发布的密钥和令牌。

.env
LINE_CHANNEL_SECRET='xxxxxxxx'
LINE_CHANNEL_TOKEN='xxxxxxxx'

准备 LINE Messaging API SDK

LINE Messaging API SDK 有一个名为Line::Bot::Clien 的类用于LINE Bot 处理,所以我们将实例化这个类并创建一个消息解析和回复函数。

我会参考这个来了解如何编写。

应用程序/控制器/line_bot_controller.rb
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。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

* 由于可以从 ngrok 中获取的 URL 有过期日期,因此每次启动 ngrok 时都需要更新 URL。

最后,设置为消除向 LINE Bot 发送消息时返回的自动消息。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

如下设置转移目标。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

现在准备工作已经完成,我们来实现 ohm 返回函数,将用户发送的消息原样返回。

检查从 LINE 发送到 Rails 的消息

将代码添加到 Rails 端控制器,以便可以在 Rails 端检查从 LINE 发送的消息。

应用程序/控制器/line_bot_controller.rb
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上发送消息。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

然后,您可以在命令行上确认已获取消息,如下所示。
【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

接下来,我们将实现该实现,以便从 LINE 实际接收到的消息按原样返回。

参考GitHub,将回调方法改写如下。

应用程序/控制器/line_bot_controller.rb
  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 发送的消息。

应用程序/控制器/line_bot_controller.rb
  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上实际发送消息时,您可以检查数据是否返回。

【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

目标开发

至此,您已经了解了 LINE Bot 开发的基础知识。

从这里开始,这次的目标是“通勤时接收Qiita趋势文章的LINE Bot我们将继续开发

功能如下。

  • 到 LINE 机器人去工作如果您发送消息“

由于Qiita官方API无法获取Qiita的趋势文章,我们将使用非官方的Qiita趋势API。

实施方针

目标将通过以下步骤实现

  1. 设置为从 Rails 向 LINE 发送多条消息
  2. 通过 Rails 访问 Qiita 的趋势 API 获取响应数据
  3. "去工作”消息被发送回LINE。

    我们将立即着手实施。

    设置从 Rails 向 LINE 发送多条消息

    首先,让我们看看如何从 Rails 向 LINE 写入多条消息。

    在前面实现的client.reply_message的描述中,通过使第二个参数中传递的消息为数组对象格式,可以向LINE发送多条消息。

    应用程序/控制器/line_bot_controller.rb
        message = [{type: "text", text: "メッセージ1"}, {type: "text", text: 'メッセージ2'}]
        client.reply_message(event['replyToken'], message)
    

    当 LINE 确认时,您可以确认已收到两条消息。

    【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

    也就是说,点击 Qiita 趋势 API 获取趋势文章的 URL 并将其存储为哈希以创建多个趋势文章 URL。

    通过使用 Rails 访问 Qiita 的趋势 API 获取响应数据

    接下来,点击 Qiita 趋势 API 以获取 URL 并创建数据以发送到 LINE 应用程序。

    目标如下所示:

    应用程序/控制器/line_bot_controller.rb
        message = [{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.rb
        when 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的数据显示出来了。

    【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

    仅从中提取链接的值。尝试获取响应数据的第一个值的趋势文章 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 "==========="
    

    您可以确认已获取数据,如下所示。
    【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

    创建一条消息以实际循环并返回到 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)得到的数据添加到数组中

    当我实际检查它时,将返回数据。

    【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

    "去工作”消息被发送回LINE。

    最后,添加一个条件分支,这样只有在 LINE 端发送消息“去上班”时才会返回响应。

    应用程序/控制器/line_bot_controller.rb
      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
              # ユーザーからのメッセージが「出勤なう」だった場合のみにメッセージを返す
              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
    

    让我们检查一下实际行为。

    【個人開発】通勤時にQiitaのトレンド記事が届くLINE Botを開発した

    我把数据拿回来了。

    目标现已完成。

    在最后

    怎么样。这一次,我们以教程的形式开发了 LINE Bot。

    这次我没有设置回复消息的样式,所以URL显示原样,但我想我可以使用Flex Message自定义这个区域,所以我想尝试一下。

    另外,我想添加一个更新等,以便通过设置时间在工作时自动传递消息。

    该区域建成后将对公众开放。 (我不好意思在现在的情况下发布它lol)

    我们希望您在尝试开发 LINE 机器人或开发自己的机器人时,可以参考这篇文章。

    我正在写很多其他文章,所以如果你能阅读它,我会很高兴。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308622238.html

相关文章:

  • 2022-12-23
  • 2021-07-13
  • 2022-02-25
  • 2021-07-11
  • 2022-02-08
  • 2021-08-19
  • 2021-08-04
  • 2022-01-19
猜你喜欢
  • 2022-12-23
  • 2021-09-20
  • 2021-07-22
相关资源
相似解决方案