Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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のほうが接...
4
hubot-slack v4使ってますか?
v4からは内部で利用するSlack SDKが更新されており
既存のhubot-scriptの動作に影響がでる場合があります
この資料では、主にhubot-scriptの互換性に関して
v4系への移...
目次
私のslackbot運用状況
v3系とv4系におけるSlacke SDKのバージョンについて
msg.envelope.roomの値がchannel名からIDに変更
attachments利用方法の変更
名前とIDの相互変換
ユーザデータ...
5
6 . 1
私のslackbot運用状況
趣味や業務で多数botを運用しています
bot数:6(共同運用含む)
ホスト:Heroku, Bluemix, AWS, Scaleway, sakura VPS
形態:dockerコンテナ4, h...
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系最...
msg.envelope.roomの値がchannel名からIDに変更
hubot-slack v3
robot.respond /room/i, (msg) ->
room = msg.envelope.room
# room => "gen...
8
9 . 1
attachments利用方法の変更
robot.emit 'slack.attachment', <attachements data>
から
msg.send <attachments data>
に変更になった
hubot-slack v3
robot.respond /attachments test$/i, (msg) ->
data =
content:
text: '*error*: something bad happened'
color:...
9 . 2
10 . 1
名前とIDの相互変換
(SlackSDK更新により)名前またはIDから
ユーザオブジェクトやチャンネルオブジェクトを
取得するメソッドの互換性が無くなりました
robot.adapter.client.getUserB...
10 . 2
getUserByID ⇒getUserById
メソッド名およびメソッド位置の変更
hubot-slack v3
robot.adapter.client.getUserByID('U0MU03G5V').name
# => k...
10 . 3
getUserByName
メソッド位置の変更
hubot-slack v3
robot.adapter.client.getUserByName('knjcode').id
# => U0MU03G5V
hubot-slack ...
10 . 4
getChannelGroupOrDMByID ⇒
getChannelGroupOrDMById
メソッド名およびメソッド位置の変更
hubot-slack v3
robot.adapter.client.getChannelG...
10 . 5
getChannelGroupOrDMByName
⇒getChannelOrGroupByName
メソッド名およびメソッド位置の変更
hubot-slack v3
robot.adapter.client.getChannel...
10 . 6
getDMByName
hubot-slack v3の メソ
ッドから が分離
hubot-slack v3
robot.adapter.client.getChannelGroupOrDMByName('knjcode').id...
10 . 7
getDMById
実装が壊れてる
内部で が呼ばれている
(getUserByIdで事足りるのであまり困らない?)
11
ユーザプロフィール等の参照
v4では が参照できなくなった
(例えば、ユーザアイコンを取得する場合等に利用)
hubot-slack v3
userId = msg.envelope.user.id
robot.brain.data.us...
12
Slack Web APIの呼び出し方法について
v3では が利用できた(そもそもhubot-slack内部
メソッドなのであまり使うべきではないですが…)
hubot-slack v3
robot.adapter.client._api...
13 . 1
raw_messageの扱い
slackに特化したhubot-scriptを書いていると、
以下のようにslackから通知される を
処理したくなってくる
presence_changeイベントを検知してログに出力する例
robo...
13 . 2
raw_messageがobjectからstringに変更
取得できるraw_messageがオブジェクトから
JSONの文字列になった
これまで通りにオブジェクトとして扱うには
一度JSONとしてparseしてやる必要がある
m...
13 . 3
メソッド位置の変更
メソッド位置も変更されました
hubot-slack v3
robot.adapter.client.on 'raw_message', (msg) ->
  if msg.type is 'presence_...
14 . 1
ファイルアップロード
v4からはファイルアップロードに対応しました
(Slack SDKを内部的に利用しているだけですが)
lenna.pngをアップロードする例
robot.hear /lenna/i, (msg) ->
dat...
14 . 2
15
リアクション
v4からはreactions用の が追加されました
(v4.1.0から)
ユーザがつけたリアクションをオウム返しする例
robot.react (msg) ->
robot.logger.debug msg.m...
16
参考
Slack Developer Kit for Hubot - Upgrading from a Previous Version
Slack Developer Kit for Hubot - Basic Usage
slack-...
17
ありがとうございました
hubot-slack v4移行時のハマりどころ #hubot_chatops
Upcoming SlideShare
Loading in …5
×

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

4,831 views

Published on

2017年2月23日に開催された 第3回 Hubot×ChatOps勉強会 の発表資料です。
hubot-slack v4移行時のhubot-scriptの互換性についてのハマりどころを解説します。

Published in: Software
  • Be the first to comment

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

  1. 1. 1 hubot-slack v4移行時の ハマりどころ 第3回hubot×chatops勉強会 2017年2月23日 @knjcode
  2. 2. 2 hubot-slack v4 リリース 随分前(2016年7月)ですが、hubotのslack用アダプター hubot-slack がv4系にメジャーアップデートしました。
  3. 3. 3 hubot-slack v4 のメリット node-slack-sdkのバージョンアップ(v3.4.0以降を利用) これにより互換性が失われた部分もあり Slackサーバとのwebsocket接続の安定性が向上(体感ですが) v3のほうが接続が切れる頻度が高い v3では稀に再接続出来ずにスタックすることがあった ファイルアップロードのサポート リアクションのサポート(v4.1.0から)
  4. 4. 4 hubot-slack v4使ってますか? v4からは内部で利用するSlack SDKが更新されており 既存のhubot-scriptの動作に影響がでる場合があります この資料では、主にhubot-scriptの互換性に関して v4系への移行時のハマりどころをまとめて紹介します
  5. 5. 目次 私のslackbot運用状況 v3系とv4系におけるSlacke SDKのバージョンについて msg.envelope.roomの値がchannel名からIDに変更 attachments利用方法の変更 名前とIDの相互変換 ユーザデータの参照 Slack Web APIの呼び出し方法について raw_messageの扱い ファイルアップロード リアクション
  6. 6. 5 6 . 1 私のslackbot運用状況 趣味や業務で多数botを運用しています bot数:6(共同運用含む) ホスト:Heroku, Bluemix, AWS, Scaleway, sakura VPS 形態:dockerコンテナ4, heroku 1, Bluemix 1
  7. 7. hubotはざっくり3ロケーションで運用 通信が多そうなbotはSlackやRedisの近くに配置 1つを残してhubot-slack v4に移行済み
  8. 8. 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)
  9. 9. msg.envelope.roomの値がchannel名からIDに変更 hubot-slack v3 robot.respond /room/i, (msg) -> room = msg.envelope.room # room => "general" hubot-slack v4 robot.respond /room/i, (msg) -> room = msg.envelope.room # room => "C03NM270D" をchannel名として扱う hubot-scriptは修正が必要となる
  10. 10. 8 9 . 1 attachments利用方法の変更 robot.emit 'slack.attachment', <attachements data> から msg.send <attachments data> に変更になった
  11. 11. hubot-slack v3 robot.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 v4 robot.respond /attachments test$/i, (msg) -> data = attachments: [ text: '*error*: something bad happened' color: 'danger' mrkdwn_in: ['text'] ] msg.send data
  12. 12. 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 これまで 配下にあったメソッドが 配下に移動 以降に細かく解説します
  13. 13. 10 . 2 getUserByID ⇒getUserById メソッド名およびメソッド位置の変更 hubot-slack v3 robot.adapter.client.getUserByID('U0MU03G5V').name # => knjcode hubot-slack v4 robot.adapter.client.rtm.dataStore.getUserById('U0MU03G5V').name # => knjcode ※ メソッド名末尾がID ⇒Id に変わってる点も注意
  14. 14. 10 . 3 getUserByName メソッド位置の変更 hubot-slack v3 robot.adapter.client.getUserByName('knjcode').id # => U0MU03G5V hubot-slack v4 robot.adapter.client.rtm.dataStore.getUserByName('knjcode').id # => U0MU03G5V
  15. 15. 10 . 4 getChannelGroupOrDMByID ⇒ getChannelGroupOrDMById メソッド名およびメソッド位置の変更 hubot-slack v3 robot.adapter.client.getChannelGroupOrDMByID('C03NM270D').name # => general hubot-slack v4 robot.adapter.client.rtm.dataStore.getChannelGroupOrDMById('C03NM270D' # => general ※ メソッド名末尾がID ⇒Id に変わってる点も注意
  16. 16. 10 . 5 getChannelGroupOrDMByName ⇒getChannelOrGroupByName メソッド名およびメソッド位置の変更 hubot-slack v3 robot.adapter.client.getChannelGroupOrDMByName('general').id # =>  C03NM270D hubot-slack v4 robot.adapter.client.rtm.dataStore.getChannelOrGroupByName('general').id # => C03NM270D ※ メソッド名からDMの文字が消えている点も注意
  17. 17. 10 . 6 getDMByName hubot-slack v3の メソ ッドから が分離 hubot-slack v3 robot.adapter.client.getChannelGroupOrDMByName('knjcode').id # => U0MU03G5V hubot-slack v4 robot.adapter.client.rtm.dataStore.getDMByName('knjcode').id # => U0MU03G5V
  18. 18. 10 . 7 getDMById 実装が壊れてる 内部で が呼ばれている (getUserByIdで事足りるのであまり困らない?)
  19. 19. 11 ユーザプロフィール等の参照 v4では が参照できなくなった (例えば、ユーザアイコンを取得する場合等に利用) hubot-slack v3 userId = 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 v4 uesrId = 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互換となった ( を参照できるようになった)
  20. 20. 12 Slack Web APIの呼び出し方法について v3では が利用できた(そもそもhubot-slack内部 メソッドなのであまり使うべきではないですが…) hubot-slack v3 robot.adapter.client._apiCall 'chat.postMessage', channel: msg.envelope.room text : 'hello' hubot-slack v4 robot.adapter.client.web.chat.postMessage(msg.envelope.room, 'hello') v4からは 配下にある Slack SDKのWebAPI用メソッドを利用できる (もちろん、自前でAPI呼び出ししてもよい)
  21. 21. 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
  22. 22. 13 . 2 raw_messageがobjectからstringに変更 取得できるraw_messageがオブジェクトから JSONの文字列になった これまで通りにオブジェクトとして扱うには 一度JSONとしてparseしてやる必要がある message = JSON.parse msg
  23. 23. 13 . 3 メソッド位置の変更 メソッド位置も変更されました hubot-slack v3 robot.adapter.client.on 'raw_message', (msg) ->   if msg.type is 'presence_change' console.log msg hubot-slack v4 robot.adapter.client.rtm.on 'raw_message', (msg) -> message = JSON.parse msg if message.type is 'presence_change' console.log message
  24. 24. 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)
  25. 25. 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)
  26. 26. 16 参考 Slack Developer Kit for Hubot - Upgrading from a Previous Version Slack Developer Kit for Hubot - Basic Usage slack-api/hubot-slack slack-api/node-slack-sdk
  27. 27. 17 ありがとうございました

×