はじめに
タイトルがわかりづらいですね・・・
前回slackのボタン付きメッセージを送れるようにしたんですが、
(Pythonを使ってSlackへボタン付きメッセージを送る)
ボタンを押してもエラーになってしまうんですね。
なのでちゃんと反応してくれるようにしました。
その時につまづいたところをメモっておきます。
環境
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
本題
どこでつまづいたかと言いますと。
@route('/', method='POST')
def index():
params = json.loads(request.params.get('payload')) # ここ!!
text = postMsg(params)
return text
これを次のように修正したらうまくできました。
@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_data
をurllib.parse.unquote
でパースし、payload
に格納。この時payload
は文字列型。
・jsonで扱うために、payload
をjson.loads
で辞書型にし、params
に格納。
終わりに
もっといい方法があるはず・・・