😎App

참고자료 1: Python으둜 Slack App(Bot) λ§Œλ“€κΈ°

참고자료 2: [Slack] ChatGPT Slack 챗봇 λ§Œλ“€κΈ° (2편)

참고자료 3: Slack ChatGPT μ—°λ™ν•˜κΈ°

λ³Έ λ‚΄μš©μ€ Alexandre t'Kint의 글을 μ°Έκ³ ν•˜μ—¬ κ΅¬ν˜„ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€.

Step1: Slack에 app을 λ“±λ‘ν•˜κ³ , token μƒμ„±ν•˜κΈ°

Slack에 ChatGPTλ₯Ό μ—°λ™ν•˜κΈ° μœ„ν•΄μ„œ, μš°λ¦¬λŠ” Slack에 챗봇 app을 λ§Œλ“€κ³ , κ·Έ app에 ChatGPTλ₯Ό μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯을 λ„£μ–΄μ£Όκ² μŠ΅λ‹ˆλ‹€.

Bot κΈ°λŠ₯을 κ°€μ§€λŠ” app을 λ§Œλ“€ 것이기 λ•Œλ¬Έμ—, μš°λ¦¬λŠ” Slack Bot Tokenκ³Ό Slack App Token을 각각 μ–»μ–΄μ„œ 등둝해야 ν•©λ‹ˆλ‹€.

  1. Slack workspace에 λ‘œκ·ΈμΈλ‹€.

  2. Slack API website에 λ“€μ–΄κ°„λ‹€.

  3. 'Create an app'을 λˆŒλŸ¬μ„œ 'From scratch'λ₯Ό ν΄λ¦­ν•œλ‹€.

Create New App을 λˆŒλ €μ„ λ•Œ λ‚˜νƒ€λ‚˜λŠ” ν™”λ©΄.
  1. App 이름을 μ •ν•˜κ³ , μ„€μΉ˜ν•  Slack workspaceλ₯Ό μ„ νƒν•©λ‹ˆλ‹€. μ΄μ œλΆ€ν„° 챗봇에 ν•„μš”ν•œ 각쒅 섀정듀을 λ“±λ‘ν•œλ‹€.

  2. 'Basic information > Add features and functionalityμ—μ„œ, 'Permissions'λ₯Ό μ„ νƒν•΄μ„œ λ“€μ–΄κ°‘λ‹ˆλ‹€. 그리고 Scopes add in Bot Token Scopesμ—μ„œ app_mentions:read, channels: history, channels:read, chat:writeλ₯Ό 등둝해쀀닀.

  3. Settings > Socket Mode에 λ“€μ–΄κ°€μ„œ, socket modeλ₯Ό ν™œμ„±ν™”ν•œλ‹€.

Socket Mode ν™œμ„±ν™”
  1. Basic information > 'App-Level Tokens'μ—μ„œ 'Generate Token and Scopes'λ₯Ό ν΄λ¦­ν•΄μ„œ Token을 μƒμ„±ν•©λ‹ˆλ‹€. 그리고 μƒμ„±λœT Slack Bot App Token ('xapp'으둜 μ‹œμž‘ν•˜λŠ” λ¬Έμžμ—΄)을 λ³΅μ‚¬ν•œλ‹€.

App token을 μƒμ„±ν•˜κΈ°.
  1. Basic information > 'Add features and functionality' > 'Event Subscriptions'에 λ“€μ–΄κ°€μ„œ 이 κΈ°λŠ₯을 ν™œμ„±ν™”ν•˜κ³ , 'Subscribe to bot events'μ—μ„œλŠ” 'app_mention'을 μ„ νƒν•˜κ³  μ €μž₯ν•œλ‹€.

Event Subscriptions κΈ°λŠ₯ ν™œμ„±ν™”
  1. 'OAuth & Permissions'μ—μ„œ, Install to Workspaceλ₯Ό λˆŒλŸ¬μ„œ Slack에 App을 μ„€μΉ˜ν•œλ‹€.

  2. Slack Bot Token을 λ³΅μ‚¬ν•œλ‹€ ('xoxb'둜 μ‹œμž‘ν•˜λŠ” λ¬Έμžμ—΄)

Step2: OpenAI API key μƒμ„±ν•˜κΈ°

λ‹€μŒμœΌλ‘œ, ChatGPT APIλ₯Ό μ œκ³΅ν•˜λŠ” 'OpenAI'의 API keyλ₯Ό μƒμ„±ν•˜λŠ” 단계이닀.

  1. OpenAI API website에 μ ‘μ†ν•΄μ„œ νšŒμ›κ°€μž… ν›„, λ‘œκ·ΈμΈν•œλ‹€.

  2. API Key νƒ­μœΌλ‘œ λ“€μ–΄κ°€μ„œ 'Create new secret key'λ₯Ό λˆŒλŸ¬μ„œ μƒˆ API keyλ₯Ό λ§Œλ“ λ‹€.

OpenAI API key
  1. OpenAI API keyλ₯Ό λ³΅μ‚¬ν•œλ‹€.

Step3: ν•„μˆ˜ νŒ¨ν‚€μ§€ μ„€μΉ˜

λ‹€μŒμœΌλ‘œ, python으둜 slackκ³Ό openaiλ₯Ό app으둜 μ—°λ™ν•˜κΈ° μœ„ν•œ ν•„μˆ˜ νŒ¨ν‚€μ§€λ“€μ„ μ„€μΉ˜ν•œλ‹€. 특히 'Slack-Bolt' νŒ¨ν‚€μ§€λŠ” Slack app을 손 μ‰½κ²Œ λ§Œλ“€ 수 μžˆλŠ” ν•¨μˆ˜λ“€μ„ μ œκ³΅ν•œλ‹€. κ°€μƒν™˜κ²½μ„ λ§Œλ“€κ³ , μ•„λž˜μ˜ νŒ¨ν‚€μ§€λ“€μ„ μ„€μΉ˜ν•œλ‹€.

pip install openai
pip install slack-bolt
pip install slack_sdk

Step4: Application μ‹€ν–‰

μœ„μ—μ„œ μƒμ„±ν•œ token듀을 μ΄μš©ν•΄μ„œ app을 λ§Œλ“œλŠ” 과정이닀. Python scriptλ₯Ό μ•„λž˜μ™€ 같이 μž‘μ„±ν•œλ‹€.

SLACK_BOT_TOKEN = "μœ„μ—μ„œ 얻은 Slack Bot Token을 λ„£μœΌμ„Έμš”."
SLACK_APP_TOKEN = "μœ„μ—μ„œ 얻은 Slack App Token을 λ„£μœΌμ„Έμš”."
OPENAI_API_KEY  = "μœ„μ—μ„œ 얻은 OpenAI API Token을 λ„£μœΌμ„Έμš”."

import os
import openai
from slack_bolt.adapter.socket_mode import SocketModeHandler
from slack_sdk import WebClient
from slack_bolt import App

# Event API & Web API
app = App(token=SLACK_BOT_TOKEN) 
client = WebClient(SLACK_BOT_TOKEN)

# This gets activated when the bot is tagged in a channel    
@app.event("app_mention")
def handle_message_events(body, logger):
    # Log message
    print(str(body["event"]["text"]).split(">")[1])
    
    # Create prompt for ChatGPT
    prompt = str(body["event"]["text"]).split(">")[1]
    
    # Let thre user know that we are busy with the request 
    response = client.chat_postMessage(channel=body["event"]["channel"], 
                                       thread_ts=body["event"]["event_ts"],
                                       text=f"νšŒμƒ‰μ—¬μš°κ°€ μ—΄μ‹¬νžˆ μ°Ύμ•„λ³΄λŠ” μ€‘μž…λ‹ˆλ‹€. \n쑰금만 κΈ°λ‹€λ €μ£Όμ„Έμš”!")
    
    # Check ChatGPT
    openai.api_key = OPENAI_API_KEY
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.5).choices[0].text
    
    
    # Reply to thread 
    response = client.chat_postMessage(channel=body["event"]["channel"], 
                                       thread_ts=body["event"]["event_ts"],
                                       text=f"νšŒμƒ‰μ—¬μš°μ˜ λ‹΅λ³€: \n{response}")

if __name__ == "__main__":
    SocketModeHandler(app, SLACK_APP_TOKEN).start()

일반적인 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•œλ‹€λ©΄, μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό 터미널에 μž…λ ₯ν•œλ‹€.

python app.py

μ‹€ν–‰ ν›„ 터미널에 β€œβš‘οΈ Bolt app is running!”라고 λ‚˜νƒ€λ‚˜λ©΄, μ„±κ³΅μ μœΌλ‘œ app이 μ‹€ν–‰λœ 것이닀.

이λ₯Ό λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€λ©΄, nohup을 μ‚¬μš©ν•΄ μ‹€ν–‰ν•œλ‹€.

$ nohup python app.py&

이제 slackμ—μ„œ μ›ν•˜λŠ” 채널에 app을 뢈러였고, 챗봇 이름을 μ–ΈκΈ‰ν•΄μ„œ 뢈러온 ν›„ λ‚΄μš©μ„ μž…λ ₯ν•˜λ©΄ thread둜 닡변이 달린닀.

Last updated