7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SmalltalkAdvent Calendar 2016

Day 11

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

Last updated at Posted at 2016-12-11

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

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?