Help us understand the problem. What is going on with this article?

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

More than 3 years have 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利用例でした。

kaminami
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away