Rails에서 스탬프를 마음대로 밀어주는 Slack의 bot를 만들어 보았다

안녕하세요.
출장으로 후쿠오카에 와 있습니다만, 이쪽의 아침은 조금 춥네요.

작업의 효율화를 실시하고 싶고, Ruby on Rails로 마음대로 스탬프를 눌러 주는 Slack의 bot를 만들어 보았습니다.

그 일부 시종을 말해볼까라고 생각합니다.

slack-ruby-client



익숙한 Rails에서 아빠와 해 버리고 싶다.
그런 생각으로부터, 찾아온 gem이 이쪽.

slack-ruby-client

메소드는, Slack의 API를 그대로 스네이크 케이스에 변환한 것 같은 메소드이므로, SlackAPI 의 레퍼런스도 보면서 저것 이것 시험해 구현을 진행시키고 있었습니다.

1. bot 등록



먼저 bot를 여기으로 등록합니다.



[Add Configlation]에서 Slack에서 표시하고 싶은 bot의 이름을 입력하고 [Add bot integration]을 클릭하면 상세한 설정을 할 수 있는 화면으로 날아갑니다.



아이콘의 설정이나, bot를 사용할 수 있는 IP의 제한등도 여기에서 설정할 수 있게 되어 있었습니다.



여기 상단에 표시되는 "API Token", 이것은 나중에 구현하는 데 필요하기 때문에 여기에 메모.

2. 채널에 bot 초대



Slack을 시작하고 bot를 실행하고 싶은 채널에서 방금 만든 bot를 초대합니다.





이렇게 하면 bot에 열람 권한과 발언권이 주어지는 것 같습니다.

3. 구현



우선 Gemfile에 gem을 추가하네요.
gem 'slack-ruby-client'
그런 다음 bot에 대한 설정을 위한 파일을 config/initializers/에 저장합니다.
slack_api.rb라는 이름으로 다음 코드를 작성했습니다.

slack_api.rb
require 'slack'

Slack.configure do |config|
  config.token = ENV['BOT_TOKEN']
end

Slack::Web::Client.config do |config|
  config.user_agent = 'Slack Ruby Client/1.0'
end

Slack::RealTime::Client.config do |config|
  config.start_method = :rtm_start
end
config.token = ENV['BOT_TOKEN']의 부분입니다만, 환경 변수에 bot 등록시에 취득한 API Token을 BOT_TOKEN이라고 하는 변수명으로 서버에 등록해, 그것을 읽어들일 수 있도록 한 기술입니다.

Settings에 쓰는 것이 좋았을까라고 생각하거나…

그리고, 실제로 움직이는 파일을 어디에 둘까는, 용도나 사람에 따라서 다르다고 생각합니다만, 나는 app/batch 라고 하는 디렉토리에 파일을 만들어, 클라이언트를 호출하는 메소드를 기재.

reaction_bot.rb
def web_client
  @web_client ||= Slack::Web::Client.new
end

def real_time_client
  @real_time_client ||= Slack::RealTime::Client.new
end

real_time_client를 사용하면 bot이 참여하는 채널의 메시지를 폴링 할 수 있기 때문에 특정 사용자가 중얼거린 순간에 스탬프를 누르는 괴롭힘을 실행할 수 있도록 해 보았습니다.

reaction_bot.rb
TARGET_USER_ID = {ターゲットにしたいユーザーのID}
def execute
  real_time_client.on :message do |message|
    if message.user == TARGET_USER_ID
          web_client.reactions_add(name: 'yasei_1', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_2', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_3', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_4', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_5', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_6', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_7', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_8', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_9', channel: message.channel, timestamp: message.ts)
          web_client.reactions_add(name: 'yasei_10', channel: message.channel, timestamp: message.ts
    end
  end
  real_time_client.start!
end

이것을 Rake 태스크로 실행.



훌륭하게 걸렸습니다.

……… 그런 농담을 하면서 웃음

실제로는, message의 내용을 DB에 보존해 가, 그 이력과 새롭게 온 메시지를 비교해 그것에 맞는 스탬프 눌러 가는 것을 만들었습니다.

흥미있는 분은, 시험해라.

다음 번에는 업로드 된 이미지를 얼굴 인식시켜 스탬프를 만드는 bot를 만들어 보려고합니다.

좋은 웹페이지 즐겨찾기