Edited at
SmalltalkDay 11

Pharo SmalltalkでSlackにメッセージを投稿したり、Botを作ったりする

More than 1 year has passed since last update.

PharoからSlackにメッセージを投稿したり、問い合わせに応えるBotを作ったりする例です。

そこそこ簡単にやれます。


Pharoの準備

この辺から環境に応じてPharoを入手、インストールしてください。

http://pharo.org/download


SlackのTest tokenの入手

Slackにユーザ登録して、適当なteamを作るかjoinした後、

https://slack.com/

そのteam内で利用可能なTokenを以下から入手します。

https://api.slack.com/docs/oauth-test-tokens


Phaslack

Phaslackは拙作のSlack APIクライアントライブラリです。

http://smalltalkhub.com/#!/~kaminami/Phaslack

自分にとっての必要最低限しか実装していませんが、メッセージ送受信、添付ファイル投稿あたりは出来るようになっています。

PSlackClientクラスのclass側にサンプルが並んでいます。


PharoへのPhaslackの導入

以下のスクリプトをPharoのWorkspace等でdoItして必要なライブラリを導入します。

"Phaslackの導入"

Gofer new
url: 'http://mc.stfx.eu/Neo';
package: 'Neo-JSON-Core';
load.

Gofer new
url: 'http://mc.stfx.eu/ZincHTTPComponents';
package: 'Zinc-WebSocket-Core';
load.

Gofer new smalltalkhubUser: 'kaminami'
project: 'Phaslack';
package: 'ConfigurationOfPhaslack';
load.
(Smalltalk at: #ConfigurationOfPhaslack) project load: '1.0'.


メッセージ投稿

とりあえずメッセージ投稿の例です。

tokenは上記で取得したものを設定、チャンネルはあらかじめSlackクライアントなどで作っておいてください。

"メッセージを投稿"

| userName token client |
userName := 'greeter'. "任意のユーザ名で投稿できる。権限はtokenを取得したユーザとなる"
token := 'YOUR_TOKEN'.
client := PSlackClient user: userName token: token.

client
chatPostMessage: 'Hello'
channel: 'test'


Pharoのスクリーンショットを返すBot

メッセージ投稿を待ち受け、投稿があったらアクションを起こす、チャットBotの例です。

以下は、「@world image」が投稿されたら、Pharoのスクリーンショットを投稿する、というBotスクリプトです。

サーバサイドで動作するPharoイメージに仕掛けておくと便利、かもしれません。

"「@world image」が投稿されたら、Pharoのスクリーンショットを同チャンネルに投稿する"

| token client res url block handler receiver |
token := 'YOUR_TOKEN'.
client := PSlackClient token: token.

res := client rtmStart.
url := res values at: 'url'.
block := [ :slackClient :receivedValues |
| msg channel |
channel := receivedValues at: 'channel'.
msg := receivedValues at: 'text'.

(msg beginsWith: '@world image') ifTrue: [
| ws |
ws := WriteStream on: ByteArray new.
PNGReadWriter putForm: World imageForm onStream: ws.

slackClient
filesUploadStream: ws contents readStream
fileNamed: 'World_imageForm.png'
channels: {channel}.
].
].
handler := PSlackBlockEvaluator client: client block: block.

receiver := PSlackRtmReceiver url: url handler: handler.
receiver start.
receiver inspect. "停めるには、receiverオブジェクトにstopメッセージを送る"


おわりに

Pharo SmalltalkからのSlack API利用例でした。