Laravel로 만드는 Slack Bot (1) - slack app 만들기 및 초기설정

 

Laravel로 만드는 Slack Bot (1) - slack app 만들기 및 초기설정

  • 요즘 현업에서 많이 사용하는 slack.
  • slack 봇을 라라벨을 이용하여 구현합니다.

 

Slack App toekn DB화를 위한 모델 및 마이그레이션 파일 생성

  • Slack은 보편적으로 다른 API Client처럼 key값을 1개만 쓰기는 아깝습니다.
  • 이유인 즉슨, slack은 앱을 많이 다루고, 앱 속에서도 채널들을 많이 다루기 때문입니다.
  • 때문에 앱 및 채널에 대한 토큰값들을 DB화 시키고, DB의 key value를 통해서 상황에 맞는 채널로 송신하게 구현합니다.
  • setting 모델 및 migration 파일 생성하기
$ php artisan make:model Setting -m  // -m 옵션으로 마이그레이션 파일까지 생성

Model created successfully.
Created Migration: 2022_03_02_060929_create_settings_table

  • /database/migrations/create_settings_table.php 에서 settings 테이블 설계하기
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateSettingsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('settings', function (Blueprint $table) {
            $table->id();
            $table->string('key')->index();
            $table->text('value');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('settings');
    }
}
  • php artisan migrate로 settings table 생성하기
$ php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (19.96ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (12.80ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (13.53ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (19.44ms)
Migrating: 2022_03_02_060929_create_settings_table
Migrated:  2022_03_02_060929_create_settings_table (16.24ms)

 

api.slack.com에 접속하여 app생성 및 Token발급

 

Slack API

Slack APIs allow you to integrate complex services with Slack to go beyond the integrations we provide out of the box.

api.slack.com

  • 본인은 Test라는 App을 만들었습니다.
  • 만든 앱 화면에 들어가면 아래 사진처럼 App Credentials에 ClientID와 secret Key 등이 나옵니다.

  • 좌측 Features > OAuth & Permissions 탭으로 들어가서 Scopes를 설정합니다.
  • 봇은 채팅을 쓰기만 하면 됨으로 OAuth Scopte를 chat:write로 설정합니다.

  • Scopes 설정을 끝냈다면, 바로 위의 OAuth Tokens For Your Workspace로 돌아가서
  • Install to Workspace를 클릭한다.
  • 본인이 설정한 scopes 권한에 따라 만들어진 OAuth Access Token을 받을 수 있는데
  • 이를 활용하여 해당 Woarkspace(나의경우 Test App)와 slack bot을 사용한 메세지 전송이 가능해 진다.

  • 본인이 설정한 스코프 권한(본인의 경우 메세지 보내기)을 확인한 후 허용을 누르면 Bot user OAuth Token이 발급된다.

  • Bou User OAuth Token값을 잘 적어둡니다.

 

Workspace에 접속하여 채널 만들기

  • 본인은 3개의 채널을 만들었습니다.
  • channel1,channel2,channel3을 만들었고, 만드는 방법은 사진의 [채널 추가] 버튼을 통하여 만들었습니다.

  • 각 채널들 우클릭 > 채널 세부정보 열기 를 클릭하면 채널별 ID값을 알 수 있는데, 이 또한 잘 메모하여 둡니다.

  • 본인은 3개의 채널을 만들었으니 채널 ID 3개를 메모해 둡니다.

 

OAuth Token 및 Channel ID값 Json형태로 settings Table에 insert

  • 본인은 bots(workspace)와 channels(각 채널)을 아래의 Json형태로 만들었습니다.

{
    "bots": {"test": {"token": "xoxb-Yourcode"}},
    "channels": {
    "channel1": {"bot": "test","token": "YourChannelId"},
    "channel2": {"bot": "test","token": "YourChannelId"},
    "channel3": {"bot": "test","token": "YourChannelId"}
    }
}
  • 위 Json 형식을 가지고 tinker를 사용하여 key = slack, value = json 지정하여 삽입합니다.
$ php artisan tinker
Psy Shell v0.11.2 (PHP 8.0.16 — cli) by Justin Hileman
>>> App\Models\Setting::create([
'key'=>'salck',
'value'=>'{     "bots": {         "test": {             "token": "xoxb-3057450638550-3175622184597-VIEacdHH7QWtCczNy5ygx2Vv"         }     },     "channels": {         "channel1": {             "bot": "test",             "token": "C031W3BFSNN"         },         "channel2": {             "bot": "test",             "token": "C034TRH9F71"         },         "channel3": {             "bot": "test",             "token": "C0351PVSFC6"         }   } }']);
=> App\Models\Setting {#3520
     key: "salck",
     value: "{     "bots": {         "test": {             "token": "xoxb-3057450638550-3175622184597-VIEacdHH7QWtCczNy5ygx2Vv"         }     },     "channels": {         "channel1": {             "bot": "test",             "token": "C031W3BFSNN"         },         "channel2": {             "bot": "test",             "token": "C034TRH9F71"         },         "channel3": {             "bot": "test",             "token": "C0351PVSFC6"         }   } }",
     updated_at: "2022-03-02 07:14:48",
     created_at: "2022-03-02 07:14:48",
     id: 1,
   }

DB에 데이터가 잘 들어가 있는지 확인

 

 

마무리

  • slack 초기설정 하는데 시간이 많이 걸리는건 포스팅과 함께 적용하느라 그런 것 일까...?