質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.21%

【Python】JSONの真偽値について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 705

ninba

score 1

やりたいこと

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は動くもののリンクやファイルの展開がされないという状態になります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ninba

    2020/08/17 17:52

    申し訳ございません。おそらく今の状況がquiqui様の提案そのものだと思うのですが、いかがですか?

    キャンセル

  • quickquip

    2020/08/17 18:39 編集

    2020/08/15 23:41 のコメント、コピーミスで
    「結果(実際に起きたこと)を書きましょう」、「自分で解釈・要約しようと書いてあるとおりなのですが。
    となっていましたが
    「結果(実際に起きたこと)を書きましょう」、「自分で解釈・要約しようとしてはいけません」と書いてあるとおりなのですが。
    でした。意図と逆になっていました。すみません。(編集しました)

    キャンセル

  • quickquip

    2020/08/17 18:43 編集

    そういうこともあって心苦しいのですが、
    > trueという文字列が認められないという旨のエラー("や'で囲まれていない文字列として扱われてしまう)
    の部分に解釈・要約が入っています。
    これだと、Pythonのエラーなのか、API呼び出しでエラーなのか区別が付きません。
    最低限、エラーメッセージがそのまま書かれてさえいれば、知識がある人が見れば区別が付きます。
    こういうところに解釈が入ると状況が掴みづらくなります。

    おそらく、Pythonコード上で "unfurl_links": true, と書いたという話だとは思っているのですが。

    キャンセル

回答 3

+2

的を外しているかもしれませんが、 JSON の真偽値は True ではなく true ではないでしょうか? 大文字の使用は認められておりません。

JSONについて調べてみた - Qiita - chihiroさん

RFC 8259規格の定義

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

すいません、既に対応済みの内容でした。
下記内容は無視してください。

~下記の記事と同事象かは不明ですが、json.dumps()を試してみてはいかがでしょうか?~

import json
payload = json.dumps(params)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

実際試していない状況での回答になりますが。

https://api.slack.com/reference/messaging/link-unfurling

unfurl_links applies to text based content, unfurl_media applies to media based content. These flags are mutually exclusive, the unfurl_links flag has no effect on media content.

とあるので、両方を真にしたら unfurl_links は無視されるのではないでしょうか?

qiitaのURLに unfurl_media フラグが効くとは思えないので、コードが無い場合と同じ挙動をするのは正しいのでは? と感じます。


それとも media content でないときは、unfurl_media が真でも unfurl_links は効くのでしょうか?

効く可能性もありますが

https://api.slack.com/reference/messaging/link-unfurling#examples

には一方しか指定していない例だけがあるので、一方だけにするのがいいのではと思います。

私なら、(Pythonコードで)

"unfurl_links": True,
"unfurl_media": False,
"unfurl_links": False,
"unfurl_media": True,
"unfurl_links": True,
"unfurl_media": True,

の4通りを試してみるでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る