28
1 hubot-slack v4 3 hubot×chatops 2017 2 23 @knjcode

hubot-slack v4移行時のハマりどころ #hubot_chatops

  • Upload
    knjcode

  • View
    374

  • Download
    0

Embed Size (px)

Citation preview

Page 1: hubot-slack v4移行時のハマりどころ #hubot_chatops

1

hubot-slack v4移行時のハマりどころ

第3回 hubot×chatops勉強会

2017年2月23日@knjcode

Page 2: hubot-slack v4移行時のハマりどころ #hubot_chatops

2

hubot-slack v4 リリース随分前(2016年7月)ですが、hubotのslack用アダプターhubot-slack がv4系にメジャーアップデートしました。

Page 3: hubot-slack v4移行時のハマりどころ #hubot_chatops

3

hubot-slack v4 のメリットnode-slack-sdkのバージョンアップ (v3.4.0以降を利用)これにより互換性が失われた部分もあり

Slackサーバとのwebsocket接続の安定性が向上 (体感ですが)v3のほうが接続が切れる頻度が高いv3では稀に再接続出来ずにスタックすることがあった

ファイルアップロードのサポート

リアクションのサポート (v4.1.0から)

Page 4: hubot-slack v4移行時のハマりどころ #hubot_chatops

4

hubot-slack v4使ってますか?

v4からは内部で利用するSlack SDKが更新されており 既存のhubot-scriptの動作に影響がでる場合があります

この資料では、主にhubot-scriptの互換性に関して v4系への移行時のハマりどころをまとめて紹介します

Page 5: hubot-slack v4移行時のハマりどころ #hubot_chatops

5

目次

私のslackbot運用状況v3系とv4系におけるSlacke SDKのバージョンについてmsg.envelope.roomの値がchannel名からIDに変更attachments利用方法の変更名前とIDの相互変換ユーザデータの参照

Slack Web APIの呼び出し方法についてraw_messageの扱いファイルアップロード

リアクション

Page 6: hubot-slack v4移行時のハマりどころ #hubot_chatops

5

6 . 1

私のslackbot運用状況

趣味や業務で多数botを運用しています

bot数: 6(共同運用含む)ホスト: Heroku, Bluemix, AWS, Scaleway, sakura VPS形態: dockerコンテナ 4, heroku 1, Bluemix 1

Page 7: hubot-slack v4移行時のハマりどころ #hubot_chatops

6 . 2

hubotはざっくり3ロケーションで運用通信が多そうなbotはSlackやRedisの近くに配置1つを残してhubot-slack v4に移行済み

Page 8: hubot-slack v4移行時のハマりどころ #hubot_chatops

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)

Page 9: hubot-slack v4移行時のハマりどころ #hubot_chatops

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は修正が必要となる

Page 10: hubot-slack v4移行時のハマりどころ #hubot_chatops

8

9 . 1

attachments利用方法の変更

robot.emit 'slack.attachment', <attachements data>

から

msg.send <attachments data>

に変更になった

Page 11: hubot-slack v4移行時のハマりどころ #hubot_chatops

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

Page 12: hubot-slack v4移行時のハマりどころ #hubot_chatops

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

これまで �������������������� 配下にあったメソッドが���������������������������������� 配下に移動

以降に細かく解説します

Page 13: hubot-slack v4移行時のハマりどころ #hubot_chatops

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 に変わってる点も注意

Page 14: hubot-slack v4移行時のハマりどころ #hubot_chatops

10 . 3

getUserByNameメソッド位置の変更

hubot-slack v3robot.adapter.client.getUserByName('knjcode').id# => U0MU03G5V

hubot-slack v4robot.adapter.client.rtm.dataStore.getUserByName('knjcode').id # => U0MU03G5V

Page 15: hubot-slack v4移行時のハマりどころ #hubot_chatops

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 に変わってる点も注意

Page 16: hubot-slack v4移行時のハマりどころ #hubot_chatops

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の文字が消えている点も注意

Page 17: hubot-slack v4移行時のハマりどころ #hubot_chatops

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

Page 18: hubot-slack v4移行時のハマりどころ #hubot_chatops

10 . 7

getDMById実装が壊れてる

内部で ����������� が呼ばれている

(getUserByIdで事足りるのであまり困らない?)

Page 19: hubot-slack v4移行時のハマりどころ #hubot_chatops

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互換となった(���������������������� を参照できるようになった)

Page 20: hubot-slack v4移行時のハマりどころ #hubot_chatops

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呼び出ししてもよい)

Page 21: hubot-slack v4移行時のハマりどころ #hubot_chatops

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

Page 22: hubot-slack v4移行時のハマりどころ #hubot_chatops

13 . 2

raw_messageがobjectからstringに変更

取得できるraw_messageがオブジェクトから JSONの文字列になった

これまで通りにオブジェクトとして扱うには

一度JSONとしてparseしてやる必要があるmessage = JSON.parse msg

Page 23: hubot-slack v4移行時のハマりどころ #hubot_chatops

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

Page 24: hubot-slack v4移行時のハマりどころ #hubot_chatops

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)

Page 25: hubot-slack v4移行時のハマりどころ #hubot_chatops

14 . 2

Page 26: hubot-slack v4移行時のハマりどころ #hubot_chatops

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)

Page 27: hubot-slack v4移行時のハマりどころ #hubot_chatops

16

参考

Slack Developer Kit for Hubot - Upgrading from a Previous VersionSlack Developer Kit for Hubot - Basic Usageslack-api/hubot-slackslack-api/node-slack-sdk

Page 28: hubot-slack v4移行時のハマりどころ #hubot_chatops

17

ありがとうございました