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

What's hot (20)

Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
 
Kubernetesのワーカーノードを自動修復するために必要だったこと
Kubernetesのワーカーノードを自動修復するために必要だったことKubernetesのワーカーノードを自動修復するために必要だったこと
Kubernetesのワーカーノードを自動修復するために必要だったこと
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Rootlessコンテナ
RootlessコンテナRootlessコンテナ
Rootlessコンテナ
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
 
Hadoop入門
Hadoop入門Hadoop入門
Hadoop入門
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
Dockerのネットワークについて
DockerのネットワークについてDockerのネットワークについて
Dockerのネットワークについて
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
Argo CD Deep Dive
Argo CD Deep DiveArgo CD Deep Dive
Argo CD Deep Dive
 
Sql server これだけはやっておこう 最終版
Sql server これだけはやっておこう 最終版Sql server これだけはやっておこう 最終版
Sql server これだけはやっておこう 最終版
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)
オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)
オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
 
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/FallZabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
 

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