2025年7月16日水曜日

slack-ruby-client でファイルを添付してメッセージを送信する方法

slack-ruby-client でファイルを添付してメッセージを送信する方法

概要

かなり昔に使い方を紹介したのですがその際はリアルタイムメッセージAPIの使い方を紹介しました
今回はファイルを添付したメッセージの送信方法を紹介します

環境

  • macOS 15.5
  • Ruby 3.4.4
  • slack-ruby-client 2.6.0

サンプルコード

# frozen_string_literal: true

require 'slack-ruby-client'

# MySlack クラスは Slack へのメッセージ送信とファイルアップロードを行います。
class MySlack
  USER_ID = 'U1234567890' # ユーザーIDを定義
  TOKEN = 'xoxb-xxx-xxx-xxx' # Slack API トークンを定義

  def initialize
    # Slack クライアントの初期化
    Slack.configure do |config|
      config.token = TOKEN
    end
    @client = Slack::Web::Client.new
  end

  def channel_id_for_sending_file
    # ボットと指定のユーザーとの会話を開始し、チャンネルIDを取得
    response = @client.conversations_open(users: USER_ID)
    response.channel.id
  end

  def send_message(message_text, channel_id)
    # メッセージを送信
    @client.chat_postMessage(
      channel: channel_id,
      text: message_text
    )
  end

  def upload_file(file_path, message_text, channel_id)
    # ファイルをアップロード
    @client.files_upload_v2(
      filename: File.basename(file_path),
      content: File.read(file_path),
      channels: [channel_id],
      initial_comment: message_text,
      snippet_type: 'text',
      title: '添付されたテキストファイル'
    )
  end
end

ポイント

Slack のファイルアップロード API は v1 から v2 になり大きく変更されています
チャネル名が指定不可になった他ボットからファイルを送信するためにはチャネルにボットが参加しているなどの条件があります
一番確実な方法として特定のユーザとの会話チャネルに送信する方法があるので今回はその方法を採用しています (参考)

トラブルシューティング

invalid_arguments (Slack::Web::Api::Errors::InvalidArguments)

ファイルが空の場合に発生します
どうやら空ファイルは送信できないようです

最後に

slack-ruby-client で file uplaod API v2 を使ってファイルのアップロードを行ってみました
v2 からかなり厳格なチェックが入っておりかつ v1 との互換性はないので注意が必要です

参考サイト

0 件のコメント:

コメントを投稿