Tag Archives: slack

[メモ] SlackとMattermostそれぞれのincomingWebhookへのポスト方法の違い

Pocket

MattermostはSlackのクローンであるが、incomingWebhookへのポストだけは、どうも違いがあるようだ。
以下にSlack/Mattermostそれぞれでの実例を示す。
まずmattermost

Slack

Slack/MattermostのbotをPythonのFlaskで作ろう

Pocket

Slack/Mattermost(以降、まとめてSlack)のbotといえばHubotが有名だ。
Hubotはcoffeescriptで書かれているのだが、botのためだけに新しい言語を覚えるのも面倒。
加えてHubotを動作させるにはnpmが必要。
ちょっとそこまでは…。
Pythonなら普段使いで最初から環境は作ってあるし、楽だし。
そう思っていろいろと調べてみた。

Slackのbotに必要なことは?

Slackのbotに必要なのは、端的に以下の二つ。
1. Slackからのデータ送信を受ける。
2. Slackへ何かをする。

1.は、HTTP POSTでやってくるので、POSTを受けることさえできればよい。
2.は、例えばSlack上で何かの発言をすることだが、こちらはcurl(Pythonならrequests)でも使えば簡単にできる。

PythonでHTTP POSTを受けるには?

Flaskである。
Flaskとはごくごく軽量なwebフレームワークである。
驚くくらい簡単にwebサーバを作ることができる。
もちろんPOSTを受けるのもすぐにできる。
以下、説明。

Flaskのインストール

pipでもなんでも、好きなものを使ってインストールせい。

Flaskのテスト

以下のようなスクリプトを書く。
適当な名前で保存する。
flask.pyとかはやめようね。

上記のapp.route(‘/’)とは、ルーティング。
ルートディレクトリ(’/’)へのアクセスがあったら、次のdef welcome()が(デコレートによって)呼ばれる、ということである。

上記の場合、welcomeと表示するhtmlが返る。

app.debug = Trueについては後述。
app.run(host=’0.0.0.0)のhost=…の記述により、サーバを外部に公開することになる。

テストスクリプトの実行

localhostのポート5000でサーバが立ち上がったと分かる。
ブラウザでアクセスして「welcome」と表示されればよい。

ところで、app.debut = Trueだが、スクリプトを書き換えると、自動的に再読み込みをしてくれる。
実際のログは以下。

激烈に便利な機能なので、開発中は有効にしておくこと。

SlackからのPOSTを受ける。

先ほどのスクリプト冒頭のimportを以下のように変更。

さらに以下を追加。

上記のようにしておいて、Slack側のOutgoing Webhookで、呼び出すURLに「http://<あなたのサーバのアドレス>:5000/matter」を指定する。

Slack側からwebhookを呼び出してみると、POSTされた内容がログに表示されるはず。
なお、def post()が何も返さないのでエラーは出るが気にしない。

以下が例。

つまりPOSTの内容はディクショナリになっている。

Slackへ応答を返そう

Slackへ応答を返す場合には、POSTでもらった中にあるtokenが必要である。
応答文、tokenのディクショナリを作っておいて、それをjsonに変換し、返してやればよい。
Mattermostの場合、tokenのキーは’MATTERMOST_TOKEN’

先ほどのスクリプトを最終的に以下のようにする。
(わざわざjsonをimportしているが、Flaskにもそういう機能がある気がしてならない)
これでSlackから通知を受けると、「You said <トリガーワード>」という応答がSlackへ帰る。

【補遺】slackのoutgoing webhooks

slackでのwebhooks設定方法を示す。
webでいうと、左下のAppsからBrowse Appsを選び、outgoins WebHooksを探す
Add Configurationで設定へ。

webhooksを投げる条件を設定する。以下の3つ。

  1. 指定のチャンネルで発言したら
  2. 特定のトリガーワードを発言したら
  3. 特定のチャンネルで特定のトリガーワードを発言したら

1.はChannelで、2.はTrigger Word(s)で指定する。
3の場合には1.2.の両方を指定する。

上記条件に合致したらwebhooksを投げるURLを「URL(s)」で指定。
そのときのTokenは記載の通り。

webhooksで飛んでくるデータは以下の通り。json「ではない」ことに注意。

token=qFosSxxxxxxxxERh1Jfdy5
team_id=T0009
team_domain=example
channel_id=C0000000000
channel_name=test
timestamp=1355517523.000005
user_id=U0000000000
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:

 

[Python] requestsとlxmlで京急の運行情報を抽出しよう

Pocket

botに京急の運行情報を調べさせて、Slackで発言させたい。
使用言語はPython。
さあどうしようかと思ったら、さいきんは、どんなものでもライブラリが揃っていて、あっという間になんでも出来てしまうのな。

ページの取得はrequests、解析はlxmlを使う。

Webページの事前解析

ページのソースから、狙いの箇所を特定するようなキーワードを見つける。
あるいは、たとえばChromeなら、デベロッパーツールで探してもよい。
京急のページであれば、以下のように。

keikyuanalyze
手がかりは”div.unko-panel”。
これをもとにコードを書く。

抽出コード

stackoverflowを調べればサンプルコードなんかいくらでもあるよねー。

requestsでwebページ取得。
lxmlで読み込んで、class “unko-panel”のdivタグを見つければよい。

[参考]slackへの投稿

ここはサラッと。
詳細はslackのサイトを見る。
前章の関数の戻り値を引数に取る関数。

[slack][hubot][jail][メモ] FreeBSD Jailでhubotを飼う

Pocket

slackにhubotを住まわせる記事は山のようにあるが、それを「hubotを自前サーバ」「それもFreeBSDに」という条件にすると記事数が激減する。

そんななか、四苦八苦してなんとか達成したのでここに採録。
なお、そっけなく不親切に見えるのは、ここまでたどり着くのに疲労困憊したから。
ではどうぞ。

jailの作成

フッツーに。
以下ではqjailを使っているがezjailでもなんでも、好きなのを使いたまえ。

 

npmのインストール

まずjailをスタートさせて中に入ろうか。
そしてnpmのインストール。

node, npmのバージョンを確認しておく。
問題なくインストールされているかの確認でもある。

 

generatorのインストール

 

hubot用ユーザの作成

jailの中でadduserし、お好きなユーザを作る。
以下では「bot」というユーザ。

 

hubot用ユーザでhubotレポジトリ作成

botホストの作業はいったんはここまで。
以降、slack側で。

 

slackにhubotのインストール

slackのteamメニューからApp&Integrations > Hubotをインストール
表示されるAPI Tokenを記録する。
hubotがslackへアクセスするためのトークン。

 

botホストで起動スクリプトの作成

再びbotホスト
/usr/local/etc/rc.d/hubotとして以下を作成。
試行錯誤で作ったから雑なスクリプトであることに注意。
それから実行権限付けるのを忘れないこと。

 

起動確認

/etc/rc.confにhubot_enable=YESを記載。
service -l でhubotがリストされることを確認したら、service hubot startで起動。

以下のような表示が出ればOK。

 

ポートフォワーディングの設定。

前章の起動時メッセージ、「INFO hubot-redis-brain: Using default redis on localhost:6379」に注目。
6379でポート待ち受けている。
ご家庭のサーバで動かしている場合には、ルータでのポートフォワーディング設定を忘れずに。
なお2016/4/16現在、slackの側でサーバのIPアドレスを指定したりするような設定は不要。

 

slack側の確認

slackでbotを住まわせたいchannelにInvite。
botの名前の左側に在席マークが点いているのを確認し、「@<bot名> ping」とし、botからPONGと帰ってきたら成功。
もし起動時メッセージが不要であれば、以下のように/usr/sbin/daemonのオプションに-fを加えるとよい。