SlackAPI conversations.replies で thread_not_found になる件を調査

2024.05.22

アノテーション インフラチーム所属の髙橋隆太です。

Slack の API conversations.history の結果から取得した値の ts(タイムスタンプ) を conversations.replies に渡したら thread_not_found と出力されましたので原因を調査してみました。

背景

要件は特定のチャンネルのスレッドを全て取得することになります。 私は以下のように実装しました。

  1. conversations.history から全てのメッセージを取得して conversations.replies に渡すための ts を取得する

  2. conversations.history で取得したメッセージの件数分、conversations.repliesを実行して thread を取得する

ざっくり利用メソッド内容の確認

conversations.history とは

  • Slack のチャンネル内のメインスレッドのメッセージを取得する
  • 削除されたメッセージや、チャンネルの変更・退出のメッセージも取得できる

conversations.history の詳細

conversations.repliesとは

  • Slack の thread を取得することができる

conversations.replies の詳細

調査してみる

conversations.history で messageを取得

conversations.history でどのようなタイプの メッセージが取得できるか確認してみました。 conversations.history の結果の確認はこちらのテストサイトから確認するのが便利です。 本 API で必要な項目は以下です。

  • Slack の channel ID
  • User または Bot の Token

実際に確認し、messages[]の中身を確認してみます。

{
    "user": "UXXXXXXXXXX",
    "type": "message",
    "ts": "1715675308.190329",
    "client_msg_id": "696451ae-2a0a-4148-810f-fb9a5fedfeec",
    "text": "aaaa",
    "team": "TXXXXXXXXX",
    "blocks": [
        {
            "type": "rich_text",
            "block_id": "2roPl",
            "elements": [
                {
                    "type": "rich_text_section",
                    "elements": [
                        {
                            "type": "text",
                            "text": "aaaa"
                        }
                    ]
                }
            ]
        }
    ]
},
{
    "subtype": "channel_purpose",
    "user": "UXXXXXXXXXX",
    "purpose": "chane_purpose",
    "text": "がこのチャンネルの説明を「chane_purpose」に設定しました",
    "type": "message",
    "ts": "1715674661.484209"
},
{
    "subtype": "channel_topic",
    "user": "UXXXXXXXXXX",
    "topic": "change_topic",
    "text": "チャンネルのトピックを設定 : change_topic",
    "type": "message",
    "ts": "1715674451.069059"
}

上記よりメッセージによって、さまざまな subtype があるらしいです。

メッセージ subtype
標準メッセージ なし
チャンネルのトピックを変更 channel_topic
チャンネルの説明を変更 channel_purpose

subtype の種類はこちらのページに記載されていました。

conversations.replies で thread を取得

conversations.history で取得した ts で conversations.replies の結果を確認してみます。 conversations.replies の結果の確認はこちらのテストサイトから確認するのが便利です。 conversations.replies で必要な項目は以下です。

  • Slack の channel ID
  • User または Bot の Token
  • メッセージの ts(タイムスタンプ)

実際に先ほど取得した ts を渡してみます。

標準メッセージ

{
    "user": "UXXXXXXXXXX",
    "type": "message",
    "ts": "1715675308.190329",
    "client_msg_id": "696451ae-2a0a-4148-810f-fb9a5fedfeec",
    "text": "aaaa",
    "team": "TXXXXXXXXXX",
    "blocks": [
        {
            "type": "rich_text",
            "block_id": "2roPl",
            "elements": [
                {
                    "type": "rich_text_section",
                    "elements": [
                        {
                            "type": "text",
                            "text": "aaaa"
                        }
                    ]
                }
            ]
        }
    ]
}

トピックを変更する

{
    "ok": false,
    "error": "thread_not_found"
}

説明を変更する

{
    "ok": false,
    "error": "thread_not_found"
}

どうやら、subtypeによっては取得できないものもありそうです。
conversations.replies のドキュメントに以下の記載がありました。
ts must be the timestamp of an existing message with 0 or more replies

0件以上の返信があるとのことですが、
これは全てのメッセージのように感じますが・・・
おそらく、取得できないようなメッセージもあると謳いたいのかなーと推測しました。

結論

Slack のメッセージのチャンネルのトピックを設定しました: change_topicチャンネルの説明を設定しました : change_descriptionのようなリプライできないメッセージの ts を conversations.replies のパラメータに指定すると thread_not_found のエラーになることが確認できました。

もし、私と同じように conversations.history で ts を取得して conversations.replies に渡してループという運用をしている場合は、 thread_not_found のエラーでループが止まることもあるので、一旦ソースコードを見直してみてはいかがでしょうか。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。