読者です 読者をやめる 読者になる 読者になる

OUCCにうごめくbot達

この記事はOUCC Advent Calendarの記事として書かれました.

はじめに

前年度我が部ではミーハーな副部長とミーハーなサーバー係が揃ったおかげで部内に様々なツールが導入されました. その一つが部内チャットツールのslackです. 今年度は現役部員の多くに加入してもらったため平常時の雑談の他, 学祭などイベントでの意思疎通に有効活用されていました.

さて、slackといえばBOTの作りやすさ、そしてそれによるクソBOTの量産が有名です. 例にもれずOUCCのslackでも暇な部員が作った大量のbotがうごめいていています. この記事ではbotおよび開発環境の紹介をしたいと思います.

BOTの作り方

さあbotを作ろうと思って環境を構築するところから始めるのは面倒なものです. OUCCではそんなbotづくりへのハードルを下げようとサーバーにbot用の区画を用意し, 部員が好きにbotを作れるようにしています.

OUCCのGitHub organizationにはslack BOT専用のリポジトリが用意されており, このリポジトリにコミットすることでサーバーへデプロイが行われbotが動作する仕組みになっています.

またbot本体とは別にslackのサーバーからのリクエストを受けbotに渡すレイヤを作っており, 任意の言語でbotを作ることができるようになっています. Ruby, Python, Perl, JavaScript, ShellScriptなどサーバにインタプリタが入っている言語であれば設定を書き加えるだけで動作させられます. 例えば下で紹介する飯テロbotのコードはRubyで書かれています.

require 'json'
require_relative "util.rb"

params = JSON.parse(ARGV[0])

keyword = "\u98ef\u30c6\u30ed"
path = "/ajax/services/search/images?"
path += URI.encode_www_form({q: keyword, v: 1.0, rsz: :large, start: rand(1..100)})

Net::HTTP.start("ajax.googleapis.com"){|http|
  res = http.get(path)
  json = JSON.parse(res.body)

  msg = json["responseData"]["results"][0]["url"] + "\n"+ BOT_MSG.sample
  post_to_slack(params["channel_id"], MESHIYA_BOT_TOKEN, msg)
}

これだけでユーザーが「飯テロ」とつぶやいたチャンネルに飯テロ画像を投げ返すbotの完成です.

またslack上にBOTのテスト・デバッグ用のチャンネルを用意しています. ここで他のユーザーを邪魔することなくBOTを本番環境で動かせる他, ここからサーバのログを参照することもできます.

BOT

さて, それでは部員達が腕を奮って作ったクソbotたちを紹介しましょう.

部室カメラbot

専用チャンネルで「ぶしつ」とつぶやくと現在の部室画像を拾ってくるbot.

僕のアカウントが奴隷のようにこき使われているのはAPI上仕方がない仕様です…

友利奈緒bot

友利奈緒とつぶやくと友利奈緒画像を拾ってきます.

飯テロbot

飯テロ画像を拾ってくるbot.

Yo!bot

「Yo username」とつぶやくと任意のユーザーへYoを送ることができるbot.

dominion bot

ドミニオンのアイテムを選んでくれるbot.

amazon bot

amazonで商品検索ができるbot.

めしやbot

今日はどこでご飯を食べようか、そんな時に活用できるbot.

ゲームbot

chatしていたら突然ゲームがしたくなった、そんなときに使えるbot.

課題

課題としては現状このbotシステムが部のサーバではなく僕の自前サーバーで動作していることが挙げられるでしょう. この実験環境はいつ吹き飛ばすかわからないので誰か移行作業をやってくれるといいなあ. あと部員の皆さんはもっとbotを作りましょう.

それでは皆様よいお年を!