#やりたいこと
JSONで真偽値を扱う
#コード
AWSのlambdaとSlackのAPIを使ってSlack上でBotを動かしています。基本的には正常に動作するのですが、真偽値を返す必要がある機能だけ正しく機能しません。具体的には以下のコード"unfurl_links": True,"unfurl_media": True
(リンクや画像を展開させるか否かの設定です)についてですが、これらのコードが無い場合と同じ挙動をします(bot自体は動くものの、リンクやファイルの展開がされない)。おそらく、Jsonの送り方に何か誤りがあって思い通りいかないと思われるので、お力添えいただければ幸いです。
def post_message_to_slack_channel(message: str, channel: str, channelId: str, user: str, image: str): # Slackのchat.postMessage APIを利用して投稿する # ヘッダーにはコンテンツタイプとボット認証トークンを付与する url = "https://slack.com/api/chat.postMessage" headers = { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer {0}".format(os.environ["SLACK_BOT_USER_ACCESS_TOKEN"]) } data = { "token": os.environ["SLACK_APP_AUTH_TOKEN"], "channel": channel, "text": message, "unfurl_links": True, "unfurl_media": True, "username": user, "icon_url": image, "attachments": [ { "fallback": "Plain-text summary of the attachment.", "color": "#2eb886", "footer": "ハンク君 | リプライはリンクをクリック→ " + "<#" + channelId + "|" + channel + ">", "footer_icon": "https://3.bp.blogspot.com/-jtvaRX9n8OU/VaMOHGaVeRI/AAAAAAAAviQ/D9omX3FtbPw/s800/boy_05.png" } ] } req = urllib.request.Request(url, data=json.dumps(data).encode('utf-8'), method="POST", headers=headers) urllib.request.urlopen(req) return "OK"
追記
"unfurl_links": True,"unfurl_media": True
はこちらから送信しているデータです。
json.dumps(data).encode('utf-8')
をログに出力させると、
{ "token": "mkGZRssFyF4k6U0DcczP4p1O", "channel": "important_timeline", "text": "<https://qiita.com/kamata1729/items/8d88ea10dd3bb61fa6cc>", "unfurl_links": true, "unfurl_media": true, "username": "aaa", "icon_url": "https://secure.gravatar.com/avatar/6d5e0dbbc3866bd59540ee26b5fc1969.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2Fdf10d%2Fimg%2Favatars%2Fava_0014-512.png", "attachments": [ { "fallback": "Plain-text summary of the attachment.", "color": "#2eb886", "footer": "\u30cf\u30f3\u30af\u541b \uff5c \u30ea\u30d7\u30e9\u30a4\u306f\u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30af\u2192 <#C0175MJ0D3Q|important_timeline>", "footer_icon": "https://3.bp.blogspot.com/-jtvaRX9n8OU/VaMOHGaVeRI/AAAAAAAAviQ/D9omX3FtbPw/s800/boy_05.png" } ] }
のようになりました。
json関係でのミスではないかと思うに至った理由は、私がpythonの通信周りについてほとんど知識がない事、真偽値以外のパラメータは正常に機能する事が事実としてあるので、真偽値と文字列の違いがjsonを送る上で何かに引っかかっているのではと素人ながら考えたからです。
また、"unfurl_links": true,"unfurl_media": true
とした時はtrue
という文字列が認められないという旨のエラー("や'で囲まれていない文字列として扱われてしまう)が、"unfurl_links": 'true',"unfurl_media": 'true'
とした時は、質問の本題と同じくbotは動くもののリンクやファイルの展開がされないという状態になります。