Python/2.7 for fun.

점심추천 slackbot 만들기.

qkqhxla1 2017. 3. 20. 20:56

https://www.fullstackpython.com/blog/build-first-slack-bot-python.html 에 전반적인 설명이 


아주 잘 나와 있다. (위에 사이트 보고 한거 그대로 정리함.) 첫번째로 슬랙에 가입을 하고 로그인을 한 후 


https://api.slack.com/bot-users 페이지에서 Creating a new bot user 을 눌러 새 봇을 만든다. 


이름을 아무거나 입력하고 add bot integration을 누르면 사진처럼 토큰이 주어진다.

그리고 봇이 가지길 원하는 이름을 입력하고 사진 등을 업로드해서 본인의 봇을 세팅한다.


다 세팅했으면 save integration을 눌러서 저장하자. 그리고 환경변수로 봇의 api키값을 등록해놓는다.

export SLACK_BOT_TOKEN='your slack token pasted here' 또는 맥에서 launchctl setenv SLACK_BOT_TOKEN 'your slack token pasted here'

으로 등록한다. 그리고 아래 스크립트를 실행시켜서 본인 봇의 id 값을 가져온다.

# -*- coding: utf-8 -*-

import os from slackclient import SlackClient BOT_NAME = 본인이 설정한 봇 이름 slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN')) #환경변수가 잘 설정되어있는지 확인 if __name__ == "__main__": api_call = slack_client.api_call("users.list") if api_call.get('ok'): # retrieve all users so we can find our bot users = api_call.get('members') for user in users: if 'name' in user and user.get('name') == BOT_NAME: print("Bot ID for '" + user['name'] + "' is " + user.get('id')) else: print("could not find bot user with the name " + BOT_NAME)

봇 아이디가 잘 출력되면 정상이다.


이후 다시 환경변수에 봇 id를 등록하자.

export BOT_ID='bot id returned by script' 또는 맥에서 launchctl setenv BOT_ID='bot id returned by script'

이후 스크립트에서 사용하면 된다. 채널등에서 봇을 초대한다.(아까 슬랙에 로그인한 계정의 그룹에서 


된다.) @이름으로 초대한다.

이후 메시지를 보내게 하면 된다. 아래 스크립트는 단순히 봇이 나에게 메시지를 보내는 스크립트이고, 


명령을 받고 해당 명령에 따라 행동하는 봇은 제일 위에 올린 링크에 있는 글을 따라하면 된다.

import os
import time
from slackclient import SlackClient
import random

def handle_command(channel):
    response = u'오늘의 점심은 %s을(를) 추천드립니다.' %lunchlist[random.randint(0,len(lunchlist)-1)]
    slack_client.api_call("chat.postMessage", channel=channel,
                          text=response, as_user=True)

def parse_slack_output(slack_rtm_output):
    output_list = slack_rtm_output
    if output_list and len(output_list) > 0:
        for output in output_list:
            if output and 'text' in output and AT_BOT in output['text']:
                return output['text'].split(AT_BOT)[1].strip().lower(), \
                       output['channel']
    for output in output_list:
        if 'channel' in output:
            return None, output['channel']
    return None, None

BOT_ID = os.environ.get("BOT_ID")
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
lunchlist = [u'가',u'나',u'다',u'라',u'마',u'바']
AT_BOT = "<@" + BOT_ID + ">"

if __name__ == "__main__":
    READ_WEBSOCKET_DELAY = 1
    if slack_client.rtm_connect():
        print(u"봇 시작")
        while True:
            command, channel = parse_slack_output(slack_client.rtm_read()) #통신을 하면서
            print command, channel
            if channel: #채널값을 받아올수 있으면 해당 채널로 보내고싶은거 보낸다.
                handle_command(channel)
            time.sleep(READ_WEBSOCKET_DELAY)
    else:
        print("Connection failed. Invalid Slack token or bot ID?")

결과


점심추천을 하려면 시간대가 11시 30분쯤이 좋다. 이때에 매번 실행되도록 crontab에 등록하면 된다. 


이건 나중에 더.. 사람들이 선호하는 식당이 있으면 해당 식당 확률을 늘려준다거나, 어제갔던 식당은 


다시 안걸리도록 하는 등은 서버단에서 추가해주면 재미있을것 같다.



글 추가.

slacker란 걸로 슬랙메시지를 더 예쁘게 보낼 수 있다.


ex)

from slacker import Slacker

.....

sc = Slacker(token)  # 인자로 슬랙봇의 토큰을 줌.

username = 'monitor'

channel = '#channels'

icon_emoji = ':dart:'

....

attachement = {

            'pretext' : 'pretext',

            "fallback": "Status Monitor",

            "text": "<https://www.naver.com/|naver> naver!",

            "fields":[

                {

                    "value": "message body",

                    "short": False

                }

            ],

            "color": "good",

        }


sc.chat.post_message(channel=channel, text=None, username=username,

                                  attachments=[attachement], icon_emoji=icon_emoji, as_user=False)


대충 이런식으로 짜면 

이런식으로 나온다. 더 예쁘게 만들수도 있다. 


https://api.slack.com/slash-commands 를 더 참고하자.