SlideShare a Scribd company logo
1 of 28
Download to read offline
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系への移行時のハマりどころをまとめて紹介します
目次
私の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
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)
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は修正が必要となる
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: '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
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 v3
robot.adapter.client.getUserByID('U0MU03G5V').name
# => knjcode
hubot-slack v4
robot.adapter.client.rtm.dataStore.getUserById('U0MU03G5V').name
# => knjcode
※ メソッド名末尾がID ⇒Id に変わってる点も注意
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
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 に変わってる点も注意
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の文字が消えている点も注意
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
10 . 7
getDMById
実装が壊れてる
内部で が呼ばれている
(getUserByIdで事足りるのであまり困らない?)
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互換となった
( を参照できるようになった)
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呼び出ししてもよい)
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 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
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
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 Version
Slack Developer Kit for Hubot - Basic Usage
slack-api/hubot-slack
slack-api/node-slack-sdk
17
ありがとうございました

More Related Content

What's hot

「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
 
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
whywaita
 

What's hot (20)

.NET Core時代のCI/CD
.NET Core時代のCI/CD.NET Core時代のCI/CD
.NET Core時代のCI/CD
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
PCIDSSで学ぶNeuVectorの基礎(Kubernetes Novice Tokyo #21 発表資料)
PCIDSSで学ぶNeuVectorの基礎(Kubernetes Novice Tokyo #21 発表資料)PCIDSSで学ぶNeuVectorの基礎(Kubernetes Novice Tokyo #21 発表資料)
PCIDSSで学ぶNeuVectorの基礎(Kubernetes Novice Tokyo #21 発表資料)
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
 
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
210927 PMBOK第7版の概要
210927 PMBOK第7版の概要210927 PMBOK第7版の概要
210927 PMBOK第7版の概要
 
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
SlideShareをやめて SpeakerDeckに移行します
SlideShareをやめて SpeakerDeckに移行しますSlideShareをやめて SpeakerDeckに移行します
SlideShareをやめて SpeakerDeckに移行します
 
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計
 
Keycloakの最近のトピック
Keycloakの最近のトピックKeycloakの最近のトピック
Keycloakの最近のトピック
 

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

Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使うVagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
Masashi Shinbara
 
【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続
【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続 【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続
【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続
Brocade
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
Akihiro Kuwano
 
Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
i7a
 
Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発
Hironao Sekine
 

Similar to hubot-slack v4移行時のハマりどころ #hubot_chatops (20)

今日から使えるCouchbaseシステムアーキテクチャデザインパターン集
今日から使えるCouchbaseシステムアーキテクチャデザインパターン集今日から使えるCouchbaseシステムアーキテクチャデザインパターン集
今日から使えるCouchbaseシステムアーキテクチャデザインパターン集
 
Azure DevOps Online Vol.3 - Inside Azure Pipelines
Azure DevOps Online Vol.3 - Inside Azure PipelinesAzure DevOps Online Vol.3 - Inside Azure Pipelines
Azure DevOps Online Vol.3 - Inside Azure Pipelines
 
Mvc conf session_2_shibamura
Mvc conf session_2_shibamuraMvc conf session_2_shibamura
Mvc conf session_2_shibamura
 
hubotで快適BOT生活
hubotで快適BOT生活 hubotで快適BOT生活
hubotで快適BOT生活
 
Flyway使いたい
Flyway使いたいFlyway使いたい
Flyway使いたい
 
Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7
 
SPDY/3 の HTTP 重畳効果を測定する
SPDY/3 の HTTP 重畳効果を測定するSPDY/3 の HTTP 重畳効果を測定する
SPDY/3 の HTTP 重畳効果を測定する
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使うVagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
 
Rookの基礎・バージョンアップ
Rookの基礎・バージョンアップRookの基礎・バージョンアップ
Rookの基礎・バージョンアップ
 
Mercurial入門
Mercurial入門Mercurial入門
Mercurial入門
 
【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続
【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続 【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続
【Brocade OpenStack ソリューション】MPLS VPNデータセンター間接続
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
これからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみようこれからLDAPを始めるなら 「389-ds」を使ってみよう
これからLDAPを始めるなら 「389-ds」を使ってみよう
 
Zabbixをもっと使おう @OSC 2016 Tokyo/Fall
Zabbixをもっと使おう @OSC 2016 Tokyo/FallZabbixをもっと使おう @OSC 2016 Tokyo/Fall
Zabbixをもっと使おう @OSC 2016 Tokyo/Fall
 
Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
 
Couchbase meetup20140225[Release Note 2.5]
Couchbase meetup20140225[Release Note 2.5]Couchbase meetup20140225[Release Note 2.5]
Couchbase meetup20140225[Release Note 2.5]
 
Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発Sflt17 meteorではじめる最速ウェブアプリ開発
Sflt17 meteorではじめる最速ウェブアプリ開発
 
Vector
VectorVector
Vector
 
VYATTA USERS MEETING Spring 2014 - JAZUG
VYATTA USERS MEETING Spring 2014 - JAZUGVYATTA USERS MEETING Spring 2014 - JAZUG
VYATTA USERS MEETING Spring 2014 - JAZUG
 

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