Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Python Slack

Slackアプリで「The top-level `text` argument is missing」の対処

投稿日:2022年12月24日 更新日:

<目次>

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)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Python, Slack
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Pythonで動的に変数を定義する方法

<目次> Pythonで動的に変数を定義する方法  想定利用シーン  (構文1)forループから  (構文2)ディクショナリー形式から  サンプルプログラム1  サンプルプログラム2 Pythonで動 …

PythonのSQLAlchemyで「ArgumentError : Could not parse rfc1738 URL」エラーや「InvalidRequestError: Could not reflect: requested tables(s)」エラーが出た時の対処について

(0)目次&概説 (1) エラー対応1:sqlalchemy.exc.ArgumentError  (1-1) 発生状況・エラーメッセージ   (1-1-1) エラーメッセージ   (1-1-2) エ …

no image

OpenAIでPDFファイルを要約する方法(サンプルプログラムをご紹介)

  <目次> OpenAIでPDFファイルを要約する方法(サンプルプログラムをご紹介)  やりたいこと/概要  サンプルプログラム  動かし方 OpenAIでPDFファイルを要約する方法(サ …

AzureのTable StorageをPythonから操作する方法

  <目次> AzureのTable StorageをPythonから操作する方法  当記事のゴール  Azure Table StorageをPythonで操作するための基礎知識  STE …

Slackでコマンドを作る方法をご紹介(自作スラッシュコマンド)

  <目次> (1) Slackでコマンドを作る方法をご紹介(自作スラッシュコマンド)  (1-0) やりたいこと  (1-1) STEP1:Slackボットの開発(所要時間:60分)  ( …

  • English (United States)
  • 日本語
Top