SlackBotにGIFを検索して流す機能を実装したら治安が崩壊した話


Qiitaご利用の諸君はおそらく社内でのコミュニケーションにSlackを利用していることだろう。

  • 特に開発しなくても便利に使える便利なアプリが山程ある
  • GitHubやGitLabの更新をメッセージとして流したりIssueなどをその場で発行できる
  • Emoji無限(?)に増やせるたのしい!!!

これだけの利点があるのだから今更強烈な事情がない限りChatOps基盤にSlackを導入するのはほぼ必然と言い切ってもいいだろう。

そしてSlackではもっとコアな機能を持ったボットなどを開発する人たち向けにAPIを用意している。

今回はSlackのAPIの一つ、RealTimeMessageAPIを用いて開発していたSlackのBotにとある機能を実装したこと、リリースをした話をしようと思う。

新機能の概要

Botがinviteされているチャンネルで

特定の書式(今回は put_gif )+検索文字列

と飛ばすとBotがそれを識別して適当なAPIからGIF画像のリンクを引っ張り、それを投げるというような機能を実装しようという話がチャンネル内で上がった。

丁度卒業研究が終わったところで暇だったので片手間で実装、そのままリリースすることにした。

実装の概略

GIF検索に利用するAPI

今回はtenor APIの提供するAPIを使う。
似たようなAPIにGIPHYがあるが、使ってみるとあまり検索結果がよくなかった(設定が悪かった?)ので移行した。

利用する言語など

アプリケーション全体の実装をRuby(v2.6.5)で行った。
また、RTM APIとの相互通信のためにWebsocketを使うため、faye/websocketも利用させてもらっている。

デプロイ

個人で持っているEC2インスタンスの中にdocker及びdocker-composeを使って置いた。

GIFを拾ってくる部分の関数に関して

機能のコア部分だけ切り抜いてきた。
これをメソッドとして入れてやればGIFのリンクを返す関数ができる

gif_get.rb
# frozen-string-literal: true

def gif_get(search_query)
  require 'http'
  # 環境変数は`docker-compose.yml`経由で`.env`を参照している
  tenor_api_key = ENV['TENOR_API_KEY']
  response = JSON.parse(HTTP.get('https://api.tenor.com/v1/search',
                                 params: { key: tenor_api_key,
                                           q: search_query,
                                           limit: 50 }))

  # 検索結果が0の場合は'SearchCount: 0`とだけ返して、
  # それ意外の場合は `Array#sample` でランダム抽出してURLを返す
  if response['results'].empty?
    'SearchCount: 0'
  else
    response['results'].sample['media'][0]['gif']['url']
  end
end


実際の成果物

ローカルでコンテナを展開しているので少し応答が遅れてしまっているが、本番のEC2上においているコンテナは1秒以内で応答を返してくれるので常用可能な機能になっている。


ここからが本題

で、弊部のワークスペースに入れた結果


なんだよこれ

TAGは関係ねえぞ

THE 世紀末と言わんばかりに遊ばれてしまった。事実今日だけで300くらいはメッセージの送受信があったように思える

この機能を一般的なグループが入れて良いものか

結論から言うと進捗阻害にしかならないのでやめておいたほうがいい(あたりまえ)

今回は非公認のサークル組織であるためにこんなもんがまかり通っているが、汎用性はともかくとして実はこれ以外に 色々モラル的にアレなやつまで出てきてしまった ことがあった。

他の方々などはやるのであればAPIアクセス時のリクエストパラメータに contentfilter というキー項目があったのでそちらを meddium なり high なりに指定してフィルタリングをかけたほうが良い。

逆にSlackにセンシティブなもんが出したい!みたいな人は off でもいいんじゃないだろうか。覗き見られたら死亡だけど。

最後に

開発しているSlackBotはソースコードをGitHubにて公開しているのでSlackを面白い感じにしたいサークルなどがあれば触っていただければ、と思います
nkc-ug/NKCUG_Slack_Bot

PRや新機能導入のIssueなどは弊部部員以外の方も歓迎します。
ただし導入して進捗が落ちたとかの文句は受けないぞ。