Edited at

Railsで基本情報技術者試験の過去問題サイトを作る(6:SlackBOT編)


はじめに

ゆる〜く学ぶ。みんなのWeb勉強コミュニティー。 「にゅ〜ぶる会」を運用中です。

https://newburu.github.io/

そこで、何か教育用のコンテンツが欲しいなぁ〜と思い立ち、今回の企画をスタートしました!

Railsで基本情報技術者試験の過去問題サイトを作ります!


最終目標


  • 問題・回答の登録は、Scaffoldで簡易でOK

  • APIを用意して、ランダムに問題を抽出する機能を追加する

  • TwitterBOT、LINEBOT、SlackBOTが出来たら良いな


履歴

1:構築編

  https://qiita.com/newburu/items/ed59f47ac645b19620f6

2:日本語化(i18n)編

  https://qiita.com/newburu/items/4f12fdb61bf6cd601545

3:親子関係、登録編

  https://qiita.com/newburu/items/f2a20289be5ec1fc1b77

4:親子関係、参照編

  https://qiita.com/newburu/items/51b11bd02691efc2cc0d

5:API編

  https://qiita.com/newburu/items/89f9f847a2648bdd006c

6:SlackBOT編

  本ページ

7:Herokuデプロイ〜自動化編

  https://qiita.com/newburu/items/0a8bb02e1e8c8fe737c7


今回やる事


  • 登録された問題からランダムで問題を呟くSlackBOTを作ります


SlackBOTを作ります


1. SlackにBOTを追加します。

BOTのトークンが必要になりますので、

以下のURLからBOTを追加し、トークンをメモしておいて下さい。

https://api.slack.com/bot-users


2. ランダムで問題を取得するメソッドを追加します。

まずは、モデルに必要なメソッドを追加しましょう。

※もちろん、selfをつけてクラスメソッドですね!


app/models/question.rb

  def self.random()

Question.all.sample
end

うん、これは、一度全レコードを取得しちゃうので、メモリ圧迫するし遅いからダメですね。。。


app/models/question.rb

  def self.random()

Question.find( Question.pluck(:id).sample )
end

というわけで、先にIDをランダムに決めてから取得する方法に変更します。


3. Slackに呟くタスクを追加します。

SlackAPI用のGem(slack-api)があるので追加します。


./Gemfile

gem 'slack-api'


まずは、rails gでタスクを新規作成します。

rails g task slack_bot

作成されたファイルに処理を追加します。


lib/tasks/slack_bot.rake

require 'slack'

Slack.configure do |config|
config.token = ENV["SLACK_API_TOKEN"] # BOTのトークンは公開できない為、環境変数で設定します。
end

namespace :slack_bot do
desc 'ランダムに問題をSlackに書き込む'
task :random_question => :environment do
task :random_question => :environment do
question = Question.random
source = "出典:#{question.category1}年度 #{question.category2} 基本情報技術者試験 午前 問#{question.category3}"
msg = "【問題】\n#{question.msg}\n\nア #{question.answers[0].msg}\nイ #{question.answers[1].msg}\nウ #{question.answers[2].msg}\nエ #{question.answers[3].msg}\n\n#{source}"

# text:出力テキスト、channel:出力先のチャンネル名、username:表示ユーザ名
Slack.chat_postMessage(text: msg, channel: 'times_にゅーぶる', username: 'FE問題_出題BOT')
end
end



4. 確認しましょう

まずは、rakeタスクとして登録されているか確認しましょう。

$ rake -vT


〜 略 〜
rake slack_bot:random_question # ランダムに問題をSlackに書き込む
〜 略 〜

では、実行!

$ rake slack_bot:random_question

Slackを確認し、こんな感じの表示されればOKです!



※事前にブラウザから、問題を登録しておく必要があります。


今回はここまで

ありがとうございました!

次回は、このSlackBOTを定期的に実行する環境を作りましょう!