구글 앱 스크립트를 이용한 슬랙 AI 봇 구현 가이드
이 가이드는 별도 서버 구축 없이 Google Apps Script를 이용해 Slack에서 LaaS(LLM as a Service) 의 생성형 AI 기능을 활용하는 봇을 구현하는 방법을 제공합니다. 이 가이드를 통해 Slack 워크스페이스 내에서 GPT-4o 기반 AI 봇을 간단히 설정하고 사용할 수 있습니다.
1. 이 가이드의 목적과 강점
-
별도 서버 없이 구현: Google Apps Script를 사용하므로 별도의 서버를 설정할 필요가 없습니다.
-
손쉬운 Slack 통합: Slack 워크스페이스와 LaaS API를 연동해 강력한 AI 봇을 구축할 수 있습니다.
-
자동화 및 효율성 강화: Slack에서 생성형 AI를 활용하여 질문 응답, 작업 자동화, 대화 관리 등을 구현할 수 있습니다.
-
개발자의 도움 없이 구현 가능: GPT-4o를 활용하여 LaaS API와 Slack을 연결하는 데 필요한 코드를 자동 생성하거나 쉽게 적용할 수 있어, 기술적인 지식이 없어도 AI 봇을 설정할 수 있습니다.
2. LaaS 설정 (선행 작업)
Slack 봇에서 사용할 AI 모델과 프리셋을 설정하기 위해 아래 문서를 참고하세요
프리셋 생성 후, 아래 내용을 준비합니다
-
LaaS API Key: LaaS에서 제공하는 API 키
-
프로젝트 이름(Project Name): API 호출 시 사용
3. Slack 설정
3.1. Slack 앱 생성
-
Slack API 웹사이트에 접속합니다.
-
우측 상단에서 “Create New App” 버튼을 클릭합니다.
-
From Scratch 옵션을 선택하고 앱 이름과 워크스페이스를 입력합니다.
3.2. 권한 설정
-
OAuth & Permissions 메뉴로 이동합니다.
-
Scopes 섹션에서 아래 권한을 추가합니다
-
chat:write: 메시지 전송 권한
-
reactions:write: 이모지 추가 및 삭제 권한
-
-
OAuth Tokens에서 Install to
{{스페이스명}}
를 클릭합니다.
-
설치 후 생성된 OAuth Token을 복사합니다.
-
슬랙 관리 메뉴
-
설치된 앱으로 이동하여 앱을 선택합니다.
-
앱 세부정보 클릭하여 진입합니다.
-
슬랙에서 열기 를 클릭하여 설치합니다.
-
3.3. Event Subscriptions 설정
-
Event Subscriptions 메뉴로 이동합니다.
-
Enable Events를 활성화합니다.
-
Request URL에 Google Apps Script에서 생성할 웹 앱 URL을 입력합니다.
-
해당 영역의 URL은 구글 앱 스크립트에서 코드 배포 후 생성된 URL을 입력합니다.
-
-
아래 이벤트를 추가합니다
-
app_mention: Slack에서 봇이 멘션될 때 트리거됩니다.
-
3.4. App Home 설정
- Always Show My Bot as Online 을 활성화 합니다.

4. Google Apps Script 설정
4.1. Google Apps Script 프로젝트 생성
-
Google Apps Script에 접속합니다.
-
새 프로젝트를 생성합니다.
4.2. 코드 작성
아래 코드를 복사하여 Google Apps Script 에디터에 붙여넣습니다
var SLACK_TOKEN = "xoxb-your-slack-token"; // Slack OAuth Token
var LAAS_API_KEY = "your-laas-api-key"; // LaaS API Key
var PROJECT_NAME = "your-project-name"; // LaaS 프로젝트 이름
function doPost(e) {
var params = JSON.parse(e.postData.contents);
if (params.type === "url_verification") {
return ContentService.createTextOutput(params.challenge);
}
if (params.event && params.event.type === "app_mention") {
var channel = params.event.channel;
var userMessage = params.event.text.replace(/<@.*?-->/, '').trim();
var threadTs = params.event.thread_ts || params.event.ts;
var history = getConversationHistory(channel, threadTs);
history.push({ role: "user", content: userMessage });
var response = callLaaSAPI(history);
history.push({ role: "assistant", content: response });
saveConversationHistory(channel, threadTs, history);
sendMessageToSlack(channel, response, threadTs);
}
}
function callLaaSAPI(history) {
var apiUrl = "https://api-laas.wanted.co.kr/api/preset/v2/chat/completions";
var payload = {
model: "gpt-4o",
messages: history,
hash: "unique-hash-code"
};
var options = {
method: "post",
contentType: "application/json",
headers: {
project: PROJECT_NAME,
apiKey: LAAS_API_KEY
},
payload: JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(apiUrl, options);
var json = JSON.parse(response.getContentText());
return json.choices[0].message.content;
}
function sendMessageToSlack(channel, message, threadTs) {
var slackUrl = "https://slack.com/api/chat.postMessage";
var payload = {
channel: channel,
text: message,
mrkdwn: true,
thread_ts: threadTs
};
var options = {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + SLACK_TOKEN },
payload: JSON.stringify(payload)
};
UrlFetchApp.fetch(slackUrl, options);
}
function getConversationHistory(channel, threadTs) {
var cache = CacheService.getUserCache();
var key = channel + ":" + threadTs;
var history = cache.get(key);
return history ? JSON.parse(history) : [];
}
function saveConversationHistory(channel, threadTs, history) {
var cache = CacheService.getUserCache();
var key = channel + ":" + threadTs;
cache.put(key, JSON.stringify(history), 300);
}
4.3. 웹 앱으로 배포
-
상단 메뉴에서 Deploy > New Deployment를 클릭합니다.
-
웹 앱(Web App) 을 선택합니다.
-
배포 URL을 복사하여 Slack의 Event Subscriptions에 입력합니다.