레이블이 slack인 게시물을 표시합니다. 모든 게시물 표시
레이블이 slack인 게시물을 표시합니다. 모든 게시물 표시

2020년 5월 17일 일요일

Slack bot 만들기 (using RTM)


지난 포스트에서 Slack bot을 classic 앱설정하는 방법과 post 하는 방법에 대해서 알아 보았습니다.

아래 예제가 동작이 안되면 bot 설정을 꼭 확인하시기 바랍니다.


이전 예제는 특정 채널에 메세지를 보내는 동작이었습니다. 이번에는 내용을 모니터링 하고 있다가 들어오는 내용에 답변을 하는 동작입니다. 이것을 구현하기 위해서는 모니터링을 계속 해야만 합니다. 이때 사용하는 기능이 RTM(Real time messaging)기능 입니다.
이전 예제에서는 봇이 어떤방에 속해있지 않더라도 채널명만 알면 보낼 수 있었습니다. 그러나 내용을 읽는것은 workspace내에 bot을 add 해주어야 합니다.


봇 만들기

첫번째로 봇 부터 만들어 보겠습니다.

아래 예제를 따라하면 되는데 주의할점 있습니다.
https://www.fullstackpython.com/blog/build-first-slack-bot-python.html

Slack client 버전이 변경되어서 꼭 해당 버전을 설치해야 합니다.
pip install slackclient==1.3.2

전체 소스

import os
import time
import re
from slackclient import SlackClient


# instantiate Slack client
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
# starterbot's user ID in Slack: value is assigned after the bot starts up
starterbot_id = None

# constants
RTM_READ_DELAY = 1 # 1 second delay between reading from RTM
EXAMPLE_COMMAND = "do"
MENTION_REGEX = "^<@(|[WU].+?)>(.*)"

def parse_bot_commands(slack_events):
    """
        Parses a list of events coming from the Slack RTM API to find bot commands.
        If a bot command is found, this function returns a tuple of command and channel.
        If its not found, then this function returns None, None.
    """
    for event in slack_events:
        print("event['type'],event['text']:",event.get("type"),event.get("text"))
        if event["type"] == "message" and not "subtype" in event:
            user_id, message = parse_direct_mention(event["text"])
            if user_id == starterbot_id:
                return message, event["channel"]
    return None, None

def parse_direct_mention(message_text):
    """
        Finds a direct mention (a mention that is at the beginning) in message text
        and returns the user ID which was mentioned. If there is no direct mention, returns None
    """
    matches = re.search(MENTION_REGEX, message_text)
    # the first group contains the username, the second group contains the remaining message
    return (matches.group(1), matches.group(2).strip()) if matches else (None, None)

def handle_command(command, channel):
    """
        Executes bot command if the command is known
    """
    # Default response is help text for the user
    default_response = "Not sure what you mean. Try *{}*.".format(EXAMPLE_COMMAND)

    # Finds and executes the given command, filling in response
    response = None
    # This is where you start to implement more commands!
    if command.startswith(EXAMPLE_COMMAND):
        response = "Sure...write some more code then I can do that!"

    # Sends the response back to the channel
    slack_client.api_call(
        "chat.postMessage",
        channel=channel,
        text=response or default_response
    )

if __name__ == "__main__":
    if slack_client.rtm_connect(with_team_state=False):
        print("Starter Bot connected and running!")
        # Read bot's user ID by calling Web API method `auth.test`
        starterbot_id = slack_client.api_call("auth.test")["user_id"]
        print("starterbot_id:",starterbot_id)
        while True:
            command, channel = parse_bot_commands(slack_client.rtm_read())
            if command:
                handle_command(command, channel)
            time.sleep(RTM_READ_DELAY)
    else:
        print("Connection failed. Exception traceback printed above.")
공유 소스 대비 로그를 추가하였습니다.
자세히 보시면 속해있는 방의 모든 내용을 받을 수 있습니다.

실행시 token을 아래와 같이 bat 파일에 설정합니다.
run.bat 파일 내용
set SLACK_BOT_TOKEN=xoxb-xxxxx
python slack_client.py

동작 화면

C:\Users\USER\Documents\slack>python slack_client.py
Starter Bot connected and running!
starterbot_id: U013R483Q1F
event['type'],event['text']: hello None
event['type'],event['text']: user_typing None
event['type'],event['text']: message do
event['type'],event['text']: desktop_notification None
event['type'],event['text']: user_typing None
event['type'],event['text']: message do try
event['type'],event['text']: desktop_notification None
event['type'],event['text']: user_typing None
event['type'],event['text']: message ddd
event['type'],event['text']: user_typing None
event['type'],event['text']: message d
event['type'],event['text']: desktop_notification None
event['type'],event['text']: user_typing None
event['type'],event['text']: message a
event['type'],event['text']: desktop_notification None
event['type'],event['text']: desktop_notification None
event['type'],event['text']: user_typing None
event['type'],event['text']: user_typing None
event['type'],event['text']: message <@U013R483Q1F> do it
event['type'],event['text']: message Sure...write some more code then I can do that!
event['type'],event['text']: desktop_notification None
event['type'],event['text']: user_typing None
event['type'],event['text']: message <@U013R483Q1F> hello
event['type'],event['text']: desktop_notification None
event['type'],event['text']: message Not sure what you mean. Try *do*


사용하기전에 채널에 bot을 Add해줍니다.



테스트 하기 위해서는 @봇이름 do 내용 이렇게 보내야 봇이 동작합니다.















2020년 5월 10일 일요일

Slack bot 만들기 (classic 앱 만들기, post message) in python


간단한 slack bot 을 만들도록 하겠습니다.
slackbot 관련 해서 검색해보면 소스는 많지만 뭔가 동작이 안되는 것도 많은것 같고 자료가 예전것이라 동작이 안되는 부분도 많습니다.

시작 하기전 

slack bot - slack app에 대한 개념을 알고 시작하는것이 좋습니다. 
slack에서는 slack app이라는 것이 있으며 그중에 bot을 지원 하는 개념입니다. 또한 수신을 하기 위해서 검색 해보면 RTM이라는것이 있습니다. RTM real time message로서 최근 slack app에서는 지원하지 않습니다. 구글링에 많은 예제들이 RTM기반으로 되어 있습니다. 그렇기 때문에 app을 만들때 classic app으로 생성을 해줘야 합니다.  classic app을 만들었다고 하더라도 아무 버튼을 막 누르다 보면 다시 일반앱으로 업그레이드 되는 경우가 있고 한번 업그레이드가 되면 다시 돌릴 수가 없습니다. 따라서 상세 내용을 읽어보고 업그레이드 하시기 바랍니다.

Goal

특정 채널에 bot이 내용을 출력하는것이 이번 시간 목표입니다. 따라서 RTM을 사용하지 않지만 다음을 위해서 Classic type의 앱을 만들도록 합니다.


Classic 앱 만들기

(Classic 뜨는지 보고 생성할것)



Settings > Basic Information > Bots



Features > App Home > First, add a legacy bot user > Add Legacy Bot User
여기에서는 아래와 같이 추가하였습니다.
Display Name (Bot Name): Tester
Default Name: tester


Settings > Install App > Install App to Workspace
하고 나면 아래와 같은 화면이 나옵니다.

이중에 Bot User OAuth Access Token을 사용할 예정으로 복사해둡니다. (bot 토큰은 xoxb-XXXX 형태로 시작합니다.)
지금까지 Slack Bot은 준비되었습니다.


Bot Program

Python에서 Slacker 를 이용할 예정입니다.
설치는 pip install slacker 입니다.

C:\Users\USER\AppData\Local\Programs\Python\Python37\Scripts>pip install slacker
Collecting slacker
  Downloading slacker-0.14.0.tar.gz (10 kB)
Requirement already satisfied: requests>=2.2.1 in c:\users\user\appdata\local\programs\python\python37\lib\site-packages (from slacker) (2.22.0)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\users\user\appdata\local\programs\python\python37\lib\site-packages (from requests>=2.2.1->slacker) (3.0.4)
Requirement already satisfied: idna<2.9,>=2.5 in c:\users\user\appdata\local\programs\python\python37\lib\site-packages (from requests>=2.2.1->slacker) (2.8)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\user\appdata\local\programs\python\python37\lib\site-packages (from requests>=2.2.1->slacker) (2019.6.16)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\users\user\appdata\local\programs\python\python37\lib\site-packages (from requests>=2.2.1->slacker) (1.25.3)
Installing collected packages: slacker
    Running setup.py install for slacker ... done
Successfully installed slacker-0.14.0
WARNING: You are using pip version 20.0.2; however, version 20.1 is available.
You should consider upgrading via the 'c:\users\user\appdata\local\programs\python\python37\python.exe -m pip install --upgrade pip' command.


작성한 소스 코드

from slacker import Slacker

slack = Slacker('xoxb-XXXXXXX')

# Send a message to #general channel
slack.chat.post_message('#general', 'Hello fellow slackers!')

실행 화면

위 소스는 #general 채널에 문구를 출력하는 소스로 #general 의 경우 기본으로 속해있는 채널입니다.

다음에는 슬랙에서 오는 문구에 따른 동작을 하기 위한 RTM 메세지 처리하는 부분을 진행하도록 하겠습니다.





2020년 5월 3일 일요일

slack 가입하기


Slack app을 개발해보기 위해서 일단 가입하는 절차를 정리하였습니다. 생각보다 어렵지는 않습니다.

0. 준비물
이메일, 브라우저( IE 구버전은 안됩니다. )

1. 접속
존재하는 slack workspace가 없다면  workspace만들어야 합니다.
https://slack.com/create#email


2. 이메일 입력



3. 이메일 확인 및 컨펌

4. 회사나 팀 이름 설정



5. 하는 일에 대해서 설명


6. Ok, skip for now


7. See your Channel in Slack


8. 완료 - 우측 하단 Finsish setup


9. 이름과 비번 입력 ( 로그인 할때 비번 사용하므로 잘 기억 필요함 )

10. 팀과 Slack URL 다시 확인

11. 초대 큰 의미 없음 - Finish


12. 로그인시
slack workspace를 알아야 로그인이 가능합니다. 모른다면 이메일 검색해야 합니다.
로그인시는 처음 create할때 사용한 이메일과 9번에서 입력한 비번을 입력해 줍니다.