• 2019未踏ジュニアMattermostが導入された

  • tokorotenVeinを接続したいと言い出して、どうせならみんなHackableな方がいいよねとなった

  • というわけでみんな色々繋げれるようになったから僕もチャットボットを作ってみた

  • Incoming Webhookを設定する

    • 設定したらcurlでリクエストを投げてみる
    • $ curl -i -X POST -d 'payload={"text": "日本語!"}' https://mattermost....
    • 正しく設定できていればこんな感じになる
      • image
      • プロフィール画像の設定がファイルアップロードではなく画像URLの指定だった
  • Slash Commandを設定する

    • チャットボット自体には使わないかもだけど一歩一歩進むためにこれをやる
    • 何がおきているかわかりやすくするために手元のサーバでやる
    • $ python3 -m http.server
      • ローカルの8000番ポートでHTTPサーバを立てた
      • ディレクトリ内のファイルが晒されるので見られて困るもののないところでやること
    • $ ngrok http 8000
      • ローカルの8000番ポートへngrokでトンネリング
      • ブラウザで http://***.ngrok.io/ にアクセスしてディレクトリ内が見えることを確認
    • スラッシュコマンドの設定
      • リクエストURL: http://***.ngrok.io/
      • リクエストメソッド: GET
    • これでスラッシュコマンドを実行するとサーバにこんなリクエストが届くのが見える
      • GET /?channel_id=&channel_name=z-botplayground&command=%2Fnisbot&response_url=&team_domain=&team_id=&text=&token=&user_id=&user_name=nishio
    • http.serverはこのリクエストに対して、パラメータを無視してディレクトリ内のファイルの一覧表示のHTMLを返す
    • そのHTMLがMattermost上に表示される
      • image
    • これで手元のサーバとMattermostが相互にやり取りできることが確認された
    • なおリクエストメソッドをPOSTにするとMattermost上に
      • トリガー'nisbot'によるコマンドは501 Unsupported method ('POST')状態を返しました
      • とエラーメッセージが表示される。http.serverがPOSTに対して501を返すという理由
  • Outgoing Webhookを設定する

from flask import Flask
import json
app = Flask(__name__)

@app.route("/", methods=["POST"])
def hello():
    return json.dumps(dict(text="hello"))
    - `$ FLASK_APP=server.py flask run --port 8000`
        - サーバを起動した
        - ポート8000を指定しているのはhttp.serverに揃えることでngrokを起動し直すのを避けただけ
    - これで話しかけるとhelloと返事してくるようになった
        - ![image](https://gyazo.com/eb4d211c9ee896d8505666b6b7d02562/thumb/1000)

- 毎回固定文字列の返事では面白くないのでとりあえずパラメータを扱いたい
    - パラメータがどういう名前で渡されるかはこれの8に書いてある
        - [Outgoing Webhooks — Mattermost 5.11 documentation](https://docs.mattermost.com/developer/webhooks-outgoing.html)

python

from flask import Flask, request
import json
app = Flask(__name__)

@app.route("/", methods=["POST"])
def hello():
    username = request.form["user_name"]
    text = request.form["text"]
    reply = f"{username}が「{text}」と入力した"
    return json.dumps(dict(text=reply))
    - ![image](https://gyazo.com/3f673f2cac3dc5767099cd698a3d35c7/thumb/1000)
    - 作成過程の失敗メモ
        - `from flask import Flask, request`のrequestを忘れて500 Internal Server Errorになった
        - user_nameとすべきところをusernameにすると400 Bad Requestになる
        - コンテントタイプをデフォルトのurlencodedからjsonに変更してても400になる
            - ![image](https://gyazo.com/b77eb98b3c5771f95a8ee21a95ae25e2/thumb/1000)

今回は手元のサーバでbotをつくるところまでをやった 個人的には次はAWS Lambdaを試したいと思っている