Monthly Archives: 6月 2016

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

Pocket

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

# mattermost

import requests

incomWebHook = 'http://192.168.10.1/hooks/xxxxx'
msg = 'test message'
icon_url = 'http://192.168.10.10/graphix/robot.png'
username = 'bot'

def sendMsg(incomWebHook, icon_url, username, msg):
    payload = {
            'text': msg,
            'icon_url': icon_url,
            'username': username}

    r = requests.post(
        incomWebHook,
        json=payload)

    return r

r = sendMsg(incomWebHook, icon_url, username, msg)

Slack

# slack
import requests

incomWebHook ="https://slack.com/api/chat.postMessage"
msg = 'test message'
username = 'bot'
token = "xoxb-xxxx-xxxx"

def sendMsg(incomWebHook, token, username, msg):
    payload_dic = {
            "token": token
            "type": "message",
            "channel": "#general",
            "text": msg,
            "username": username,
            "icon_emoji": ":bird:",
            }

    headers = {
            'Content-type': 'application/json',
            'Accept': 'text/plain'
            }

    r = requests.post(
            incomWebHook,
            params=payload_dic,
            headers=headers)

    return r

r = sendMsg(incomWebHook, token, username, msg)

[メモ][Python] AnacondaをWindows xpにインストールしようとすると失敗する

Pocket

Anacondaは、Pythonのほかに、IPython、Spyder、pandas他便利ライブラリが一式でついてくるお手軽Python環境である。

しかしAnacondaをWindows xpにインストールしようとすると失敗する。
具体的には、インストール途中の「メニューを作る」ステップで失敗。
無視して進めると、C:\Anaconda3に実行ファイルは揃っているので、「なんだ気のせいか」と安心して起動しようとすると「有効なWin32アプリケーションではありません」という旨のエラーが発生する。

原因は、最新版がxpに対応していないせい。
以下から2.2.0をダウンロードし、インストールする。

https://repo.continuum.io/archive/

念のためファイル名とハッシュ値も残す。

Anaconda3-2.2.0-Windows-x86.exe
7c49a4e76e1c383038c4a1e8c4ac506f

Anaconda-2.2.0-Windows-x86.exe
32246b48658d4c3faeef425cec64a131

AnacondaのFAQにしっかり記載がある。

https://docs.continuum.io/anaconda/faq

How can I use Anaconda on Windows XP?
Windows XP is supported on Anaconda versions 2.2 and earlier. Download it from our archive.

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とかはやめようね。

#!/usr/local/bin/python

from flask import Flask

app = Flask(__name__)

@app.route('/')
def welcome():
    html = '<html><title>welcome</title>'
    html = html + '<body>welcome</body></html>'
    return html

if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0')

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

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

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

テストスクリプトの実行

$ python ./flasktest.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 213-546-048

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

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

 * Detected change in '/usr/home/doe/py/flasktest.py', reloading
 * Restarting with stat
 * Debugger is active!

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

SlackからのPOSTを受ける。

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

from flask import Flask, request

さらに以下を追加。

@app.route('/matter', methods=['POST'])
def post():
    print request.form

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

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

以下が例。

ImmutableMultiDict([('user_id', u'xxxxx'), ('channel_id', u'xxxxx'), ('timestamp', u'1414562326'), ('team_id', u'xxxx'), ('trigger_word', u'test'), ('channel_name', u'off-topic'), ('token', u'xxxtokenxxx'), ('text', u'test'), ('team_domain', u'xxxx'), ('user_name', u'xxxx')])

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

Slackへ応答を返そう

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

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

#!/usr/local/bin/python

from flask import Flask, request
import requests
import json

app = Flask(__name__)

@app.route('/')
def welcome():
    html = '<html><title>welcome</title>'
    html = html + '<body>welcome</body></html>'
    return html

@app.route('/matter', methods=['POST'])
def post():
    postdic = request.form
    incomeText = postdic['text']
    token = postdic['token']
    text = 'You said ' + incomeText

    payload = {
            'text': text,
            'MATTERMOST_TOKEN': token}
    json_payload = json.dumps(payload)
    return json_payload

if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0')

あとはどんどん膨らませていけばよい。

 

[Windows] ファイルサーバへの接続ユーザを変えよう

Pocket

Sambaサーバのセットアップをしているとき、動作確認のために、Windowsから接続することがある。
このとき、権限も確認するために、ユーザを変えて接続しようとする。
しかしWindowsは、ファイルサーバの認証を一回してしまうと、再起動するまで記憶する(たぶん)。
それはそれで便利なのだが、検証するとなると障害になる。

netコマンドを使えば、再起動なく認証をやり直すことができる。
コマンドなので、バッチ化も可能。
以下、使用例。

net useで現在、記憶している接続を表示

C:\> net use
新しい接続は記憶されます。

ステータス  ローカル名 リモート名                ネットワーク名

-------------------------------------------------------------------------------
切断                   \\192.168.0.200\share     Microsoft Windows Network
切断                   \\windowsShare\IPC$       Microsoft Windows Network
コマンドは正常に終了しました。

net use /deleteで接続を削除

C:\> net use /delete \\192.168.0.200\share
\\192.168.0.200\share が削除されました。

以下のようにすれば認証もできる。

C:\> net use \\192.168.0.200\share /user:administrator password
コマンドは正常に終了しました。