hubot-slack v4移行時のハマりどころ #hubot_chatops
Transcript of hubot-slack v4移行時のハマりどころ #hubot_chatops
1
hubot-slack v4移行時のハマりどころ
第3回 hubot×chatops勉強会
2017年2月23日@knjcode
2
hubot-slack v4 リリース随分前(2016年7月)ですが、hubotのslack用アダプターhubot-slack がv4系にメジャーアップデートしました。
3
hubot-slack v4 のメリットnode-slack-sdkのバージョンアップ (v3.4.0以降を利用)これにより互換性が失われた部分もあり
Slackサーバとのwebsocket接続の安定性が向上 (体感ですが)v3のほうが接続が切れる頻度が高いv3では稀に再接続出来ずにスタックすることがあった
ファイルアップロードのサポート
リアクションのサポート (v4.1.0から)
4
hubot-slack v4使ってますか?
v4からは内部で利用するSlack SDKが更新されており 既存のhubot-scriptの動作に影響がでる場合があります
この資料では、主にhubot-scriptの互換性に関して v4系への移行時のハマりどころをまとめて紹介します
5
目次
私のslackbot運用状況v3系とv4系におけるSlacke SDKのバージョンについてmsg.envelope.roomの値がchannel名からIDに変更attachments利用方法の変更名前とIDの相互変換ユーザデータの参照
Slack Web APIの呼び出し方法についてraw_messageの扱いファイルアップロード
リアクション
5
6 . 1
私のslackbot運用状況
趣味や業務で多数botを運用しています
bot数: 6(共同運用含む)ホスト: Heroku, Bluemix, AWS, Scaleway, sakura VPS形態: dockerコンテナ 4, heroku 1, Bluemix 1
6 . 2
hubotはざっくり3ロケーションで運用通信が多そうなbotはSlackやRedisの近くに配置1つを残してhubot-slack v4に移行済み
6 . 2
7
v3系とv4系におけるSlacke SDKのバージョンについて
hubot-slack v3.4.2 (v3系最新)@slack/client ⇒ 1.4.1を利用 (~1.4.0)
hubot-slack 4.3.2 (v4系最新)@slack/client ⇒ 3.8.1を利用 (^3.4.0)
8
msg.envelope.roomの値がchannel名からIDに変更
hubot-slack v3robot.respond /room/i, (msg) -> room = msg.envelope.room # room => "general"
hubot-slack v4robot.respond /room/i, (msg) -> room = msg.envelope.room # room => "C03NM270D"
��������������������� をchannel名として扱う hubot-scriptは修正が必要となる
8
9 . 1
attachments利用方法の変更
robot.emit 'slack.attachment', <attachements data>
から
msg.send <attachments data>
に変更になった
9 . 2
hubot-slack v3robot.respond /attachments test$/i, (msg) -> data = content: text: '*error*: something bad happened' color: 'danger' mrkdwn_in: ['text'] channel: msg.envelope.room robot.emit 'slack.attachment', data
hubot-slack v4robot.respond /attachments test$/i, (msg) -> data = attachments: [ text: '*error*: something bad happened' color: 'danger' mrkdwn_in: ['text'] ] msg.send data
9 . 2
10 . 1
名前とIDの相互変換
(SlackSDK更新により)名前またはIDから ユーザオブジェクトやチャンネルオブジェクトを
取得するメソッドの互換性が無くなりました
robot.adapter.client.getUserByName('knjcode') # hubot-slack v3 ↓ robot.adapter.client.rtm.dataStore.getUserByName('knjcode') # hubot-slack v4
これまで �������������������� 配下にあったメソッドが���������������������������������� 配下に移動
以降に細かく解説します
10 . 2
getUserByID ⇒ getUserByIdメソッド名およびメソッド位置の変更
hubot-slack v3robot.adapter.client.getUserByID('U0MU03G5V').name # => knjcode
hubot-slack v4robot.adapter.client.rtm.dataStore.getUserById('U0MU03G5V').name # => knjcode
※ メソッド名末尾が ID ⇒ Id に変わってる点も注意
10 . 3
getUserByNameメソッド位置の変更
hubot-slack v3robot.adapter.client.getUserByName('knjcode').id# => U0MU03G5V
hubot-slack v4robot.adapter.client.rtm.dataStore.getUserByName('knjcode').id # => U0MU03G5V
10 . 4
getChannelGroupOrDMByID ⇒getChannelGroupOrDMByIdメソッド名およびメソッド位置の変更
hubot-slack v3robot.adapter.client.getChannelGroupOrDMByID('C03NM270D').name # => general
hubot-slack v4robot.adapter.client.rtm.dataStore.getChannelGroupOrDMById('C03NM270D'# => general
※ メソッド名末尾が ID ⇒ Id に変わってる点も注意
10 . 5
getChannelGroupOrDMByName⇒ getChannelOrGroupByNameメソッド名およびメソッド位置の変更
hubot-slack v3robot.adapter.client.getChannelGroupOrDMByName('general').id # => C03NM270D
hubot-slack v4robot.adapter.client.rtm.dataStore.getChannelOrGroupByName('general').id# => C03NM270D
※ メソッド名からDMの文字が消えている点も注意
10 . 6
getDMByNamehubot-slack v3の ������������������������� メソ
ッドから �� が分離
hubot-slack v3robot.adapter.client.getChannelGroupOrDMByName('knjcode').id # => U0MU03G5V
hubot-slack v4robot.adapter.client.rtm.dataStore.getDMByName('knjcode').id # => U0MU03G5V
10 . 7
getDMById実装が壊れてる
内部で ����������� が呼ばれている
(getUserByIdで事足りるのであまり困らない?)
11
ユーザプロフィール等の参照
v4では ���������������������� が参照できなくなった(例えば、ユーザアイコンを取得する場合等に利用)
hubot-slack v3userId = msg.envelope.user.id robot.brain.data.users[userId].slack.profile.image_48 # => "https://a.slack-edge.com/2fac/plugins/slackbot/assets/service_48.png"
hubot-slack v4uesrId = msg.envelope.user.id robot.adapter.client.rtm.dataStore.users[userId].profile.image_48 # => "https://a.slack-edge.com/2fac/plugins/slackbot/assets/service_48.png"
※ hubot-slack v4.3.0 から hubot-slack v3互換となった(���������������������� を参照できるようになった)
12
Slack Web APIの呼び出し方法について
v3では �������� が利用できた (そもそもhubot-slack内部メソッドなのであまり使うべきではないですが…)
hubot-slack v3robot.adapter.client._apiCall 'chat.postMessage', channel: msg.envelope.room text : 'hello'
hubot-slack v4robot.adapter.client.web.chat.postMessage(msg.envelope.room, 'hello')
v4からは ������������������������ 配下にある Slack SDKのWebAPI用メソッドを利用できる (もちろん、自前でAPI呼び出ししてもよい)
13 . 1
raw_messageの扱いslackに特化したhubot-scriptを書いていると、
以下のようにslackから通知される ����������� を 処理したくなってくる
presence_changeイベントを検知してログに出力する例robot.adapter.client.on 'raw_message', (msg) -> if msg.type is 'presence_change' console.log msg
13 . 2
raw_messageがobjectからstringに変更
取得できるraw_messageがオブジェクトから JSONの文字列になった
これまで通りにオブジェクトとして扱うには
一度JSONとしてparseしてやる必要があるmessage = JSON.parse msg
13 . 3
メソッド位置の変更
メソッド位置も変更されました
hubot-slack v3robot.adapter.client.on 'raw_message', (msg) -> if msg.type is 'presence_change' console.log msg
hubot-slack v4robot.adapter.client.rtm.on 'raw_message', (msg) -> message = JSON.parse msg if message.type is 'presence_change' console.log message
14 . 1
ファイルアップロード
v4からはファイルアップロードに対応しました (Slack SDKを内部的に利用しているだけですが)
lenna.pngをアップロードする例robot.hear /lenna/i, (msg) -> data = file: fs.createReadStream('lenna.png') channels: msg.envelope.room robot.adapter.client.web.files.upload("lenna.png", data)
14 . 2
14 . 2
15
リアクション
v4からはreactions用の ����������� が追加されました(v4.1.0から)
ユーザがつけたリアクションをオウム返しする例
robot.react (msg) -> robot.logger.debug msg.message.type, msg.message.reaction if msg.message.type == "added" data = channel: msg.message.item.channel timestamp: msg.message.item.ts robot.adapter.client.web.reactions.add(msg.message.reaction, data)
16
参考
Slack Developer Kit for Hubot - Upgrading from a Previous VersionSlack Developer Kit for Hubot - Basic Usageslack-api/hubot-slackslack-api/node-slack-sdk
17
ありがとうございました