くりにっき

フルスタックキュアエンジニアです

ChatWorkMentionTaskを作った #megurorb

Meguro.rb#12 で趣味アプリについてのLTしたので資料を上げておきます

megurorb.connpass.com

スライド版

sue445.github.io

エントリ版

ChatWorkMentionTaskとは

f:id:sue445:20180226235644p:plain

動作風景

  • 自分宛にきたメンションが自動的に別部屋にタスク化され、一覧表示される
  • 重要なものや後で対応必要なものだけ残して、それ以外のタスクを完了にする運用

f:id:sue445:20180226235658p:plain

所感

  • 半月くらい人柱運用してるけど日々の仕事がむっちゃ捗ってる!!!
  • ぶっちゃげChatWork本体に欲しい機能なんだが、3年前から要望は出ている がいまだに実装されていないので諦めて自分で作った

技術的なこと

仕組み

  1. ChatWorkMentionTaskにChatWorkのアカウントでOAuth認証
  2. ChatWorkの自分のアカウントにChatWorkMentionTaskのwebhookを登録
  3. メンションがきたらwebhookが飛んできてタスク化される

頑張ったこと

ChatWorkのAPIのリフレッシュトークンの有効期限は2週間なので、リフレッシュトークンが切れる3日前にリマインド用にタスクを作るようにした

f:id:sue445:20180226235725p:plain

webhookの params[:body] にチャット本文が入っていて、それがログに出るのが嫌だったのでパスワード同様フィルタリングするようにした。

f:id:sue445:20180226235744p:plain

f:id:sue445:20180226235756p:plain

https://github.com/sue445/chatwork_mention_task/commit/ec3e2583044e2c132ef1de9ef0c656f1e74dcac1

副産物の紹介

  • omniauth-chatwork 💎
  • chatwork 💎
  • chatwork_webhook_verify 💎
  • dockerfile-heroku-cli 🐳
  • dockerhub-slack-webhook 🐳

omniauth-chatwork 💎

https://github.com/sue445/omniauth-chatwork

実際の設定

Railsだとこんな風に書いておくだけでいい感じにChatWorkのOAuth認証が使えるようになる

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :chatwork, ENV["CHATWORK_CLIENT_ID"], ENV["CHATWORK_CLIENT_SECRET"], scope: ["users.profile.me:read", "rooms.tasks:write", "rooms.info:read"]
end

https://github.com/sue445/chatwork_mention_task/blob/10dd0c197060fbc62016fe33b60a2089dfb74261/config/initializers/omniauth.rb

chatwork 💎

https://github.com/asonas/chatwork-ruby

やったこと

f:id:sue445:20180226235815p:plain

頑張ったこと

実際のテストコード

  • stub_chatwork_requestit_behaves_like :a_chatwork_api でramlを利用
  • APIクライアントではテストデータの生成が面倒なのでそこを公式が提供しているデータを使って自動化できて便利
describe ".create", type: :api do
  subject { ChatWork::Message.create(room_id: room_id, body: body, &block) }

  let(:room_id) { 123 }
  let(:body)    { "Hello ChatWork!" }

  before do
    stub_chatwork_request(:post, "/rooms/#{room_id}/messages", "/rooms/{room_id}/messages")
  end

  it_behaves_like :a_chatwork_api, :post, "/rooms/{room_id}/messages"
end

https://github.com/asonas/chatwork-ruby/blob/v0.8.0/spec/lib/chatwork/message_spec.rb#L24-L35

chatwork_webhook_verify 💎

# app/controllers/webhook_controller.rb
class WebhookController < ApplicationController
  before_action :verify_chatwork_webhook_signature!
end

リクエストごとにtokenを変えて検証する必要がある場合はこんな感じ

class WebhookController < ApplicationController
  before_action :set_user
  before_action :verify_signature!

  private

    def verify_signature!
      return unless Global.app.verify_signature?

      verify_chatwork_webhook_signature!(@user.webhook_token)
    end
end

https://github.com/sue445/chatwork_mention_task/blob/10dd0c197060fbc62016fe33b60a2089dfb74261/app/controllers/webhook_controller.rb

dockerfile-heroku-cli 🐳

  • https://github.com/sue445/dockerfile-heroku-cli
  • https://hub.docker.com/r/sue445/heroku-cli/
  • CircleCIからherokuにデプロイする時に毎回 heroku/cli をダウンロードしたくなかったのでインストール済のイメージを作った
  • alpineに必要最低限のパッケージやバイナリしか入れてないので47MBしかない超軽量イメージ
    • Docker Hubを検索してると似たようなイメージを作ってる人はたくさんいるけど、自分が見た範囲では sue445/heroku-cli が最軽量

頑張ったこと

常に最新のheroku/cliをDockerイメージで使いたかったので、heroku/cliの更新を自動検知してDockerイメージを自動ビルドする仕組を作った

  1. CircleCIのスケジューラが週1で起動
  2. heroku cliのバージョンが上がっていればCircleCIがファイルをコミットしてGitHubにpush
  3. GitHubにpushされればDocker Hubの automated builds でビルドがされる

https://github.com/sue445/dockerfile-heroku-cli/blob/fd4517b1b252e182d7b318fed74fe95fbe79e782/.circleci/config.yml#L64-L79

dockerhub-slack-webhook 🐳

  • https://github.com/sue445/dockerhub-slack-webhook
  • Docker Hubでビルドした後にSlackに通知するためのwebhook
  • ビルドしたイメージがいつビルド終わるか分からないので、Slackに手軽に通知できるようにしたかった

f:id:sue445:20180226235907p:plain

頑張ったこと

Deploy to Herokuボタンに対応してるので、Herokuのアカウントさえあればワンクリックでデプロイできる

f:id:sue445:20180226235917p:plain

まとめ

  • ChatWorkを使ってる場合はChatWorkMentionTaskは便利なので是非使ってください
  • RubyでChatWorkをハックする技術はだいたい制覇できた感あるw

2018/8/9 追記

ChatWorkのAPIのリフレッシュトークンの有効期限は2週間なので、リフレッシュトークンが切れる3日前にリマインド用にタスクを作るようにした

リフレッシュトークンの期限を無期限に設定できるようになったので上記処理は不要になりました

sue445.hatenablog.com

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy