<目次>
Slackアプリで「The top-level `text` argument is missing」の対処
エラー内容
直接原因
直接原因への対処
根本原因
根本原因への対処
参考:payloadとbodyの違い
Slackアプリで「The top-level `text` argument is missing」の対処
エラー内容
Boltフレームワークを使った簡単なアプリ(オウム返し)をSlackのソケットモードで実行すると、下記エラーになりました。
(エラーメッセージ)
The top-level `text` argument is miissing in the request payload for a chat.postMessage call
~中略~
slack_sdk.errors.SlackApiError: The request to the Slack API failed.
The server responded with: {'ok': False, 'error': 'invalid_arguments', 'response_metadata': {'messages': ['[ERROR] missing required field: channel']}}
(図111)

直接原因
chat_postMessageメソッドの引数がセットできていなかったため(Noneになっていた)
(図121)

直接原因への対処
●応急対処
原因切り分けも兼ねて、とりあえず疎通させてみました。
Chat_postMessageのchannelとtextを直打ちして、Slack上に投稿されるかどうか?を試しました。
<Before>
# もしボット以外の人からの投稿だった場合
if BOT_USER_ID != user_id:
# オウム返しを実行
client.chat_postMessage(channel=channel_id, text=text)
<After> 一旦、channelとtextを直打ちで指定
# もしボット以外の人からの投稿だった場合
if BOT_USER_ID != user_id:
# オウム返しを実行
client.chat_postMessage(channel="C033P5X618W", text="てすとabc")
・channelに与えるチャンネルのIDは、チャンネルの下記箇所からコピーしました。
(図131①)

・再度ソケットモードでプログラムを実行し、疎通成功!
(図131②)

このことから、eventやtextの取得に失敗している可能性がある点に、絞ることができました。
↓怪しい箇所
event = payload.get('event', {})
根本原因
リクエストのbodyではなく、payloadからeventを取得しようとしていたことが原因です。
(図132)

payloadはあくまでPOSTリクエストのうち、eventキーの値のみを抜き出したものです。
よって payload.get('event', {}) は正しくなく、取得に失敗してエラーになっていました。
根本原因への対処
eventキーの内容を取るために、payloadではなくbodyをメソッドの引数にして、body.get('event')で取るように修正。
<修正:Before>
@s_app.event("message")
def respondToRequestMsg(payload, message, client:WebClient, ack, logger):
event = payload.get('event', {})
<修正:After>
@s_app.event("message")
def respondToRequestMsg(body, message, client:WebClient, ack, logger):
event = body.get('event', {})
・再度ソケットモードでプログラムを実行し、疎通成功!
(図132④)

→エラーなく、投稿された内容を取得して、そのままオウム返しすることができました。
参考:payloadとbodyの違い
payloadとbodyのそれぞれのサンプルデータを掲載します。
●body(HTTPリクエストのボディ。event以外のメタデータも含む)
{
'token': 'BgDhkOAmkfDyKYViVnMLqKqA',
'team_id': 'T02TA6EUXSN',
'api_app_id': 'A033Y3LR6PN',
'event': {
'client_msg_id': '61832996-ac5c-4147-b72b-82d261b9c8ef',
'type': 'message',
'text': 'あああ',
'user': 'U02T3FS7FD4',
'ts': '1662775618.543919',
'team': 'T02TA6EUXSN',
'blocks': [{
'type': 'rich_text',
'block_id': 'RKe',
'elements': [{
'type': 'rich_text_section',
'elements': [{'type': 'text','text': 'あああ'}]
}]
}],
'channel': 'C033P5X618W',
'event_ts': '1662775618.543919',
'channel_type': 'channel'
},
'type': 'event_callback',
'event_id': 'Ev041E8QDHRD',
'event_time': 1662775618,
'authorizations': [{
'enterprise_id': None, 'team_id': 'T02TA6EUXSN',
'user_id': 'U033Y490UQ4',
'is_bot': True, 'is_enterprise_install': False
}],
'is_ext_shared_channel': False,
'event_context': '4-eyJldCI6Im1lc3NhZ2UiLCJ0aWQiOiJUMDJUQTZFVVhTTiIsImFpZCI6IkEwMzNZM0xSNlBOIiwiY2lkIjoiQzAzM1A1WDYxOFcifQ'
}
●payload(bodyの中の一部、eventキーの値)
{
'client_msg_id': '61832996-ac5c-4147-b72b-82d261b9c8ef',
'type': 'message',
'text': 'あああ',
'user': 'U02T3FS7FD4',
'ts': '1662775618.543919',
'team': 'T02TA6EUXSN',
'blocks': [{
'type': 'rich_text',
'block_id': 'RKe',
'elements': [{
'type': 'rich_text_section',
'elements': [{'type': 'text','text': 'あああ'}]
}]
}],
'channel': 'C033P5X618W',
'event_ts': '1662775618.543919',
'channel_type': 'channel'
}
(図141)
