コピー2019.11.15今年の4月入社の新卒エンジニアujiです。今回は、Slackで動作する社員抽選botを作った話をしたいと思います。ACALL初の技術系記事らしいですが、気を引き締めずゆるく書いていきます。作ったきっかけ会議のファシリテータをランダムに決めたいACALLでは週の初めに社員全員で会議をします。ファシリテータは毎回固定だったのですが、各所から「セールスからエンジニアまでランダムでバトンタッチした方が面白いんじゃないか」という提案があり、ツールで選ばせる事にしました。ネットの海を漁ると抽選ツールは色々出てきますが、細部まで自分でカスタマイズできた方が面白そうだったので、一から作る事にしました。概要ACALLではチャットツールにSlackを採用しています。社員が誰でも手軽に利用できるもの提供するには、Slackアプリとして実装するのが一番良さそうだったので、SlackのWebhook·APIと連携するbotを開発することにしました。Lambdaで動かしています。少ないリクエスト実行時間であれば料金を抑えられる(参照)などがあります。本アプリは現状自社のみでの使用なので無料枠の範囲で収まっています。業務ではRubyでサーバー開発をしていますが、今回は、個人的に最近ハマっているGo言語を採用しました。いうSlackのAPIをいい感じに叩けるパッケージがあったので活用しています。言語にこだわりが無い場合は、Slack社が公式でサポートしているフレームワーク「Bolt」(Node.js)などを使った方が良いかもしれません。実際に踏んだ手順に沿って、軽く紹介します。呼ばれるサーバーレスアプリケーション構築用のオープンソースフレームワークを使うと、コマンド一発でLambdaアプリの雛形が作成できます。今回はGo言語の雛形を作成します。go上記のコマンドを実行すると雛形が作成されます。template.yamlmain.goを見ると、APIGatewayからのリクエストを引数として受け取り、レスポンスを返すhandler関数があります。パッケージで独自に定義されている型になっています。error)このhandler内に抽選botの処理を実装していきます。APIと呼ばれる機能があります。GatewayのURLをhookするフローが作れます。APIによるリクエストの認証部分を実装していきます。tokenによる認証が必要です。パッケージを使うと簡潔に書けます。tokenの認証しつつ、リクエストボディをEventsAPIEvent型にパースしてくれます。APIのhook先としてURLを登録する際、以下のようなパラメータを持った検証用のリクエストが送信されます。"url_verification"}このリクエストに対し、”challenge”の内容をそのまま送り返すレスポンスが必要になります。レスポンスが無いと、slackからはbotが正常に動作していないと見なされてしまいます。verificationのレスポンス部分を実装します。APIの情報を受け取るeventAPIEventのフィールドをたどると、色々な情報が得られます。bot宛のメンションによるhookかどうかの確認と、返信先チャンネルの取得を行います。APIでチャンネルのユーザー情報を取得Slackが提供するAPIを使って、メンションが送られたチャンネルのユーザーのID一覧を取得します。APIの利用もnlopes/slackを使えば簡単です。bot.GetUsersInConversation(&params)slack.New()で作成したslack.Client型で任意のAPIに紐づいた関数を使用します。取得したユーザーID一覧から1つのIDを抽選します。パッケージを使用しランダムに抽選します。userIDs[rand.Intn(len(userIDs)-1)]抽選結果メッセージを投稿ユーザー情報取得で登場したslack.Client型のPostMessage関数を使用し、メンションに抽選結果メッセージを返信します。false))デプロイ実装したアプリをデプロイして挙動を確認します。プロジェクトのルートディレクトリで以下のコマンドを実行し、アプリをAWSにデプロイします。オプションの値を変更してください。ujiMakefileに書くと楽です。botの設定が終わるとアプリが利用可能になります。実際にbot宛にメンションを送り、期待動作がされるか確認します。以下、なかなか言うことを聞いてくれないbotとの格闘の跡です。喋ってくれなかったbot動かしてみる修正を重ね、問題が無さそうだったので、ACALLのワークスペースにbotを投入。ワークフローが当選してしまいました...(しかも2回連続...)slack.Client.GetUsersInConversationがワークフローもユーザーとして取得してきてしまうみたいです。草スタンプまみれですまとめ色々と課題はありますが、とりあえず動きました。今では、全体会議のファシリテーター決めは毎回抽選botが行なっています。Message機能を使って抽選メニューを設置して運用しています。Messageの部分は機会があれば紹介したいと思います作ったアプリはGitHubで公開してますので、詳細が気になる方は是非ご覧ください。GitHub.github.comエンジニア募集してますACALLでは、バックエンド、フロントエンド、インフラ、IoTなど、各種エンジニアを募集しています。Happiness」をビジョンに、スマートオフィスプラットフォーム「ACALL(アコール)」を開発運営しております。共に働く仲間を募集しています。コピーこの記事を書いた人uji神戸高専の電子工学科を卒業後、ACALLにWeb·IoTエンジニアとして入社しました。このブログでは、「ウンチ」「おしっこ」といったワードが複数回出てきます。青空文庫のデータでテキストマイニング(の準備)ACALLアドベントカレンダー7日目、エンジニアリングマネージャー尾上です。エンジニアのujiです。-挑戦-2019.12.24託児付きワークスペースを試して見つけた3つのHappyな使い道2019.12.231年間の振り返り2019.12.20人が成長するには?を考えてみた2019.12.19タイトルとURLをコピーしました。