LoginSignup
1
1

More than 3 years have passed since last update.

SlackのMessageButtonに反応させようとしたらつまづいた話

Posted at

はじめに

タイトルがわかりづらいですね・・・
前回slackのボタン付きメッセージを送れるようにしたんですが、
(Pythonを使ってSlackへボタン付きメッセージを送る)
ボタンを押してもエラーになってしまうんですね。

スクリーンショット 2019-06-02 23.04.52.png

なのでちゃんと反応してくれるようにしました。
その時につまづいたところをメモっておきます。

環境

MacBook Air macOS Sierra 10.12.6
Python 3.6.5
requests 2.19.1
Flask==1.0.2
gunicorn==19.9.0
Heroku
urllib.parse

本題

どこでつまづいたかと言いますと。

index.py
@route('/', method='POST')
def index():
    params = json.loads(request.params.get('payload'))  # ここ!!
    text = postMsg(params)
    return text

これを次のように修正したらうまくできました。

index.py
@app.route("/", methods=["POST"])
def index():
    data = request.get_data()
    str_data = data.decode("UTF-8").replace("payload=", "")
    payload = urllib.parse.unquote(str_data)
    params = json.loads(payload)
    text = postMsg(params)
    return text

たどり着くまで

色々な取得方法を調べた結果、
受け取っていたのがapplication / x-www-form-urlencodedというコンテンツタイプだったこと、
型がbytes型だったこと、
始まりがpayload=%7B%22type%22%3A 〜だったことから、
上記のようになりました。

やっていることは、以下になります。
・POSTで受け取ったものをdataに格納。この時dataはbytes型。
dataを文字列型にデコードし、payloadを削除(置換)しstr_dataに格納。この時str_dataは文字列型。
str_dataurllib.parse.unquoteでパースし、payloadに格納。この時payloadは文字列型。
・jsonで扱うために、payloadjson.loadsで辞書型にし、paramsに格納。

終わりに

もっといい方法があるはず・・・

1
1
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
1
1