エラー内容
ValueError: Request to Slack returned an error 400, the response is:
invalid_blocks
エラーの原因は本文の長さが3000文字を超えたということらしい・・・
以下はAIの回答
Slackのブロックキットには文字制限があります。以下は主な制限です:
- ブロックの数:
- メッセージあたり最大50ブロック。
- テキストの長さ:
section
ブロックのtext
フィールドは最大3000文字。context
ブロックのelements
フィールドは最大10個の要素。mrkdwn
テキストは最大3000文字。
- メッセージ全体のサイズ:
- メッセージ全体のペイロードは最大30KB。
ならば、本文を3000文字ずつ分割して送信するしかない!
詳細な説明
このコードは、body
文字列を3000文字ごとに分割するためのものです。Slackのブロックキットには文字数制限があるため、長いテキストを複数のブロックに分割する必要があります。
range(0, len(body), 3000)
:range
関数は、開始値、終了値、ステップ値を指定して数列を生成します。- ここでは、
0
からlen(body)
まで、3000ずつ増加する数列を生成します。 - 例えば、
body
の長さが7500文字の場合、生成される数列は[0, 3000, 6000]
となります。
body[i:i + 3000]
:body
文字列の部分文字列を取得します。i
からi + 3000
までの部分文字列を取得します。- 例えば、
i
が0
の場合、body[0:3000]
は最初の3000文字を取得します。
body_split.append(body[i:i + 3000])
:- 分割された部分文字列を
body_split
リストに追加します。 - これにより、
body
文字列が3000文字ごとに分割され、body_split
リストに格納されます。
- 分割された部分文字列を
コードの例(Python)
以下は、body
文字列を3000文字ごとに分割するコードの例です:
body = "非常に長いテキスト..." # 例として非常に長いテキストを使用
body_split = []
# bodyを3000文字ごとに分割
for i in range(0, len(body), 3000):
body_split.append(body[i:i + 3000])
# 3000文字ずつブロックを作る
for i, body in enumerate(body_split):
blocks.append({
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"{body}"
}
})
payload = {
"blocks": blocks
}
body
文字列が3000文字ごとに分割され、body_split
リストに格納されます。これにより、Slackのブロックキットの文字数制限を超えないようにすることができます。
コメント