Forkwell Jobs で人事向けSlack連携機能(Slack Button)を実装した話

こんにちは、Forkwell事業部の正徳です。 先日、Forkwell Jobsの採用担当者様向けにSlack通知機能をリリースしましたので、お知らせさせて頂きます。

f:id:tshotoku:20151001144051p:plain

また、Slack ButtonをRailsで実装する方法も後述しているので、エンジニアの方々にも参考になるかと思います。

どんな機能?

Forkwell Jobs では、ユーザーが掲載されている求人に対して「話を聞きたい」「応募」のアクションを行うことができます。

f:id:tshotoku:20151001144143p:plain

このアクションが発生したとき、採用担当者様にメール通知だけではなく、Slack にも通知する機能です。

なぜ作ったか?

もともと、通知にはメール通知しか使用できませんでした。 ほとんどの企業では採用活動のためにメーリングリストを作成し、そのメールアドレスを使用しています。

しかし、弊社groovesのようにSlackを全社導入している企業の場合、Slack通知の方が気づきやすいのではないでしょうか? ユーザーのアクションに素早く気付けることは大きな利点になると考え、試しに実装してみました。

テスト運用期間

実装できたので、まずは社内で1ヶ月ほどテスト運用をしてみました。

f:id:tshotoku:20151001144202p:plain

ヒアリング、ブラッシュアップ

弊社の採用担当者にヒアリングを行いました。その結果、下記のような感想を頂けました。

  • メールよりもSlackの方が気づきやすい
  • 面接の関係者への連絡がスムーズに進む
    • エンジニアにもエントリーがあったことがすぐに伝わる

また、他エンジニアからのフィードバックにも対応し、UI/UXをブラッシュアップしました。

  • 人事担当者がWebHook URLを直接入力するのは大変
    • 対応:「Slack Button」の導入
  • 通知のテストをAjaxで行いたい(初期verでは普通に画面遷移してました)
    • 対応: Ajax化

ちなみに、Slack Buttonを押した後の設定画面は下記のようになります。

f:id:tshotoku:20151001144210p:plain

締め

Slack通知機能の設定は人事向けの管理画面から簡単に設定できます。 Forkwell Jobsで求人を掲載している企業の採用担当者様はぜひお試しください。

(エンジニア向け)Slack Button の実装方法

せっかくなので、Slack Buttonを使ってみたいエンジニア向けに、導入手順もまとめておきます。参考にどうぞ。

まぁ、基本的にSlack Buttonの手順に沿って設定すれば動きます。

1. アプリ登録

Step1. の説明にあるように、Create your appからアプリ登録を行います。

f:id:tshotoku:20151001144221p:plain

ちなみに、この画面で入力した項目は後から変更が可能です。

2. Slack Button の配置

Step2 にタグが表示されるので、コピーして使います。

f:id:tshotoku:20151001144232p:plain

Forkwell Jobsではhamlを使ったり、 return_uri を使っている関係で少し変更して使いました。

%a.add_to_slack(href="https://slack.com/oauth/authorize?scope=incoming-webhook&client_id=#{Settings.slack.client_id}&redirect_uri=#{callback_admin_slack_notification_url(@company.user_name)}")
  %img(alt="Add to Slack" height="40" width="139" src="https://platform.slack-edge.com/img/add_to_slack.png" srcset="https://platform.slack-edge.com/img/add_to_slack.png 1x, https://platform.slack-edge.com/img/add_to_slack@2x.png 2x")

3. WebHook URLの取得

Slack Buttonを押した後、ユーザーが Team や channel の選択をすると、 return_uri に戻ってきます。 戻ってきたらoauth.accessを参考に、WebHook URLを取得します。

  • Controller
def callback(code)
  redirect_uri = callback_admin_slack_notification_url(username: @company.user_name)

  if @company.update_slack_url_by(code, redirect_uri)
    notice = 'Webhook URLの設定に成功しました'
  else
    notice = 'Webhook URLの設定に失敗しました'
  end

  redirect_to edit_admin_slack_notification_path(username: @company.user_name), notice: notice
end
  • Model
def update_slack_url_by(code, redirect_uri)
  ret = false
  params = {
    client_id: Settings.slack.client_id,
    client_secret: Settings.slack.client_secret,
    code: code,
    redirect_uri: redirect_uri
  }
  uri = URI.parse "https://slack.com/api/oauth.access?#{params.to_query}"
  res = Net::HTTP.get(uri)
  json = ActiveSupport::JSON.decode res

  ret = update slack_url: json['incoming_webhook']['url'] if json['ok']
rescue => e
  Airbrake.notify e
ensure
  return ret
end