11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【LINE Bot】読書を手助けしてくれるコトバンクbotを作ってみた!

Last updated at Posted at 2020-08-20

作ったもの

コトバンクで単語を検索して、その意味を返信してくれるLINE Botです。
辞書アプリやブラウザを立ち上げなくても、LINEで手軽に単語や言い回しの意味を調べられます。
IMG_2318.PNG

アニメのタイトルだってお手のもの!
IMG_2317.PNG

背景

読書中の単語検索は煩わしい

たとえば読書をしていて知らない単語や言い回しに遭遇した場合、大抵は
「スマホでブラウザを起動」→「単語を入力」→「検索結果の一覧から適当にページを選択」→「ページ内で単語の意味を確認」
という手順でその意味を確認すると思います。(Kindleの辞書機能を使っていても、固有名詞や珍しい言い回しは意外とヒットしなかったり)

これが1冊で1〜2回の作業なら何も問題ないのですが、海外の古典文学や厨二用語全開のラノベ(謎の横文字や難読漢字だらけ!)などは、下手をすると数ページおきに知らない言葉が出てきたりして、そのたびに

「スマホでブラウザを起動」→「単語を入力」→「検索結果の一覧から適当にページを選択」→「ページ内で単語の意味を確認」→「次の単語を入力」→「検索結果の一覧から適当にページを選択」→……(以下ループ)
とするのは非常に面倒です。

そこでLINE Botの登場

その点、LINE Botであれば
「LINEを起動」→「Botに単語を送信」→「返答(単語の意味)を確認」
で済みますし、連続して検索する場合でも
「単語を入力」→「返答を確認」→「単語を入力」→……
だけで済みます。

また、チャット上に検索結果のログも残るので、読書後などにあらためて単語を確認することもできて一石二鳥です!

参考にした記事

Bot完成までの大まかな手順

  • LINE Developersの登録
  • Channelの作成
  • トークンの発行
  • Webhook URLの設定(Heroku上に作成したアプリのURLをあとから登録する)
  • Herokuの登録
  • Heroku上にアプリを作成
  • git push heroku master(アプリをHerokuにプッシュ)
  • トークンを環境変数として設定
  • アプリケーションの実装
  • gemの導入
  • callbackアクションに処理を記述
  • アプリをHerokuにアップ(完成!)

LINE Developersの登録

【Rails】1時間ぐらいで簡単にLINEのBot開発をしよう-アンケート集計Bot基礎-【画像付き】

1. 上の記事を参考に、Channelを作成

2. 「応答メッセージ: オフ」「Webhook: オン」に設定を変更

3. 「チャネルトークン」「チャネルシークレット」を発行

Herokuの登録

1時間でWikipedia検索できるLINE BOTをサクッと作ってみよう!

1.上の記事を参考に、Herokuに登録

2.Heroku上にアプリを作成(コマンドでもブラウザからでもOK)

3.さきほど発行した「チャネルトークン」「チャネルシークレット」をHerokuの環境変数に設定

% heroku config:set LINE_CHANNEL_TOKEN="チャネルアクセストークンの文字列" -a アプリケーション名
% heroku config:set LINE_CHANNEL_SECRET="チャネルシークレットの文字列" -a アプリケーション名

4.Line Developerのページに戻り、Webhook URLを設定

Webhook URLにhttps://作成したHerokuアプリのURL/callbackと設定し、
設定後に表示される「Webhookの利用」の項目もオンにする。

アプリケーションの実装

LINEBOT + RailsでWikipediabotを作ってみました。
Rails スクレイピング手法 Mechanizeの使い方

1.上の記事を参考にgemを導入

Gemgile
gem 'line-bot-api'
gem 'mechanize'
gem 'dotenv-rails'
% bundle install

2.ルーティングの設定

config/routes.rb
Rails.application.routes.draw do  
    post '/callback' => 'linebot#callback'  
end 

3.コントローラーの作成

% rails g controller linebot

4.コントローラーの編集

app/controllers/linebot_controller.rb
class LinebotController < ApplicationController
  require 'line/bot'
  require 'mechanize'

  # callbackアクションのCSRFトークン認証を無効
  protect_from_forgery :except => [:callback]

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

  def callback
    body = request.body.read

    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      head :bad_request
    end

    events = client.parse_events_from(body)

    events.each { |event|
      if event.message['text'] != nil
        # LINEで送られてきた文書を取得
        word = event.message['text']
        # インスタンス生成
        agent = Mechanize.new
      end

      # 取得に成功した場合の処理
      begin
        # ページのHTMLを取得
        page = agent.get("https://kotobank.jp/word/#{word}")

        # 要素を取得
        if page.search('.dictype.cf.daijisen').present?
          # デジタル大辞泉の項目が存在する場合の処理
          response = page.search('.dictype.cf.daijisen .description').inner_text.gsub(/(\s| )+/, '')
        elsif page.search('.dictype.cf.js-contain-ad.daijisenplus').present?
          # デジタル大辞泉プラスの項目が存在する場合の処理
          response = page.search('.dictype.cf.js-contain-ad.daijisenplus .description').inner_text.gsub(/(\s| )+/, '')
        else
          # デジタル大辞泉とデジタル大辞泉プラスの項目が存在しない場合の処理
          response = page.search('.description')[0].inner_text.gsub(/(\s| )+/, '')
        end
      # 取得に失敗した場合の処理
      rescue Mechanize::ResponseCodeError => e
        response = "見つかりませんでした!"
      end

      case event
      # メッセージが送信された場合
      when Line::Bot::Event::Message
        case event.type
        # メッセージが送られて来た場合
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
            text: response
          }
          client.reply_message(event['replyToken'], message)
        end
      end
    }

    head :ok
  end
end

コードの補足

# ページのHTMLを取得
page = agent.get("https://kotobank.jp/word/#{word}")

コトバンクでは検索したいワードをhttps://kotobank.jp/word/検索したいワードと指定するようなので、
ユーザから受け取ったワードを埋め込むようにして、getメソッドにURLを渡しています。

response = page.search('.dictype.cf.daijisen .description').inner_text.gsub(/(\s| )+/, '')

botから送られてくるメッセージの前後に大量の空白があったので、
.gsub(/(\s| )+/, '')を追加して、スペースを取り除いています。

5.Herokuにデプロイ

% git add .
% git commit -m "linebot"
% git push heroku master 

最後に

元々はAPIの学習を目的として作ったものでしたが、せっかくなので記事としてアウトプットしました!
ご指摘などございましたら、ぜひコメントよろしくお願いいたします!

11
8
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
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?