BotにSlackのプライベートチャンネルリストを教えてもらう(Node.jsのBotkitとIBM Cloudを用いた対応)
課題
自分が属している団体のSlackで運営スタッフだけのプライベートチャンネルがいくつかあるが、プライベートチャンネルのため、どのような運営用チャンネルが存在しているかわからなくなるという問題がある。一度誤って抜けてしまうと、誰かに頼まないと戻れなくなるのだが、誰に頼んで良いのかもわからなくなることもある。
この問題を解決するためにBotを開発した。ただし、プライベートチャンネルのため、Botもそのプライベートチャンネルに所属していないとならない。
運用イメージ
- 運営用プライベートチャンネルはBotをメンバーとして登録する
- 運営スタッフはそのBotにメンションかDMかで話しかけることにより、Botが属しているプライベートチャンネルの全リストをその作成者名とともに取得できる
- 自分が入るべきプライベートチャンネルがあったならば、その作成者にコンタクトし、招待してもらう。ここにはBotは介在しない
Botの開発
BotはNode.jsで開発し、IBM Cloudで運用することにした。
Botkit
Node.jsで作られたBotkitを利用した。Slackとの連携も極めて簡単。
使ったものは、
ソースコードは以下。
const Botkit = require('botkit'); const async = require('async'); if (!process.env.token) { console.log('Error: Missing API Token'); process.exit(1); } const controller = Botkit.slackbot({ debug: false, retry: Infinity // 常駐させるため }); controller.spawn({ token: process.env.token }).startRTM((err, bot, payload) => { if (err) { throw new Error(err); } }); // pubchlistと聞かれたら controller.hears('pubchlist',['direct_message','direct_mention','mention'],(bot,message) => { bot.api.channels.list({}, (err, res) => { async.each(res.channels, (channel, callback) => { if(!channel.is_archived){ bot.api.users.info({user:channel.creator}, (err,res) => { bot.reply(message, channel.name + ' created by ' + res['user']['name']); }) } }) }) }); // prchlistと聞かれたら controller.hears('prchlist',['direct_message','direct_mention','mention'], (bot,message) => { bot.api.groups.list({}, (err, res) => { async.each(res.groups, (groups, callback) => { if(!groups.is_archived){ bot.api.users.info({user:groups.creator}, (err,res) => { bot.reply(message, groups.name + ' created by ' + res['user']['name']); }) } }) }) }); // それ以外を聞かれたら controller.hears(['(.*)'], ['direct_message','direct_mention','mention'], (bot,message) => { bot.reply(message, 'Usage: type prchlist to get private channels list OR publist to get public channels'); });
Botに話しかけられるコマンドは2つだけ。
- pubchlist: パブリックチャンネルの一覧をその作成者とともに表示
- prchlist: Botが所属しているプライベートチャンネルの一覧をその作成者とともに表示
【追記】Admin権限を持つ人だけがプライベートチャンネルリストを見れるようにする
プライベートチャンネルリストが見れる人をAdmin権限を持つ人だけに絞るには、prchlist
をhears
している部分を以下のように変更する。
// prchlistと聞かれたら controller.hears('test',['direct_message','direct_mention','mention'], (bot,message) => { var currentUser; bot.api.users.info({user:message.user},function(err,response) { if (err) { throw new Error(err); } currentUser = response['user']; if (!currentUser['is_admin']) { bot.reply(message, 'Only Admin can see the list of private channels'); } bot.api.groups.list({}, (err, res) => { async.each(res.groups, (groups, callback) => { if(!groups.is_archived){ bot.api.users.info({user:groups.creator}, (err,res) => { bot.reply(message, groups.name + ' created by ' + res['user']['name']); }) } }) }) }) });
Slack APIのusers.info
でBotkitから代えるmessage.user
情報を取得し、Admin権限があるかどうかを確認している。
Slack側の準備
プログラムの中でSlackのBot用のAPI Tokenを利用している。これは環境変数で引き渡すことになる。
Sign in | Slack にアクセスし、API Tokenを発行する。
ローカル環境での動作
$ token=<API Token> node app.js
これでSlack側でBotにDMするか、Inviteしたチャンネルでメンションし、話しかけてテストできる。
Botの運用
BotはNode.jsが動かせる環境ならなんでも良かったのだが、IBM Cloudライトアカウントの無料枠の範囲で十分そうだったので、それを使った。
$ cf api https://api.ng.bluemix.net/ $ cf login $ cf push itdartbot --no-route -u none -m 256M $ cf cf set-env itdartbot token <api token> $ cf restage itdartbot
cf push
での--no-route
と-u none
はワーカーとして動作させ、Health Check不要のため。また、-m 256M
はIBM Cloudライトアカウントではメモリが256MBに制限されているため。
参考にしたもの
- ココからスタートしよう、Botkitの基礎!+応用への手引き - Qiita
- はじめてnodejsを使った。はじめてチャットリレーbotを作った話。 - Qiita
- Slackでメンバーが参加しているチャンネルをBotkit(Slack API)で調べる - Qiita
- How to know user's full name who pinged the bot? · Issue #411 · howdyai/botkit · GitHub
- channels.list method | Slack
- groups.list method | Slack
- users.info method | Slack
推薦図書(メディアや書籍で紹介したもの一覧)
お勧め図書は?という質問を受けることがある。
ビジネス書で良い本もあるし、文学書で好きなものもあるが、ここではIT系のメディアで今まで聞かれた際に答えたものを整理しておこう。
まえがきとして書いておくと、正直、推薦図書と言われても回答するのは結構難しい。推薦図書とは、1) 自分が影響を受けた本なのか、2) 今の人に参考にして欲しい本なのかで、まず悩むし、1) の自分が影響を受けた本だとしても、どの時期に影響を受けたのか、さらには 2) のその本を今の人に参考にして欲しいのかでも悩む。参考にして欲しいとしても、そのターゲットは誰かでも薦める本は異なる。
というような悩みを抱えつつ、今までパブリックなメディアや書籍などでお勧めした書籍は以下のものだ。
まず、日経BP ITPro Watcherブログ - Avoid Note*1から
少し脱線するが、このAvoid Noteというブログは結構工夫をして書いていたものだった。個別の記事は検索すればひっかかるのだが、一覧から辿れなくなってしまっているのはちょっと悲しい。 今に記事本体も消されてしまいそうな予感がするので、後でアーカイブしておこう。
2012年にデブサミの記念書籍にも寄稿して書籍を推薦した。
その原稿がこれだ。
そして、今年にまた書籍を紹介して欲しいと言われて寄稿したのが以下の記事だ。自分では違う書籍を紹介しようと思っていたのだったが、日経BP ITPro Watcherで推薦したものを忘れてしまい、こちらでもヘネパタ本を紹介してしまっていた。
今のヘネパタ本はこれ。内容が結構更新されているみたいなので、久しぶりに読んでみようかと思う。
ヘネシー&パターソン コンピュータアーキテクチャ 定量的アプローチ 第5版
- 作者: ジョン・L・ヘネシー,デイビッド・A・パターソン
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/19
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
これ以外にも影響を受けた本はあるので、おいおい紹介していくかもしれない。
以上、Facebookにふんわりと書いておいたのだが、Facebookだと流れていってしまうので、自分の記録ようにこちらに書き直した。
Facebookの投稿はこれ → 及川 卓也 - 私も推薦図書を挙げさせて頂いています。一人だけ、やたら長文になってしまっていて、これだから年寄りは昔話... | Facebook
*1:2008年ごろに連載を持っていた
加齢による記憶力低下に対する考え方
今年もCROSSで先達に聞くこれからのエンジニア像というセッションに参加した。例年にも増して、言いたい放題の本当に勝手放題してしまったが、今年は放言に加えて、年金だとか終活だとか、参加者を無視した内容になってしまったことは反省している*1。
セッションの中で出た30年前に戻ったら何をしたいかという質問に、私以外の登壇者2名*2は数学とお答えになられていて、「今勉強しても、昔と違って記憶力が悪くなっている。(だから昔にもっと勉強しておけば良かった)」と発言されていた。
セッション内でも言ったのだが、おそらくこれは正しくない。
今も昔も覚えるのは大変なのだ。年を取ったことで記憶できなくなったのではなく、昔も覚えるのには苦労したのだ。
私がそのように指摘したら、「昔から能力が低かったってことですね」と笑われていたが、それはちょっと卑屈すぎる冗談として、昔が良かったと考えることでいろんなことを言い訳にしてしまいがちになる。
今が大変なのは、本当に大変なのであって、昔が良かったからではない。そう考えるだけで、物事への捉え方は変わる。
新しい技術を覚えるのが大変だと感じても、それはその技術の習得が本当に難しいからだ。そう考えたい。
数学の話に戻ろう。
数学の場合は、新しい事柄を学ぶのとは異なる。一度覚えた(はず)のことを再学習するということだ。そのため、本当は、昔覚えていたときの体験と、今の再学習での体験を比較することが可能だ。その上で、「昔のほうが記憶力は良かった」かどうかを判断することができる。
だが、それはおそらく無駄だ。なぜなら、「昔、記憶*3していたかどうか」や「どれだけスムーズに記憶していたか」をあなたはもう覚えていないはずだから ;)
すべての人が寄り添いあえる社会
「5.1chって言ってね、6個のスピーカーを配置することで、サラウンドが実現できるんだよ」
「サラウンドって?」
意外に物を知らない彼女にホームシアターを説明しているときだった。
「普通のステレオじゃなくて、前後などからも音が」とここまで話しかけて、彼は口をつぐんだ。
そうだ、彼女はモノラルの世界に生きているんだった。
1年ほど前に彼女は突発性難聴*1を発症し、右耳の聴力を失っていた。
正確には完全に聞こえないわけではない。ただ、一般人の声の周波数帯域と言われている500Hz以上の周波数の音声はかなりの音量でないと聴くことが出来ない。そのため、右から声をかけられても気づかない。
彼女が片耳の聴力を失ってから、彼は彼女との位置を気にするようになった。できるだけ彼女の左側にいるようになった。
彼女抜きで、友人と酒を飲んでいるときなどでも、彼は気になってしまうときがある。ビアホールや若者が多い居酒屋などで飲んでいるときだ。これだけ騒がしいと、たとえ左からであっても、彼女は会話が聞き取れないだろう。そう思い始めると、酒も進まなくなる。
技術ができること
彼女のような人に技術は何ができるだろう。
普通の補聴器はたいがいの場合、無力だ。聴力を失った耳に役立つ補聴器は無い。
聴こえなくなった耳側に届いた音を、正常な聴力を持つもう片方の耳に飛ばすクロス補聴器というものがある。これなどは突発性難聴で聴力を失った人に使われているようだが、先ほどの例のような、うるさい場所での会話などではあまり使えないため、これも万能ではない。
未踏プロジェクトでOntenna(オンテナ)が紹介されたときは、これだ!と思った。ヘアピンのように髪に着けることで、髪で音を感じるというデバイスだ。今は富士通で開発が進められているようだ*2が、是非とも早期の製品化を期待したい。
クロス補聴器のような聴力補助器もOntennaのような音を感じるデバイスも、障がいを持った側が努力をするものだ。このようなアプローチが王道だとは思うが、他に方法は無いだろうか。
歩み寄る技術
ユニバーサル・サウンドデザインという会社がある。ここから出されているcomuoon(コミューン)は聴力の障がいを持つ人に声を届けるためのコミュニケーションデバイスだ。いわゆるマイクとスピーカーなのだが、聴力に障がいを持つ人に話しかける側が聴こえの改善に歩み寄るためのデバイスだ。
人はそれぞれいろいろな特徴を持つ。この特徴は、性格であったり、癖であったりするのだが、身体の特徴としての「でこぼこ」の「ぼこ」になったところが障がいとして社会生活を不自由にさせるものとなる。多くの障がいは特徴などと言うほど甘いものではないのは事実だ。だが、障がいというのは、一部の人だけが抱える特別な事情ではないということだ。年齢とともに誰もがなんらかの障がいを持つようになるが、それだけではない。
彼女だってそうだ。
朝起きたら、なんか右耳が聴こえにくかっただけだった。水でも詰まったかと思い、スマホで「耳 水抜き」とかで検索していただけだったのだが、めまいがひどくなり、病院へ。その日から生活が一変した。誰にいつ起きることかわからない。突発性難聴にかかったら、3分の1の可能性で聴力は快復しない。
すべての人がすべての人に歩み寄れる、寄り添えるような社会こそが必要とされているのではないだろうか。
&HANDとスマート・マタニティマーク
先日、優勝賞金が1,000万円ということでも話題になったLINE BOT AWARDSの審査員を務めた。すべての作品は素晴らしく、どのチームがグランプリに相応しいか悩むほどだった。24組もあったので、正直最後のほうはかなり疲れてしまっていた。しかし、最後の24組目となる&HANDのプレゼンを見たときに、疲れは吹っ飛び、このチームにグランプリをあげたいと、審査員としての自分の意思は固まった。
&HANDは、手助けを必要とする人が持ち歩くLINEビーコンを発するデバイスとLINEボットから構成される。手助けを必要とする人が、支援が必要となったときに、そのデバイスをオンにすると、ビーコンが届く範囲にいるサポーターのLINEにボット経由で通知が届き、サポーターからの支援を受けることができる。
プレゼンテーションで例として話されていたのが、聴覚障がい者が電車の遅延に遭遇したときの例だ。車内のアナウンスが聞き取れなかったときなど、デバイスをオンにすることで、周りのサポーターにアナウンス内容を確認することなどができる。
私がグランプリに相応しいと思ったのは、一般的には特定の場所に固定設置されることが多いビーコンを移動体である人に持たせるという発想がユニークであったことと、なによりも私が考える障がい者に人が寄り添うという考えと同じだったことに感動したからだった。
後日知ったのだが、このチームはAndroid Experiments OBJECTでグランプリを取ったスマート・マタニティマークを開発したのと同じチームだ。
こちらは障がい者ではなく、妊婦向け。アイデアは同じだ。妊婦がデバイスを持ち歩くことで、近くにいる人は支援を必要とするかもしれない妊婦が近くにいることを知ることができる。LINEビーコンを使うかどうかの違いはあるが、こちらも寄り添う気持ちを大事にしたものだ。
まさに、すべての人にはいろいろな「でこぼこ」という特徴があり、たまたま「ぼこ」になった人が周りに寄り添ってもらうことができればという考えだ。
つい先日も同じような体験をした。私は吊革に捕まっていたのだが、前に座っていた女性がすぐ近くに席を探している高齢者がいることに気づかなかったのだ。少し遠いところから、席を譲った人がいて、初めて彼女は近くに支援を求める人がいることに気づいたのだ。
日本では、車内で座っている人の大半は寝ているか、スマホを覗き込んでいる。どちらも、周りは見えていない。悪意無く、支援を必要とする人を無視してしまうことになる。
&HANDやスマート・マタニティマークは、悪意無い人を善意の人に変える、そんなきっかけを作るものだ。
すべての人が、「でこぼこ」の「ぼこ」を支え合え、寄り添い合うようになれば、社会はより優しく、そして強くなる。
技術で何ができるか考えていたが、1つの答えがここにあるように思う。
今後、実際に使われるようになるまで、まだまだ課題は多いと思うが、応援していきたい。
*1:突発性難聴の原因は不明であり、治療しても完治するのは約3分の1程度と言われる。残りの3分の1は後遺症が残り、さらにその他の3分の1はまったく快復しない。発症後48時間(遅くても1週間)以内にステロイド投与を行うことが唯一の確立された治療法で、それで効果がなかった場合には高酸素療法などの治療を試すことになる。
*2:「ろう者に音を届けたい」(前編) 髪の毛で音を感じる全く新しいデバイス「Ontenna」 : FUJITSU JOURNAL(富士通ジャーナル)
HTML5 Conference 2016
昨日は、HTML5 Conferenceに参加した。初回から連続して基調講演を担当させて頂いているのだが、昨年にGoogleを辞めてからはWebばかりを追っているわけではないので、今回はどのような話をするのか悩んだ。
事前に、html5j代表の吉川さんや矢倉さん、同僚のよーいちろーさんと打ち合わせをして骨子を固めたのだが、すぐに準備に取り掛からなかったので、いざスライドを作り始めようと思ったら、決めたことを忘れてしまっている始末。吉川さんにハングアウトで教えてもらいながら準備をした。本当に酷い orz
講演は思いの外好評のようだった。だが、Twitterでも指摘されたのだが、まるでGoogleの中の人のような話になってしまったことは反省してる。もう少し視野を広く持つようにしたい。ただ、Webというのは1社がコントロールできるものではなく、Webというオープンなコミュニティに参加するすべてのプレイヤーが作り上げていくもの。Google在籍時からそう思っていたし、今もその想いは変わっていない。基調講演を一緒に務めたW3C/Keioの中村修先生が、Webは"Distributed Operating System Created by Web Community"だとおっしゃっているのと同じ。
以前、Google Developer Dayという開発者向けのカンファレンスがあった。そこでも毎回基調講演をさせていただくなど、運営のメンバーの1人として参加していたのだが、このような良い意味での「お祭り」は楽しい。昨日は私も楽しませて貰った。久しぶりに会う方々もたくさんいた。スタッフの方々、お疲れ様。
冒頭で「Qiitaをご存知ですか?」と聞いた時に多くの(ほとんどすべて?)の方の手が挙がったのは嬉しかった。オープンなWeb技術をさらに発展させるために少しでも貢献し続けられるように頑張りたい。