Telegram 봇을 구축하고 배포하는 방법?
이 글에서는 Node.js와 Back4app의 서비스형 백엔드로 Telegram 봇을 구축해 보겠습니다. 그런 다음, Back4app 컨테이너를 사용하여 배포합니다.
봇은 네트워크 또는 플랫폼 상에서 자동화된 반복 작업을 수행할 수 있는 소프트웨어입니다. Telegram 봇은 Telegram 봇 API를 사용하여 생성되며, Telegram에서 작동하도록 특별히 설계되어 있습니다.
날씨 업데이트나 뉴스 헤드라인과 같은 정보 검색, 오락용 퀴즈 진행 등, Telegram에서 다양한 작업을 수행하도록 Telegram 봇을 디자인할 수 있습니다.
또한 미리 알림 예약과 같은 작업을 자동화하고 간단한 사용자 인증을 수행할 수 있습니다.
Contents
개발 환경 설정
이 글은 사용자가 좋아하는 도시의 날씨를 6시간마다 자동 업데이트하도록 설정하거나, 원하는 도시의 날씨 정보를 즉시 받을 수 있는 Telegram 봇을 소개합니다.
프로젝트 디렉토리를 설정하려면 아래 명령을 실행하세요:
# 프로젝트 디렉토리를 생성하세요
mkdir telegram-weather-bot
# cd를 사용하여 프로젝트 디렉토리로 이동하세요
cd telegram-weather-bot
# npm을 초기화하세요
npm init -y
위의 명령은 Telegram 날씨 봇
디렉토리를 생성하고, 그 안으로 이동한 다음, 그 안에 npm을 초기화합니다.
package.json
파일에 다음 시작 스크립트를 추가하여 봇을 실행합니다:
"start": "node server.js"
그런 다음 아래 명령을 실행하여 이 프로젝트에 필요한 패키지를 설치합니다:
npm install axios node-telegram-bot-api dotenv node-schedule parse
위 명령은 다음 패키지를 설치했습니다:
- axios: 이 라이브러리를 사용하여 날씨 API에 HTTP 요청을 할 수 있습니다.
- 노드-Telegram-봇-API: 이 라이브러리는 Telegram 봇 API와의 상호작용을 간소화합니다.
- dotenv: 이 패키지는 .env 파일에서 환경 변수를 로드하는 데 도움이 됩니다.
- 노드 스케줄: 작업을 예약하고 날씨 업데이트를 자동화하려면 이 패키지가 필요합니다.
- 파싱: Back4app 파싱 백엔드와 상호 작용하려면 이 패키지가 필요합니다.
이제 개발 환경이 설정되었습니다. 다음으로, Telegram에서 봇 계정을 만들어야 합니다.
Telegram 봇 계정 만들기
Telegram 봇 계정은 Telegram 플랫폼에서 봇의 신원 역할을 하게 됩니다. 사용자들은 이 계정을 통해 봇과 상호작용을 할 수 있게 됩니다.
Telegram 봇을 생성하려면, Telegram 앱을 실행하고 검색창에 “BotFather”를 입력한 후, 확인된 상단 결과를 클릭합니다.
봇파더는 다른 봇을 빠르게 개발할 수 있는 Telegram 봇입니다. 명령을 /newbot으로 입력하여 봇의 생성 프로세스를 시작하세요. 봇의 이름과 고유한 사용자명을 입력하게 됩니다.
봇의 이름과 사용자 아이디를 제공하면 BotFather에서 봇 계정과 상호 작용하고 관리할 수 있는 고유 토큰을 제공합니다.
루트 디렉터리에 .env
파일을 만들고 해당 파일에 봇 토큰을 붙여넣어 프로젝트에 봇 토큰을 저장합니다. 이렇게 하세요:
TELEGRAM_BOT_TOKEN = <YOUR_BOT_TOKEN>
이제 봇 토큰을 받아 프로젝트에 저장했으니, Telegram 봇을 구축할 수 있습니다.
Telegram 봇 구축하기
이 섹션에서는 Telegram 날씨 봇을 생성하고, 명령 처리, 사용자 상태 관리, 날씨 API에서 데이터 검색 등의 기능을 수행하기 위해 설치한 라이브러리를 통합하는 방법을 안내해 드립니다.
봇의 디렉터리를 아래와 유사하게 구성하여 빌드 프로세스를 시작합니다:
telegram-weather-bot/
├── node_modules/
├── src/
| ├── bot.js # 사용자와의 봇 상호작용을 처리하기 위한 파일
| ├── weather.js # 날씨 데이터를 가져오는 모듈
| ├── stateManager.js # Back4App을 사용하여 사용자 상태를 관리하기 위한 모듈
| └── cityManager.js # 사용자 도시 설정을 관리하고 날씨 업데이트를 보냅니다
├── .env
├── package.json
├── server.js # 귀하의 신청을 위한 진입점
└── package-lock.json
날씨 정보 얻기
날씨 정보를 얻으려면 OpenWeatherMap API를 사용합니다.
이 API를 요청하려면 API 키가 필요합니다. 이 API 키를 받으려면 계정에 로그인 하거나 계정이 없는 경우 생성하세요.
그런 다음 프로필의 ‘내 API 키’ 섹션으로 이동하여 API 키를 복사합니다.
오픈웨더맵의 API 키를 .env
파일에 저장하세요:
OPENWEATHERMAP_TOKEN = <YOUR_OPEN_WEATHER_MAP_APIKEY>
봇의 기능은 날씨 정보를 가져오는 데 중점을 두므로 axios.get
메서드를 사용하여 날씨 정보를 검색하기 위해 OpenWeatherMap의 API에 GET 요청을 하는 함수를 정의합니다.
아래 코드 블록을 weather.js
파일에 추가하여 OpenWeatherMap API에서 날씨 정보에 대한 GET 요청을 하세요:
const axios = require('axios');
const apiKey = process.env.OPENWEATHERMAP_TOKEN;
async function getWeather(city) {
try {
const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`;
const response = await axios.get(url);
const temp = response.data.main.temp;
const description = response.data.weather[0].description;
return `The weather in ${city} is ${temp}°C with ${description}.`;
} catch (error) {
console.error('Error fetching weather:', error);
throw error;
}
}
module.exports = { getWeather }
위의 코드 블록은 도시
이름을 인수로 받아 API의 응답에서 온도와 날씨 설명을 반환하는 getWeather
함수를 정의합니다.
사용자에게 6시간마다 정기적인 날씨 업데이트를 제공하려면 원하는 도시의 날씨 업데이트를 반환하는 getWeather
함수를 실행하는 스케줄러 함수를 구현해야 합니다.
날씨 업데이트 예약하기
선호하는 도시에 대한 날씨 업데이트를 반환하는 작업을 예약하려면 도시관리자.js에
아래 코드 블록을 추가하세요:
const schedule = require('node-schedule');
const weather = require('./weather');
let userCities = {};
function setCity(chatId, city) {
userCities[chatId] = city;
}
function init(bot) {
schedule.scheduleJob('0 */6 * * *', function() {
for (let chatId in userCities) {
const city = userCities[chatId];
weather.getWeather(city).then(response => {
bot.sendMessage(chatId, response);
}).catch(error => {
bot.sendMessage(chatId, "Failed to retrieve weather.");
});
}
});
}
module.exports = { setCity, init };
위의 코드 블록은 setCity와
init이라는
두 개의 함수를 생성합니다.
이 코드 블록은 setCity
함수를 사용하여 Telegram 채팅 ID를 도시 이름에 매핑하여 봇 사용자가 관심있는 도시를 추적하기 위한 userCities
객체를 선언합니다.
이 기능을 사용하면 봇이 날씨 업데이트를 수신할 도시에 대한 사용자 기본 설정을 유지할 수 있습니다.
코드 블록의 init
함수는 사용자 도시에
저장된 모든 채팅 ID를 반복하는 6시간마다 예약된 작업을 설정합니다. init
함수는 날씨
모듈을 사용하여 해당 도시의 현재 날씨를 가져옵니다.
봇은 다양한 사용자와 선호하는 도시를 추적하기 위해 사용자의 상태를 유지해야 합니다. Back4app의 서비스형 백엔드를 사용하면 이를 달성할 수 있습니다.
봇이 다양한 사용자와 그들이 선호하는 도시를 추적하도록 하려면 Back4app의 서비스형 백엔드를 사용하여 봇 사용자가 선호하는 도시를 저장하세요.
Back4app 백엔드 만들기
Back4app의 서비스형 백엔드를 사용하려면 Back4app 계정이 필요합니다. 계정이 없는 경우 무료로 가입할 수 있습니다.
계정에 로그인하고 오른쪽 상단의 “새 앱” 버튼을 클릭합니다. 애플리케이션 이름을 지정하고 ‘만들기’ 버튼을 클릭합니다.
“생성” 버튼을 클릭하면 Back4app이 애플리케이션을 생성하고 애플리케이션 대시보드로 이동합니다.
Node.js 프로젝트에서 Back4app의 앱 인스턴스에 연결하려면 Back4app의 애플리케이션 자격 증명으로 설치한 구문 분석 SDK를 초기화해야 합니다: 애플리케이션 ID와
자바스크립트 키입니다
.
사이드바의 ‘앱 설정’을 클릭하여 ‘보안 및 키’ 섹션으로 이동하여 Back4app에서 애플리케이션 ID와
자바스크립트 키를
가져옵니다.
.env
파일에 저장합니다. 현재 .env
파일은 아래 파일과 비슷해야 합니다:
TELEGRAM_BOT_TOKEN= "<YOUR_TELEGRAM_BOT_TOKEN_HERE>"
OPENWEATHERMAP_TOKEN= "<YOUR_OPENWEATHERMAP_TOKEN_HERE>"
BACK4APP_APP_ID= "<YOUR_BACK4APP_APP_ID_HERE>"
BACK4APP_JAVASCRIPT_KEY= "<YOUR_BACK4APP_JAVASCRIPT_KEY_HERE>"
다음으로, userId(문자열)와 state(객체)라는 두 개의 필드가 있는 새로운 “UserState” 클래스를 만들어야 합니다. 이 작업을 수행하기 위해 Back4app의 AI 에이전트를 사용합니다.
각 필드가 있는 이 클래스를 만들려면 화면의 ‘AI 상담원’ 탭으로 이동하여 상담원에게 아래 프롬프트를 입력합니다:
Create a new class, "UserState," in my Back4app application with the APP ID “<YOUR_BACK4APP_APP_ID_HERE>”. The "UserState" class will have two fields: userId (string) and state (object).
아래 이미지와 유사한 응답이 표시될 것입니다:
Back4app 대시보드를 확인하면 UserState
클래스가 성공적으로 생성된 것을 볼 수 있습니다.
Telegram 봇에서 사용자 상태 관리하기
봇과 사용자 간의 상호작용 흐름을 관리하려면 봇이 사용자에게 어떤 명령을 기대하는지를 나타내는 사용자 상태를 정의해야 합니다.
시작
명령 외에도 봇은 두 가지 주요 명령을 이해합니다. 각 사용자 상호작용(명령 포함)은 사용자의 상태 업데이트를 트리거하며, 이는 채팅 ID와 함께 UserState
클래스에 저장됩니다.
이러한 상태 관리를 통해 봇은 대화 내 각 사용자에 대한 특정 세부 정보(예: 날씨 업데이트를 선호하는 도시)를 기억할 수 있습니다.
Back4App 데이터베이스에서 생성한 UserState
클래스로 사용자 상태 추적을 시작하려면 자격 증명으로 Parse SDK를 초기화해야 합니다.
아래 코드 블록을 stateManager.js에
추가하여 Back4app 파싱 백엔드에 연결하는 데 필요한 자격 증명으로 파싱 SDK를 초기화합니다:
// stateManager.js
const Parse = require('parse/node');
Parse.initialize(
process.env.BACK4APP_APP_ID,
process.env.BACK4APP_JAVASCRIPT_KEY
);
Parse.serverURL = '<https://parseapi.back4app.com/>';
다음으로, stateManager.js
파일에 Back4app Parse 백엔드에서 UserState
클래스의 스키마를 나타내는 Parse 객체를 정의하여 봇이 데이터베이스에 저장된 사용자의 상태와 상호 작용할 수 있도록 합니다.
이렇게요:
// stateManager.js
const UserState = Parse.Object.extend('UserState');
다음으로, 봇이 데이터베이스에 저장된 사용자 ID를 기반으로 특정 사용자의 현재 대화 상태를 검색할 수 있도록 설정해야 합니다.
사용자의 상태를 검색하려면 사용자 ID를 사용하여 UserState
클래스에서 쿼리를 실행하여 데이터베이스에 저장된 상태를 찾아야 합니다.
이렇게요:
// stateManager.js
async function getUserState(userId) {
const query = new Parse.Query(UserState);
query.equalTo('userId', userId.toString());
const userState = await query.first();
return userState ? userState.get('state') : null;
}
위의 코드 블록은 사용자 상태 데이터를 비동기적으로 가져오는 getUserState
함수를 정의합니다.
이 함수는 인수(userId)
를 기반으로 사용자의 상태 객체를 찾기 위한 쿼리를 구성하고, 발견되면 사용자 상태를 검색합니다.
사용자의 상태를 검색한 후에는 봇이 사용자 ID와
제공된 상태
정보를 기반으로 해당 사용자와 관련된 대화 상태를 업데이트할 수 있도록 설정해야 합니다.
예를 들어, 대화 상태를 업데이트하면 봇이 선호하는 도시를 업데이트하여 정기적으로 날씨 업데이트를 받을 수 있습니다.
이렇게요:
// stateManager.js
async function setUserState(userId, state) {
const query = new Parse.Query(UserState);
query.equalTo('userId', userId.toString());
let userState = await query.first();
if (!userState) {
userState = new UserState();
userState.set('userId', userId.toString());
}
userState.set('state', state);
await userState.save();
}
위 코드 블록의 함수는 userId를
기반으로 사용자 상태 객체를 찾기 위한 쿼리를 구성하고, 존재하지 않는 경우 새 UserState
객체를 생성하고, 상태
속성을 설정한 다음 객체를 데이터베이스에 저장합니다.
다음으로, stateManager.js
파일에 아래 코드 블록을 추가하여 사용자의 상태를 재설정하는 함수를 정의합니다:
// stateManager.js
async function resetUserState(userId) {
await setUserState(userId, {});
}
resetUserState
함수는 비동기적으로 사용자의 상태를 빈 객체 {}로
설정하여 데이터베이스에서 사용자의 상태를 초기화합니다.
이전 및 새 봇 사용자의 작업을 추적하기 위해 상태 객체가 항상 존재하도록 하세요. 아래 코드 블록을 stateManager.js
파일에 추가합니다:
// stateManager.js
async function ensureUserState(userId) {
let state = await getUserState(userId);
if (!state) {
await setUserState(userId, {});
}
}
이 코드 블록은 사용자 ID를 기반으로 상태 객체를 검색하는 ensureUserState
함수를 정의하여 백엔드 Back4app Parse의 UserState
클래스에서 제공된 userId에
대한 사용자 상태 데이터가 존재하는지 확인합니다.
getUserState
함수를 사용하여 사용자 상태를 가져오고, 상태가 없는 경우 setUserState
함수를 사용하여 상태를 빈 객체 {}로
설정합니다.
모든 함수를 내보내 다른 자바스크립트 소스 파일에서 사용할 수 있도록 합니다:
// stateManager.js
module.exports = {
getUserState,
setUserState,
resetUserState,
ensureUserState,
};
봇과 사용자 상호작용 처리하기
봇이 시작
, getWeather
, setCity
명령을 수신할 수 있도록 하려면 이벤트 리스너를 정의하여 세 명령에 텍스트를 일치시켜 콜백 함수를 실행합니다.
이렇게 하면 봇이 명령과 관련된 작업을 수행할 수 있습니다.
Telegram 봇 API와 상호작용하여 봇의 행동을 정의할 수 있도록 하려면, node-telegram-bot-api
라이브러리에서 Telegram 봇
클래스를 가져와서 클래스의 새 인스턴스를 생성하세요:
// bot.js
const TelegramBot = require('node-telegram-bot-api');
const token = process.env.TELEGRAM_BOT_TOKEN;
const bot = new TelegramBot(token, { polling: true });
위의 코드 블록은 봇 토큰과 오브젝트라는 두 개의 인수를 사용하여 TelegramBot
클래스의 새 인스턴스를 생성합니다.
이 오브젝트는 봇이 Telegram 서버의 메시지와 업데이트를 지속적으로 확인할 수 있도록 폴링 값을 true로
설정합니다.
다음으로 이 프로젝트에서 만든 모듈을 가져옵니다. 이러한 모듈을 사용하여 날씨 업데이트 받기, 선호하는 도시 설정, 사용자 상태 관리 등 봇의 기능을 구현합니다.
아래에 다음 코드를 추가하여 필요한 모듈을 가져옵니다:
// bot.js
const weather = require('./weather');
const cityManager = require('./cityManager');
const stateManager = require('./stateManager');
위의 코드 블록은 모든 소스 파일에서 만든 함수를 가져와서 bot.js
파일에서 이러한 함수를 호출할 수 있도록 합니다.
명령을 설정하려면, Telegram봇
클래스에서 사용할 수 있는 onText
메서드를 사용합니다. 이 메서드는 일부 로직을 수행하기 위해 콜백 함수를 구현하는 리스너를 설정합니다.
아래 코드 블록을 bot.js
파일에 추가하여 봇이 onText
메서드를 사용하여 적극적으로 수신 대기할 /start
명령 핸들러를 설정하세요:
// bot.js
bot.onText(/\\/start/, async (msg) => {
const welcomeMessage = "Welcome to the Weather Bot! Use the commands below to interact:\\n" +
"/setCity - Set your preferred city for weather updates.\\n" +
"/getWeather - Get instant weather information for any city.\\n";
await bot.sendMessage(msg.chat.id, welcomeMessage);
stateManager.ensureUserState(msg.chat.id);
});
위의 코드 블록을 사용하면 봇이 콜백 함수를 실행하여 사용자에게 봇의 작동 방식을 자세히 설명하는 환영 메시지를 보낼 수 있습니다.
봇은 보장 사용자 상태
함수를 사용하여 사용자의 초기 상태를 설정하여 각 사용자 상호 작용에 대해 깨끗한 상태를 보장합니다.
다음으로, 아래 코드 블록을 bot.js
파일에 추가하여 봇이 onText
메서드를 사용하여 적극적으로 수신 대기할 /setCity
명령 핸들러를 설정합니다:
// bot.js
bot.onText(/\\/setCity$/, async (msg) => {
stateManager.setUserState(msg.chat.id, { expect: 'SET_CITY' });
bot.sendMessage(msg.chat.id, "Which city do you want to set as your preferred city for weather updates?");
});
위의 코드 블록을 통해 사용자는"/setCity
” 명령으로 날씨 업데이트를 위해 선호하는 도시를 지정할 수 있습니다.
이 명령을 받으면 봇은 setUserState
함수를 사용하여 사용자의 상태를 “SET_CITY”로 업데이트하고 사용자에게 원하는 도시를 입력하라는 메시지를 표시합니다.
아래 코드 블록을 bot.js
파일에 추가하여 봇이 onText
메서드를 사용하여 적극적으로 수신 대기할 /getWeather
명령 핸들러를 설정하세요:
// bot.js
bot.onText(/\\/getWeather$/, async (msg) => {
stateManager.setUserState(msg.chat.id, { expect: 'GET_WEATHER' });
bot.sendMessage(msg.chat.id, "Which city do you want to get weather information for?");
});
“/getWeather
” 명령은 봇이 사용자의 상태를 “GET_WEATHER”로 업데이트하도록 트리거하고 날씨 정보를 즉시 원하는 도시를 제공하라는 메시지를 표시합니다.
수신 메시지 처리하기
Telegram 봇에 들어오는 메시지를 처리하려면, 봇이 새 메시지를 받을 때마다 콜백 함수를 트리거하는 이벤트 리스너를 설정해야 합니다.
명령과 사용자 응답을 수신하는 메시지 핸들러를 설정하려면 아래 코드 블록을 bot.js
파일에 추가하세요:
// bot.js
// Handle incoming messages
bot.on('message', async (msg) => {
if (msg.text.startsWith('/')) {
// If the message is a command, reset the user state
stateManager.resetUserState(msg.chat.id);
} else {
// If it's not a command, check user state
const state = await stateManager.getUserState(msg.chat.id);
if (state && state.expect === 'SET_CITY') {
// If expecting SET_CITY, set city and reset state
const city = msg.text;
cityManager.setCity(msg.chat.id, city);
bot.sendMessage(msg.chat.id, `City set to ${city}. You will receive weather updates every 2 minutes.`);
stateManager.resetUserState(msg.chat.id);
} else if (state && state.expect === 'GET_WEATHER') {
// If expecting GET_WEATHER, get weather and reset state
const city = msg.text;
weather.getWeather(city).then(response => {
bot.sendMessage(msg.chat.id, response);
}).catch(error => {
bot.sendMessage(msg.chat.id, "Failed to retrieve weather.");
});
stateManager.resetUserState(msg.chat.id);
}
}
});
// Initialize the init function from cityManager.js for regular weather updates
cityManager.init(bot);
코드 블록은 전송된 문자 메시지를 수신하고 상호 작용 로직의 핵심 역할을 하는 일반 메시지 핸들러를 설정합니다.
메시지가 슬래시(“/”)로 시작하면 명령으로 간주됩니다. 이 경우 핸들러는 사용자의 상태를 재설정하여 새 명령에 대해 새로 시작할 수 있도록 합니다.
그렇지 않으면 핸들러가 사용자의 현재 상태(stateManager.getUserState)를
확인하여 사용자의 의도를 파악합니다.
사용자가 “/setCity” 명령을 전달하면 봇 핸들러는 cityManager.setCity를
사용하여 선택한 도시를 저장하고 업데이트를 확인합니다.
사용자가 “/getWeather
” 명령을 전달하면 핸들러는 weather.getWeather
함수를 사용하여 제공된 도시의 날씨 정보를 검색하고 사용자에게 응답을 다시 보냅니다.
그런 다음 위의 코드 블록은 cityManager.init(봇
)을 실행하여 선호하는 도시의 날씨 업데이트를 검색하는 예약된 작업을 실행합니다.
이제 봇의 로직 처리를 완료했으므로 봇을 Back4app 컨테이너에 배포할 때 실행할 수 있도록 서버를 설정합니다.
엔트리 파일 만들기
전체 봇 애플리케이션을 초기화할 엔트리 파일을 만듭니다. 이 파일은 두 가지 기능을 수행합니다.
- 엔트리 파일은 봇이 Telegram의 API와 상호작용하고 사용자 메시지에 응답하는 방법을 처리하는 자바스크립트 파일을 요구하여 봇의 로직을 실행하게 됩니다.
- 또한 엔트리 파일은 봇이 Back4app 컨테이너에서 실행될 수 있도록 서버를 설정합니다. 애플리케이션을 성공적으로 배포하려면 Back4app 컨테이너에 노출된 포트가 필요합니다.
프로젝트 디렉터리에서 server.js
파일로 이동합니다. 이 파일은 서버 생성을 처리합니다. server.js
파일에 아래 코드 블록을 추가합니다:
const http = require('http');
require('./src/bot'); // Import bot logic
const port = 3000;
http
.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('My Telegram bot is running\\n');
})
.listen(port, () => {
console.log(`Server running on port ${port}`);
});
위의 코드 블록은 간단한 HTTP 서버를 생성하여 Telegram 봇을 실행하도록 설정합니다. 이 서버는 진입점 역할을 하며, 봇이 컨테이너 환경 내에서 작동할 수 있도록 합니다.
이 스크립트는 봇의 핵심 로직을 가져오고 Back4app 포트를 지정하여 봇이 Back4app 컨테이너에 배포될 수 있도록 합니다.
엔트리 파일을 생성한 후, Back4app 컨테이너에 배포하기 전에 로컬에서 Telegram 봇을 테스트할 수 있습니다.
Telegram 봇 테스트
아래 명령을 실행하여 Telegram 봇을 시작하세요:
node server.js
봇과 대화하려면, Telegram 앱을 열고 검색창에서 내 봇의 이름을 검색합니다. 봇과 대화를 시작하고 /start 명령을 보내세요.
봇이 환영 메시지와 명령 목록으로 응답해야 합니다. 봇에게 명령을 보냅니다.
봇을 사용하면 /setCity
명령으로 선호하는 도시를 설정하고 정기적으로 날씨 업데이트를 받을 수 있습니다.
위 이미지와 같이 /getWeather
명령을 사용하면 특정 도시의 날씨 정보를 즉시 가져올 수 있습니다.
봇은 위 이미지에 표시된 것과 유사하게 작동하여 사용자의 명령에 응답하고 의도한 대로 사용자와 상호 작용해야 합니다.
Back4App 컨테이너에 Telegram 봇 배포하기
봇을 테스트하고 제대로 작동하는지 확인한 후 Back4app 컨테이너에 배포할 수 있습니다. 이렇게 하려면 먼저 프로젝트에 대한 Docker파일을
만들어야 합니다.
프로젝트의 루트 디렉토리에 Dockerfile
파일을 생성하고 아래 코드 블록을 추가합니다:
# Specify base image
FROM node:18-alpine
# Specify the working directory
WORKDIR /app
# Copy package.json and package-lock.json
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
# Run the app
CMD ["npm", "start"]
Docker파일을
생성한 후 로컬 리포지토리를 GitHub에 푸시하여 Back4app 컨테이너에 배포할 수 있도록 합니다.
그런 다음 GitHub 계정에 Back4App 컨테이너 GitHub 앱을 설치하고 애플리케이션의 코드 저장소에 액세스하는 데 필요한 권한을 앱에 부여합니다.
GitHub 구성이 완료되면 Back4app 홈페이지로 이동하여 화면 오른쪽 상단에 있는 “새 앱” 버튼을 클릭합니다.
그러면 생성하려는 앱 유형을 선택해야 하는 초기화 화면으로 이동합니다. 아래 이미지와 같이 Back4app 에이전트 옵션을 선택합니다.
Back4app 에이전트 옵션을 선택하면 Back4app AI 에이전트 페이지로 리디렉션됩니다.
Back4app 컨테이너에 애플리케이션을 배포하려면 아래 프롬프트를 입력하세요:
Deploy my "YOUR_REPOSITORY_URL" repository on GitHub to Back4App Containers.
Here are the required environmental variables:
TELEGRAM_BOT_TOKEN = "TELEGRAM_BOT_TOKEN"
OPENWEATHERMAP_TOKEN = "WEATHER_API_TOKEN"
BACK4APP_APP_ID = "BACK4APP_APP_ID"
BACK4APP_JAVASCRIPT_KEY = "BACK4APP_JAVASCRIPT_KEY"
자리 표시자를 실제 값으로 바꿉니다. 위의 프롬프트가 나타나면 배포 프로세스가 시작됩니다. 완료되면 AI 에이전트가 응답하여 성공 또는 배포 보류 중임을 나타냅니다.
아래와 유사한 응답이 표시될 것입니다:
보류 중인 배포를 받으면 Back4app 컨테이너 대시보드에서 앱의 배포 상태를 모니터링할 수 있습니다. 또는 Back4app 컨테이너에서 애플리케이션을 수동으로 배포할 수도 있습니다.
결론
이 글에서는, Node.js로 Telegram 봇을 만드는 방법을 배웠습니다. Telegram 봇 계정을 생성하고, 봇 명령을 처리하고, 사용자 상호작용을 처리하는 방법을 살펴보았습니다.
또한 Back4app AI 에이전트의 도움을 받아 봇용 백엔드를 생성하여 사용자 상태를 효과적으로 관리하고 사용자가 선호하는 도시와 같은 정보를 대화에 저장하여 날씨 업데이트를 정기적으로 받을 수 있도록 했습니다.
전체 코드는 이 GitHub 리포지토리에서 찾을 수 있습니다.