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で動 …

Slackのアプリを作成する手順をご紹介

  <目次> (1) Slackのアプリを作成する手順をご紹介  (1-1) Slackアプリの作成手順   ●STEP1:Slackアプリの新規作成   ●STEP2:Slackアプリの権 …

Pythonでcsvのカラム名を変更する方法(Pandasのread_csvで読み込んだcsvのカラム名変更)

<目次> (1) Pythonでcsvのカラム名を変更する方法  (1-1) 構文①  (1-2) サンプルプログラム①  (1-3) 構文②  (1-4) サンプルプログラム② PythonのPan …

Pythonでargparseを用いて引数を受け取って実行する方法

<目次> (1) Pythonでargparseを用いて引数を受け取って実行する方法  (1-1) argparseとは?  (1-2) 基本的な使い方  (1-3) サンプルプログラム (2) 参考 …

PythonのdatapackageとSQLAlchemy、SQLiteを使ってcsvデータをSELECTする

(0)目次&概説 (1) 今回の目的  (1-1) 目的  (1-2) 前提条件 (2) 実施手順  (2-0) 事前作業  (2-1) データ(csv)のロード  (2-2) エンジンの作成  (2 …

  • English (United States)
  • 日本語
Top