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利用例でした。