ラベル Slack の投稿を表示しています。 すべての投稿を表示
ラベル Slack の投稿を表示しています。 すべての投稿を表示

2026年2月7日土曜日

Slack で管理者権限のあるユーザトークンを取得する方法

Slack で管理者権限のあるユーザトークンを取得する方法

概要

ボットトークン (xoxb-) ではなくユーザトークン (xoxp-) を取得する方法を紹介します
ただし無料プランだと管理者権限のあるユーザトークンは設定できないので注意してください

環境

  • Slack 2026/02/04 時点

アプリ作成

権限設定

  • OAuth & Permissions
  • User Token Scopes
  • admin を追加

アプリ再インストール

  • OAuth & Permissions
  • OAuth Tokens
  • Reinstall to xxx

トークン確認

  • xoxp- から始まるトークンが発行されていることを確認します
  • すでにボットトークンがある場合はその上に User OAuth Token が発行されます

最後に

あとはトークンを使うだけ

参考サイト

2025年12月15日月曜日

fail2ban で ban の際に slack に通知する

fail2ban で ban の際に slack に通知する

概要

前回続きです
ban になったら slack に通知するようにしてみました

環境

  • Ubuntu 24.04
  • docker
  • linuxserver/fail2ban 1.1.0-r2-ls26
  • fail2ban 1.1.0

compose.yaml

ユーザの権限部分など少し変更しています
作成したアクションの設定ファイルもマウントするようにしています

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    network_mode: host
    volumes:
      - ./nginx/log:/var/log/nginx  # このログをfail2banで監視
    restart: unless-stopped

  fail2ban:
    image: linuxserver/fail2ban:latest
    container_name: fail2ban
    network_mode: host
    cap_add:
      - NET_ADMIN # BANに必須
      - NET_RAW   # BANに必須
    volumes:
      - ./config/jail.local:/config/fail2ban/jail.d/jail.local
      - ./config/filter.d/nginx-404.conf:/config/fail2ban/filter.d/nginx-404.conf
      - ./config/action.d/slack.conf:/config/fail2ban/action.d/slack.conf
      - ./nginx/log:/remotelogs/nginx:ro  # nginxログを読み取り専用で監視
    environment:
      - PUID=1000  # 自身のユーザIDとグループIDに合わせて変更 (config/ 配下の権限がコンテナ側のユーザIDで変更されてしまうため編集ができなくなる)
      - PGID=122
      - TZ=Asia/Tokyo
      - VERBOSITY=-vv
    restart: unless-stopped

./config/jail.conf

nginx-404 サービスの action に slack を追加します

[DEFAULT]

# "bantime.increment" allows to use database for searching of previously banned ip's to increase a
# default ban time
bantime.increment = true

# "bantime.maxtime" is the max number of seconds using the ban time can reach (doesn't grow further)
bantime.maxtime = 5w

# "bantime.factor" is a coefficient to calculate exponent growing of the formula or common multiplier
bantime.factor = 24

# "bantime" is the number of seconds that a host is banned.
bantime = 1h

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 24h

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

# Prevents banning LAN subnets
ignoreip    = 127.0.0.1/8 ::1
              10.0.0.0/8
              172.16.0.0/12
              192.168.0.0/16

# The ban action "iptables-multiport" (default) should work for most
# The ban action "iptables-allports" can be used if multiport causes issues
banaction = iptables-multiport
banaction_allports = iptables-allports

# Read https://github.com/sebres/PoC/blob/master/FW.IDS-DROP-vs-REJECT/README.md before changing block type
# The block type "REJECT --reject-with icmp-port-unreachable" (default behavior) should respond to, but then instantly reject connection attempts
# The block type "DROP" should not respond to connection attempts, resulting in a timeout
#banaction = iptables-multiport[blocktype=DROP]

# Add additional actions
action  = %(action_)s

# [sshd]
# configuration inherits from jail.conf
# enabled = true
# chain   = INPUT
# action  = %(action_)s

[nginx-http-auth]
# configuration inherits from jail.conf
enabled = true
chain   = DOCKER-USER
action  = %(action_)s

[nginx-badbots]
# configuration inherits from jail.d/nginx-badbots.conf 
enabled = true
chain   = DOCKER-USER
action  = %(action_)s

[nginx-botsearch]
# configuration inherits from jail.conf
enabled = true
chain   = DOCKER-USER
action  = %(action_)s

[nginx-deny]
# configuration inherits from jail.d/nginx-deny.conf
enabled = true
chain   = DOCKER-USER
action  = %(action_)s

[nginx-unauthorized]
# configuration inherits from jail.d/nginx-unauthorized.conf
enabled = true
chain   = DOCKER-USER
action  = %(action_)s

[nginx-404]
# Custom filter to detect excessive 404 errors
enabled  = true
chain    = INPUT
port     = http,https
filter   = nginx-404
logpath  = /remotelogs/nginx/access.log
maxretry = 3
findtime = 10s
bantime  = 1h
action   = %(action_)s
           slack

config/filter.d/nginx-404.conf

前回と同じです

config/action.d/slack.conf

各種アクション時に通知するようにします
webhook_url は変更してください

# Fail2Ban configuration file
#
# Action to send notifications to Slack
#

[Definition]

# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
actionstart = curl -X POST -H 'Content-type: application/json' \
              --data '{"text":"[Fail2Ban] <name> jail has started"}' \
              <slack_webhook_url>

# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
actionstop = curl -X POST -H 'Content-type: application/json' \
             --data '{"text":"[Fail2Ban] <name> jail has stopped"}' \
             <slack_webhook_url>

# Option: actioncheck
# Notes.: command executed once before each actionban command
actioncheck =

# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
#         command is executed with Fail2Ban user rights.
actionban = curl -X POST -H 'Content-type: application/json' \
            --data '{"text":"[Fail2Ban] :no_entry: <name> jail banned IP: *<ip>*\nFailures: <failures>\nTime: <time>"}' \
            <slack_webhook_url>

# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
#         command is executed with Fail2Ban user rights.
actionunban = curl -X POST -H 'Content-type: application/json' \
              --data '{"text":"[Fail2Ban] :white_check_mark: <name> jail unbanned IP: *<ip>*"}' \
              <slack_webhook_url>

[Init]

# Slack webhook URL
slack_webhook_url = https://hooks.slack.com/services/xxx/xxx/xxx

動作確認

  • docker compose up -d

あとは localhost/test などで 404 を発生させると通知が来ます
unbanip で ban 解除しても通知が来ます

トラブルシューティング

起動時にちゃんと追加したアクションが読み込まれていることを確認しましょう
ここで読み込まれていないとうまく動作しません

  • docker compose logs | grep ‘action’
fail2ban  |  2025-12-12 10:00:26,132 79986F9C2B28 INFO  Loading configs for action.d/iptables-multiport under /etc/fail2ban
fail2ban  |  2025-12-12 10:00:26,133 79986F9C2B28 DEBUG Reading configs for action.d/iptables-multiport under /etc/fail2ban
fail2ban  |  2025-12-12 10:00:26,133 79986F9C2B28 DEBUG Reading config files: /etc/fail2ban/action.d/iptables-multiport.conf
fail2ban  |  2025-12-12 10:00:26,133 79986F9C2B28 INFO    Loading files: ['/etc/fail2ban/action.d/iptables-multiport.conf']
fail2ban  |  2025-12-12 10:00:26,133 79986F9C2B28 INFO    Loading files: ['/etc/fail2ban/action.d/iptables.conf']
fail2ban  |  2025-12-12 10:00:26,134 79986F9C2B28 INFO    Loading files: ['/etc/fail2ban/action.d/iptables.conf', '/etc/fail2ban/action.d/iptables-multiport.conf']
fail2ban  |  2025-12-12 10:00:26,147 79986F9C2B28 INFO  Loading configs for action.d/slack under /etc/fail2ban
fail2ban  |  2025-12-12 10:00:26,147 79986F9C2B28 DEBUG Reading configs for action.d/slack under /etc/fail2ban
fail2ban  |  2025-12-12 10:00:26,147 79986F9C2B28 DEBUG Reading config files: /etc/fail2ban/action.d/slack.conf
fail2ban  |  2025-12-12 10:00:26,147 79986F9C2B28 INFO    Loading files: ['/etc/fail2ban/action.d/slack.conf']
fail2ban  |  2025-12-12 10:00:26,147 79986F9C2B28 INFO    Loading files: ['/etc/fail2ban/action.d/slack.conf']

最後に

ban になったかどうかをいちいち確認する必要がなくなるので便利です
現在の ban 状況を定期的に送信してくれる機能があると更に便利かなと思います

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 との互換性はないので注意が必要です

参考サイト

2024年7月19日金曜日

Github Actions から Slack に通知する方法

Github Actions から Slack に通知する方法

概要

Github Actions から Slack に通知する方法を紹介します
slackapi/slack-github-action@v1.26.0 を使います

環境

  • Github Actions (2024/07/17時点)

SLACK_WEBHOOK_URL の取得

レガシーアプリではなく最新のアプリを作成します
こちらを参考に取得しましょう

Github への SLACK_WEBHOOK_URL の登録

プロジェクト -> Settings -> Secrets and variables -> New repository secret

Yaml の作成

  • vim .github/workflows/slack_send.yml
name: ci

on:
  push:
    branches:
      - "master"

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Slack notification
        id: slack
        uses: slackapi/slack-github-action@v1.26.0
        with:
          payload: |
            {
              "text": "Test slack notification"
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

payload に設定可能なキーはこちらを参照してください https://api.slack.com/surfaces/messages

最後に

一番大変なのは Webhook URL を取得する部分かもしれません

参考サイト

2024年7月17日水曜日

Slack のアプリを管理している URL

Slack のアプリを管理している URL

概要

レガシーアプリではなく最新のアプリの管理 URL になります
Bot トークンや Webhook URL も新しい仕組みで作成したアプリから取得できます

環境

  • Slack API (2024/07/17 時点)

新しいURL

古いURL

最後に

古いURLからだと自分で作成したアプリの Bot トークンや Webhook URL は参照できません

2024年4月22日月曜日

Python Slack SDK でスレッドとして返信する方法

Python Slack SDK でスレッドとして返信する方法

概要

chat_postMessage で thread_ts を指定します

環境

  • macOS 11.7.10
  • Python 3.11.6
  • slack-sdk 3.27.1

サンプルコード

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token="xoxb-xxxxxx")
channel_id = "C0123456789"

try:
    # 会話情報の取得、最新100件
    result = client.conversations_history(channel=channel_id)
    conversation_history = result["messages"]
    # とりあえず最新のメッセージのスレッドに返信する
    ts = result["messages"][0]["ts"]
    # thread_tsを指定することでスレッド返信になる
    response = client.chat_postMessage(
        channel="#private",
        text="Hello world!",
        thread_ts=ts,
        # アイコンやユーザ名をカスタムする場合は以下を設定する
        username="hawksnowlog",
        icon_url="https://pbs.twimg.com/profile_images/712848447569661952/ayfI9-77_400x400.jpg",
    )
except SlackApiError as e:
    print(e)

最後に

as_user オプションは廃止されているので使えません
代わりに username と icon_url を使いますが APP というタグは必ず付与されてしまうようで完全にユーザになり変わって投稿することはできないようです

参考サイト

2024年4月15日月曜日

Slack の Incomming Webhooks URL を取得する方法

Slack の Incomming Webhooks URL を取得する方法

概要

Legacy App ではなく最近のアプリ作成方法から Incomming Webhooks URL を取得する方法を紹介します

環境

  • Slack (2024/04/09 時点)

アプリの作成

まずはアプリを作成します
ここを参考に作成すれば OK です

Incoming Webhooks の有効化

アプリの設定画面の左メニューにある「Incomming Webhooks」を選択します

有効にすると再度アプリの再インストールを促されるので従います
OAuth の許可画面になるので許可しましょう

あとは少し下に表示される Incomming Webhooks URL を使用すれば OK です

動作確認

curl などで行えば OK です

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/T1234567890/B1234567890/xxxxxxxxxxxxxxx

Gitlab の Slack notifications Integration などを使っても良いかなと思います

最後に

Slack 最近のアプリ作成方法から Incomming Webhooks URL を取得する方法を紹介しました
結構簡単に取得はできますがアプリを再度許可する必要があるので注意しましょう

参考サイト

2024年4月14日日曜日

Slack の Python SDK でメッセージに対してリアクションする方法

Slack の Python SDK でメッセージに対してリアクションする方法

概要

reaction_add という API を使います
ポイントはリアクションするメッセージを特定する方法が ID などではなくタイムスタンプだという点です

環境

  • macOS 11.7.10
  • Python 3.11.6
  • slack-sdk 3.27.1

サンプルコード

先に会話の情報を取得してリアクションするメッセージを決めます
今回は最新のメッセージに対してリアクションしていますが本来はメッセージの内容やメッセージの投稿者によって特定する必要があります

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token="xoxb-xxxxxx")
channel_id = "C0123456789"

try:
    # 会話情報の取得、最新100件
    result = client.conversations_history(channel=channel_id)
    conversation_history = result["messages"]
    # とりあえず最新のメッセージにリアクションしてみる
    ts = result["messages"][0]["ts"]
    print(ts)
    # 取得したtimestamp情報を元にthumbsupのリアクションする
    response = client.reactions_add(channel=channel_id, name="thumbsup", timestamp=ts)
except SlackApiError as e:
    print(e)

動作確認

以下のようにリアクションが追加になれば OK です

また同じメッセージに対して同じリアクションをしようとすると

The request to the Slack API failed. (url: https://www.slack.com/api/reactions.add)
The server responded with: {'ok': False, 'error': 'already_reacted'}

というエラーになるので注意しましょう

最後に

Slack Python SDK でリアクションする方法を紹介しました
絵文字に対するリアクションでボタンに対するアクションではないので注意しましょう

参考サイト

2024年4月12日金曜日

Slack の Python SDK で指定の日付範囲のメッセージの一覧を取得する方法

Slack の Python SDK で指定の日付範囲のメッセージの一覧を取得する方法

概要

conversations.history で oldest と latest を指定します

環境

  • macOS 11.7.10
  • Python 3.11.6
  • slack-sdk 3.27.1

サンプルコード

oldest と latest はエポックタイム形式で指定します
最終的には文字列として API はコールします   もし指定した範囲内のメッセージが 100 件を超える場合は has_more=true が返ってくるのでページネイトする必要があります

from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token="xoxb-xxxxxx")
channel_id = "C0123456789"

try:
    # 会話情報の取得、oldestとlatestで範囲指定、前日分の最新100件を取得する
    now = datetime.now(ZoneInfo("Asia/Tokyo")).replace(
        hour=0, minute=0, second=0, microsecond=0
    )
    oldest = now - timedelta(days=1)
    latest = now - timedelta(days=0)
    # print(oldest)
    # print(latest)
    # メッセージの一覧の取得、oldest,latestのタイムスタンプ(float)は文字列(str)に変換
    result = client.conversations_history(
        channel=channel_id,
        oldest=str(oldest.timestamp()),
        latest=str(latest.timestamp()),
        inclusive=True,
    )
    conversation_history = result["messages"]
    # メッセージの表示
    for msg in conversation_history:
        print(msg["text"])
        print(msg["ts"])
except SlackApiError as e:
    print(e)

最後に

サンプルではページネイトに関しては考慮していないので注意してください
最新100件なので古いものが含まれないケースがあります

参考サイト

2024年4月11日木曜日

Python で Slack に Attachments を送信する方法

Python で Slack に Attachments を送信する方法

概要

Attachments はセカンダリメッセージ用のフォーマットで引用などに使われます
今回は Python sdk で Attachments を送信するサンプルを紹介します

環境

  • macOS 11.7.10
  • Python 3.11.6
  • slack-sdk 3.27.1

サンプルコード

トークンは Bot トークンを使います
Attachments は辞書情報として渡します
指定可能なオプションの説明はコード内のコメントに記載しています

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token="xoxb-xxxxxxxx")

try:
    response = client.chat_postMessage(
        channel="#private",
        text="Hello world!",
        # ここからAttachmentsの定義
        attachments=[
            {
                # Attachmentsが表示されない場合の代替テキストを指定
                "fallback": "Plain-text summary of the attachment.",
                # 左のバーのカラーを指定
                "color": "#2eb886",
                # Attachmentsの上部のタイトル情報
                "pretext": "Optional text that appears above the attachment block",
                # Attachmentsの投稿者の名前
                "author_name": "Bobby Tables",
                # Attachmentsの投稿者のリンク先URL
                "author_link": "http://flickr.com/bobby/",
                # Attachmentsの投稿者のアイコンのURL
                "author_icon": "http://flickr.com/icons/bobby.jpg",
                # Attachments内に表示するタイトル
                "title": "Slack API Documentation",
                # Attachments内に表示するタイトルのURL
                "title_link": "https://api.slack.com/",
                # Attachments内に表示する本文
                "text": "Optional text that appears within the attachment",
                # 優先度情報
                "fields": [
                    {
                        "title": "Priority",
                        "value": "High",
                        "short": False,
                    }
                ],
                # フッター情報に掲載する画像情報とサムネイル情報
                "image_url": "https://picsum.photos/200/300",
                # image_urlとthumb_urlは一緒に使用できない、thumb_urlは500kb以下でなければならない
                # "thumb_url": "https://picsum.photos/200",
                # フッター情報
                "footer": "Slack API",
                "footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png",
                # フッターに表示するタイムスタンプ情報
                "ts": 1503435956.000247,
            }
        ],
    )
except SlackApiError as e:
    print(e)

動作確認

サンプルコードの Attachments の場合以下のような表示になります

最後に

Slack Python SDK で Attachments を送信してみました
その他にも blocks という形式でも送信できるようです
ボタンや画像、動画などを送ることができます

参考サイト

2024年4月9日火曜日

Slack の Socket Mode を試してみた

Slack の Socket Mode を試してみた

概要

Python を使いました
Socket Mode は Bolt と呼ばれる SDK を使ったほうが扱いやすいので Bolt を使います
トークンは Bot トークンと App Level トークンを使います

環境

  • macOS 11.7.10
  • Python 3.11.6
  • slack-bolt 1.18.1

準備

  • アプリの作成
  • Bot トークンの権限と取得
    • app_mentions:read
    • アプリの管理ページ -> 左メニュー「Install App」
  • Socket モードの有効化
    • アプリの管理ページ -> 左メニュー「Socket Mode」
  • App Level トークの取得
    • アプリの管理ページ -> 左メニュー「Basic Information」

Event Subscriptions の設定

左メニューの「Event Subscriptions」から使用するイベントを設定します
今回は特定のメッセージに反応するようにしたいので「message.channels」を追加します

インストール

  • pipenv install slack_bolt

サンプルコード

from typing import Callable

from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

# こっちは Bot トークンを設定
app = App(token="xoxb-xxxxxxxxx")


# メッセージへの反応
# Hello に対して Hi there を返す
@app.message("Hello")
def say_hello(message: dict, say: Callable):
    user = message["user"]
    say(f"Hi there, <@{user}>!")


if __name__ == "__main__":
    # Socket モードをスタートする
    SocketModeHandler(
        app,
        # こっちは App Level トークンを設定
        "xapp-xxxxxxxxx",
    ).start()

動作確認

  • pipenv run python app.py

で起動しましょう
アプリはチャネルに招待しておいてください

そしてメッセージで「Hello」と送信するとアプリが反応してメッセージが返ってくることが確認できると思います

最後に

Slack の Socket Mode を試してみました
最近作成したアプリでは RTM API が使えないので Socket Mode に慣れておくと良いかなと思います

RTM に似たような感じで特定のイベントに反応して返信するという動きができます
またプレーンテキストだけではなくボタンなどを含んだインタラクティブコンポーネントを送信することもできるようです

参考サイト

2024年4月5日金曜日

Python で Slack API をコールする

Python で Slack API をコールする

概要

python-slack-sdkを使ってチャネルにメッセージをポストする方法を紹介します

環境

  • macOS 11.7.10
  • Python 3.11.6
    • slack_sdk 3.27.1
  • Slack 2024/04/05 時点の画面

Slack アプリの作成

https://api.slack.com/tutorials/tracks/getting-a-token このあたりから作成すると良いです
アプリをワークスペースにも追加しましょう

Bot トークン

Slack にはトークンの種類がいくつかあり今回は Bot トークンを使います

アプリの左メニューから「Install App」を選択し「Bot User OAuth Token」を使います

URL で言うと https://api.slack.com/apps/xxxxxxx/install-on-team? という形式になります

インストール

  • pipenv install slack_sdk

サンプルコード

先ほど取得した Bot トークンを使用します
サンプルコードは指定したチャネルにメッセージをポストするサンプルで Github にあるサンプルスクリプトをそのまま利用します

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token="xoxb-xxxxxxxxxxxxxxxxx")

try:
    response = client.chat_postMessage(channel='#private', text="Hello world!")
    assert response["message"]["text"] == "Hello world!"
except SlackApiError as e:
    # You will get a SlackApiError if "ok" is False
    assert e.response["ok"] is False
    assert e.response["error"]  # str like 'invalid_auth', 'channel_not_found'
    print(f"Got an error: {e.response['error']}")
    # Also receive a corresponding status_code
    assert isinstance(e.response.status_code, int)
    print(f"Received a response status_code: {e.response.status_code}")

チャネルの内容を取得する

ついでにチャネルに流れるメッセージを取得するスクリプトも動かしてみました
トークンは先ほど取得した Bot トークンを使用します

直近100件のメッセージを取得します

ちなみに RTM API は非推奨になっています (参考)
なので今回は conversations.history を使っています

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token="xoxb-xxxxxxxxxxxxxxxxx")

conversation_history = []
channel_id = "C0123456789"

try:
    result = client.conversations_history(channel=channel_id)
    conversation_history = result["messages"]
    print("{} messages found in {}".format(len(conversation_history), channel_id))
    for msg in conversation_history:
        print(msg["text"])

except SlackApiError as e:
    print("Error creating conversation: {}".format(e))

channel_id はアプリでチャネル名を右クリックし Copy link で取得できます
またボットがチャネルに参加していないと会話は取得できないのでボットを招待してあげましょう (すでにメッセージを送信しているとチャネルに参加しているように見えますがまだいないのでちゃんと /invite してあげましょう)

最後に

Python で Slack のAPI をコールする方法を紹介しました
Slack には 3 つのトークン (User トークン、Bot トークン、アプリレベルトークン) があり今回のようにスクリプトベースの場合には Bot トークンを使います

RTM API が非推奨になり Socket API を変わりに使うようになったようなので機会があれば試してみたいです

参考サイト

2022年6月10日金曜日

Gitlab の issue のメッセージを slack に通知すると attachments になるので注意

Gitlab の issue のメッセージを slack に通知すると attachments になるので注意

環境

過去に Slack + Ruby でメッセージを補足する方法を紹介しました
Incomming を使って Gitlab からの issue のコメントメッセージを補足したい場合は attachments を使います

環境

  • macOS 11.6.6
  • Ruby 3.1.1p18
    • slack-ruby-client 1.0.0

サンプルコード

slack.client.on :message do |data|
  if data.has_key?('attachments') && data['attachments'].first['text']
    puts "Message from gitlab"
  end
end
slack.client.start!

2022年4月11日月曜日

rewrite_tag_filter を使って特定のログを Slack に通知する方法

rewrite_tag_filter を使って特定のログを Slack に通知する方法

概要

前回 fluentd-plugin-slack を使って fleuntd に来たログを slack に通知する方法を紹介しました
今回は特定の文字列を含むログだけを slack に通知する方法を紹介します

grep ではなく rewrite_tag_filter プラグインを使います

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • fluentd 1.3.2

Dockerfile

  • vim Dockerfile
FROM fluent/fluentd

RUN apk add --update --virtual .build-deps sudo build-base ruby-dev \
 && sudo gem install fluent-plugin-slack fluent-plugin-rewrite-tag-filter \
 && sudo gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /var/cache/apk/* /home/fluent/.gem/ruby/2.5.0/cache/*.gem

イメージ作成

  • docker build -t my_fluentd .

fleunt.conf 作成

  • vim fluent.conf
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match docker.**>
  @type copy
  <store>
    @type stdout
  </store>
  <store>
    @type rewrite_tag_filter
    <rule>
      key log
      pattern /notify slack/
      tag slack.${tag}
    </rule>
  </store>
</match>

<match slack.**>
  @type slack
  webhook_url https://hooks.slack.com/services/xxx/xxx/xxxxxx
  channel private
  username test
  message_keys log
  icon_emoji :ghost:
  flush_interval 60s
</match>

今回は log キー内に「notify slack」という文字列を含むログだけを slack に通知します

fluentd コンテナ起動

  • docker run -d -p 24224:24224 -p 24224:24224/udp -v $(pwd):/fluentd/etc -e FLUENTD_CONF=fluent.conf --name my_fluentd my_fluentd

動作確認

  • docker run --rm --log-driver=fluentd --log-opt fluentd-address=192.168.100.1:24224 --log-opt tag="docker.{{.Name}}" alpine /bin/sh -c "echo notify slack"

最後に

filter プラグインの grep を使ってもできると思います

参考サイト

2022年4月8日金曜日

docker で簡単に fluentd-plugin-slack を試す

docker で簡単に fluentd-plugin-slack を試す

概要

fluentd-plugin-slack は fluentd に来たログを slack に投げることができます
今回は docker で試してみました

環境

  • Ubuntu 18.04
  • docker 20.10.7

Dockerfile

  • vim Dockerfile
FROM fluent/fluentd

RUN apk add --update --virtual .build-deps sudo build-base ruby-dev \
 && sudo gem install fluent-plugin-slack \
 && sudo gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /var/cache/apk/* /home/fluent/.gem/ruby/2.5.0/cache/*.gem

イメージ作成

  • docker build -t my_fluentd .

fleunt.conf 作成

  • vim fluent.conf
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match docker.**>
  @type copy
  <store>
    @type stdout
  </store>
  <store>
    @type slack
    webhook_url https://hooks.slack.com/services/xxx/xxx/xxxxxx
    channel private
    username test
    message_keys log
    icon_emoji :ghost:
    flush_interval 60s
  </store>
</match>

message_keys で fluentd に流れてきた JSON ログのキーを指定することでその値を Slack のメッセージとして流すことができます

fluentd コンテナ起動

  • docker run -d -p 24224:24224 -p 24224:24224/udp -v $(pwd):/fluentd/etc -e FLUENTD_CONF=fluent.conf --name my_fluentd my_fluentd

動作確認

  • docker run --rm --log-driver=fluentd --log-opt fluentd-address=192.168.100.1:24224 --log-opt tag="docker.{{.Name}}" alpine /bin/sh -c "date"

今回は flush_interval 60s なので 1 分ごとにまとめて通知されます

特定のログだけ通知するには

grep プラグインと組み合わせます
こちらは次回紹介します

参考サイト

2020年5月20日水曜日

Slack のメッセージをすべて削除する方法

概要

Slack の general チャネルにあるメッセージをすべて削除する方法を紹介します
今回紹介する方法は slack-cleaner というツールを使います

環境

  • Python 3.7.3
    • pip 20.0.2
  • slack-cleaner 0.7.3

slack-cleaner のインストール

  • pip3 install slack-cleaner

slack-cleaner コマンドが実行できない場合は再ログインするか新たにターミナルを開いてください

削除実行

  • slack-cleaner --token <TOKEN> --message --channel general --user "*"

でドライランで削除するメッセージの数と内容を確認します
--perform を付与することで実際に削除します
大量にメッセージがある場合は削除に多少時間がかかるので待ちましょう

  • slack-cleaner --token <TOKEN> --message --channel general --user "*" --perform

ボットや Incomming Web hook からのメッセージを削除する方法

--bot を指定します

  • slack-cleaner --token <TOKEN> --message --channel general --bot "*" --perform

TOKEN の取得方法

今回はレガシートークンを使用しました
https://api.slack.com/legacy/custom-integrations/legacy-tokens

本来であれば OAuth2 アプリを作成してトークンを取得してから実行する必要があります

2017年10月10日火曜日

MailClark 使ってみた

概要

前回 Slack の無料プランで slackbot を使ってメールの通知を受け取る方法を紹介しました
直接コメントがあったのですが MailClark という便利なアプリがあるとのことなので使ってみました

環境

  • macOS X 10.12.6
  • Slack App 2.8.0

MailClark アプリの追加

まずアプリを追加します
https://mailclark.ai/ にアクセスして「Add to Slack」を選択します
mailclark0.png

するとチームに対してアプリを追加する画面になるのでアプリに与える権限を確認して「Authorize」を選択します
mailclark1.png

すると Slack App 側に MailClark アプリから追加されたよという通知が来ます
mailclark2.png

とりあえずこれでアプリの追加は完了です

メールアドレスを取得する

次に MailClark 専用の転送アドレスを取得します
先ほどの画面でプルダウンにはチャネルが選択できるようになっています
まず、MailClark アプリを追加したいチャネルを選択しましょう (今回は #general を選択しました)

するとチャネル側に MailClark が追加されたよという通知が届きます
mailclark3.png

そして「Email」「Twitter」「Facebook」と並んでいるボタンから「Email」を選択しましょう
すると「general@team-kaka.mailclark.ai」というアドレスが払い出されます
このメールアドレスのフォーマットは「チャネル名@チーム名.mailclark.ai」になります

動作確認

そのまま「Receive a test email」を選択してみましょう
先ほど発行されたアドレスにテストメールが送信されチャネルにもメールの通知が届くと思います
mailclark4.png

ちなみに払い出されたアドレスに対して Gmail から送信してみたところ問題なく通知が届きました
mailclark5.png

最後に

Slack でメール通知を受け取れる MailClark を使ってみました

そのまま Slack App 上で返信することもでき「Reply」を選択すると対話形式でメールの返信を行うことができます
無料でここまで使えるのはかなり便利かなと思います

Incomming Web Hook などとは違い Integration ではなくアプリになります
権限などを与える必要がありますがそこまで気にならないと思います

2017年10月3日火曜日

Slack の無料プランでメールを Slack に転送する方法

概要

Slack にはメールアプリがありこれを使うと好きなチャネルにメールを転送することができるようになります
ただ、このアプリは有料プランでないと使えません
とりあえず自分にだけメールを転送したいのであれば「Bring Email into Slack」という機能がありこれを使えば slackbot さんから通知を受け取ることができます

環境

  • Windows 7 Enterprise
  • Slack App 2.8.1

転送用のメールアドレスを取得する

今回は Web 上ではなく Slack のクライアントアプリから取得します
左上のメニューから「Preferences」を選択します
email_into_slack1.jpg

表示されたメニューの中に「Messages & Media」という項目があるので選択します
画面の一番下に「Bring Email into Slack」の項目があるので移動します
email_into_slack2.jpg

そして「Get a Forwarding Address」をクリックすると転送用のアドレスが取得できます
email_into_slack3.jpg

動作確認

あとは取得できたメールアドレスにメールを送信してみましょう
すると以下のように slackbot さんから通知を受け取ることができると思います
email_into_slack4.jpg

最後に

無料プランの Slack でメールを自分に転送する方法を紹介しました
チャネルに通知ではなく個別に通知されるので逆に良いという場合もあるかもしれません

参考サイト

2017年2月11日土曜日

Slack と Gitlab を連携してみた

概要

Slack の Incoming WebHook の機能を使って Gitlab にコミットやコメント情報を通知する方法を紹介します

環境

  • Slack 2016/06/27 時点
  • Gitlab Community Edition 8.8.5

Incomming WebHooks の作成

https://slack.com/apps/manage/custom-integrations から「Incoming WebHooks」を作成します
作成の仕方の詳細はこちらを参照

作成できたら Webhook URL をメモしておきます

Gitlab へ Service の登録

Gitlab 側に取得した Webhook URL を設定します
設定はリポジトリ単位で行います

まず、リポジトリの Settings を開きます
slack_with_gitlab_select_settings.png

Settings を開いたら次に Services を開きます
slack_with_gitlab_select_services.png

連携できるサービス一覧の中に Slack があるので選択します
おそらく一番下にあります
slack_with_gitlab_select_slack.png

Active にチェックを入れ「Webhook」の欄に先ほど取得した Webhook URL を入力します
「Username」と「Channel」には Slack に表示するボットの名前と通知する Slack のチャネルを入力してください
slack_with_gitlab_input_webhook_info.png

問題なく入力できたら Save changes で設定を保存します

動作確認

Gitlab 側のリポジトリにコミットしたり issue にコメントしたりしてみましょう
その内容が Slack に通知されると思います

最後に

紹介は以上です
Slack + Gitlab の通知連携は結構簡単でした

Slack と HackerNews を連携してみた

概要

slack-hn という Hubot アプリがあったのでこれを使って Slack と HackerNews を連携してみたいと思います

環境

  • Slack 2016/06/27 時点
  • CentOS 6.7 64bit
  • heroku-toolbelt 3.43.4

事前に必要なアカウント

  • Slack
  • Heroku

また Slack のドメインは適当に「test」というドメインを使って話を進めます
チャネル名は「#test_channel」とします

対象のチャネルを作成する

すでに対象のチャネルがある場合は新規に作成する必要はありません
今回は HackerNews を流す専用のチャネル (#test_chnnel) を作成したとして話を進めます

Incoming WebHooks の作成

まずは Incoming WebHooks を作成します
Incoming WebHooks は簡単に言ってしまえば Slack に通知するための機能です

https://test.slack.com/apps/manage にアクセスします
このページ内の「Custom Integrations」を選択します
すると「Incoming WebHooks」という欄があるのでこれを選択します
slack_with_hn_select_iw.png

選択するとこれまでに作成された Incoming WebHooks のリストが表示されると思います
今回は新規で作成するので「Add Configuration」を選択します
slack_with_hn_select_adding_iw.png

すると Incomming WebHooks を作成する画面になります
「Post to Channel」で HackerNews を流す対象のチャネルを選択します
選択したら「Add Incoming WebHooks integration」をクリックして Incoming WebHook を作成します
slack_with_hn_input_channel.png

作成が完了すると設定画面に移行します
ここで大事なのは「Webhook URL」をコピーしておくことです
slack_with_hn_copy_webhook_url.png

あとは「Customize Name」「Customize Icon」等を適宜変更すれば OK です
設定できたら「Save Settings」をクリックして設定を完了しましょう

Slash Commnds の作成

次に Slash Commands を作成します
Incoming WebHooks の時と同様に https://test.slack.com/apps/manage にアクセスします
このページ内の「Slash Commands」を選択します
slack_with_hn_select_sc.png

たぶんこれまで作成された Slash Commands がリストで表示されると思います
今回は新規で作成するので「Add Configuration」を選択します
slack_with_hn_select_adding_sc.png

すると Slash Commands を作成する画面になります
Choose a Command に「/hn」と入力し Add Slash Command Integration で Slash Command を作成しましょう
すると設定画面に移動するので Integration Settings で以下の部分を設定してください
slack_with_hn_input_sc_info.png

URL に入力した http://test-slack-hn.herokuapp.com/hn の部分はあとで Heroku にアプリをデプロイする URL になります

あとは「Customize Name」「Customize Icon」「Show this command in the autocomplete list」あたりを適当に変更しましょう
Save Integration をクリックし Slash Command の作成を完了してください

Heroku へのアプリデプロイ

先ほど作成した Slash Command に設定した URL にデプロイする Heroku アプリを作成します
基本的にはすでにあるアプリを自分の Heroku アカウントにデプロイして完了です

https://github.com/karan/slack-hn の下の方にある「Deploy to Heroku」をクリックします
slack_with_hn_deploy_app.png

すると自分の Heroku アカウント配下に slack-hn というアプリをデプロイすることができます
( あらかじめブラウザで Heroku にログインしておくといいと思います )

アプリの設定画面に移動するので「App Name」と「Runtime Selection」を設定すれば OK です
設定したら「Deploy for free」をクリックしてデプロイします
slack_with_hn_configuration_app.png
App Name は Heroku の世界でユニークなので被ってしまう可能性があります
被ってしまった場合は適宜変更し、設定済みの Slash Command の URL の部分も変更してください

問題なくデプロイできれば完了です
slack_with_hn_completed_deploy.png

あとはデプロイしたアプリに Incoming WebHook 時に取得した URL をアプリに設定してあげます
ターミナルで heroku-toolbelt を使って以下のコマンドを実行します

heroku config:set SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxx" --app  test-slack-hn

事前に heroku login でログインしておくといいと思います
これで WebHook 用の URL をアプリに設定することができました

動作確認

実際に動作するか確認してみましょう
対象のチャネルに移動してコメント欄に「/hn」と入力してみると HackerNews の一覧が表示されると思います
slack_with_hn_result.png

最後に

如何でしたでしょうか
Incoming WebHook と Slash Command という Slack のアプリを組み合わせて HackerNews の情報を取得してみました
基本的に Incoming WebHook を使った通知系はこれの応用なので、覚えておいて損はないと思います

あとはこういったニュース系のやつは cron を使って定期的に通知したいという要望があると思うので cron に対応してもいいかなと思います

その辺もおいおい紹介できればなと思います

Tips

Incoming WebHooks も Slash Commands も該当の URL (https://test.slack.com/apps/manage) にまだ存在しない場合は https://test.slack.com/apps/ から「Slash Commands」で検索して、そこから「Add Configuration」を実行すれば OK です
slack_with_hn_search_slash_commands.png

参考サイト