무료 텔레그램 봇 빌더
코딩 없이 명령어·자동응답·환영·예약·시세 알림 봇을 만들고, 완성된 코드를 30초 만에 24시간 서버에 올려보세요.
프로젝트 슬러그: telegram-bot
명령어 응답
/start, /help 처럼 슬래시 명령에 답합니다. 이름은 영문·숫자·밑줄만 사용합니다.
키워드 자동응답
메시지에 키워드가 포함되면 자동으로 답합니다. 여러 개는 쉼표로 구분.
새 멤버 환영
그룹에 들어온 멤버에게 환영 메시지를 보냅니다. {name}을 쓰면 이름이 들어갑니다.
예약 발송
매일 지정한 시각(KST)에 채팅방으로 메시지를 보냅니다.
업비트 시세 알림
목표가에 도달하면 알림. 거래소 API 키가 필요 없습니다.
배포 모드
기본은 롱폴링(포트·도메인 불필요). 외부 도메인이 있으면 웹훅 모드 코드를 생성할 수 있습니다.
명령어
키워드 자동응답
배포하기
온보딩에서 30초 배포업로드 후 프로젝트 설정 → 환경변수에 TELEGRAM_BOT_TOKEN을 넣으면 24시간 자동으로 시작됩니다. 예약·알림을 쓰려면 봇에 /id 를 보내 TELEGRAM_CHAT_ID 도 등록하세요.
토큰은 텔레그램 @BotFather → /newbot 으로 발급합니다. 봇 만들기 가이드
"""DashCloud 텔레그램 봇 빌더로 생성된 봇 (requests 롱폴링).
환경변수:
TELEGRAM_BOT_TOKEN (필수) @BotFather에서 발급한 봇 토큰
TELEGRAM_API_BASE (선택) 기본 https://api.telegram.org
"""
import json
import os
import time
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo
import requests
TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
API_BASE = os.environ.get("TELEGRAM_API_BASE", "https://api.telegram.org").rstrip("/")
API = f"{API_BASE}/bot{TOKEN}"
CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "")
ADMIN_CHAT_ID = os.environ.get("ADMIN_CHAT_ID", "")
KST = ZoneInfo("Asia/Seoul")
STATE_PATH = Path("state.json")
COMMANDS = {
"start": {
"description": "봇 시작",
"response": "안녕하세요! 무엇을 도와드릴까요?",
"admin": False,
},
"help": {
"description": "도움말",
"response": "사용 가능한 명령어를 안내해 드립니다.",
"admin": False,
},
}
KEYWORD_REPLIES = [
(["안녕", "하이"], "안녕하세요!"),
]
WELCOME_TEXT = None
SCHEDULES = [
]
UPBIT = None
def load_state():
if STATE_PATH.exists():
try:
return json.loads(STATE_PATH.read_text())
except json.JSONDecodeError:
pass
return {"offset": 0, "schedule_done": {}, "upbit_armed": True}
def save_state(state):
STATE_PATH.write_text(json.dumps(state, ensure_ascii=False))
def call(method, **payload):
res = requests.post(f"{API}/{method}", json=payload, timeout=40)
res.raise_for_status()
return res.json()
def send(chat_id, text, markup=None):
if not chat_id:
print("[bot] chat_id가 없어 전송을 건너뜁니다", flush=True)
return
payload = {"chat_id": chat_id, "text": text, "disable_web_page_preview": True}
if markup:
payload["reply_markup"] = markup
call("sendMessage", **payload)
def handle_message(message):
text = (message.get("text") or "").strip()
chat_id = (message.get("chat") or {}).get("id")
if not text or chat_id is None:
return
if text == "/id":
send(chat_id, f"이 채팅의 chat_id: {chat_id}")
return
if text.startswith("/"):
name = text[1:].split()[0].split("@")[0].lower()
entry = COMMANDS.get(name)
if entry:
if entry.get("admin") and str(chat_id) != str(ADMIN_CHAT_ID):
send(chat_id, "관리자 전용 명령입니다.")
return
send(chat_id, entry["response"], entry.get("markup"))
return
lowered = text.lower()
for words, response in KEYWORD_REPLIES:
if any(word.lower() in lowered for word in words):
send(chat_id, response)
return
def process_update(update, state):
message = update.get("message") or update.get("edited_message") or {}
handle_message(message)
def background_loop(state):
while True:
try:
save_state(state)
except Exception as error:
print(f"[bot] 백그라운드 오류: {error}", flush=True)
time.sleep(15)
def register_commands():
entries = [
{"command": name, "description": entry["description"] or "설명 없음"}
for name, entry in COMMANDS.items()
]
if not entries:
return
try:
call("setMyCommands", commands=entries)
print(f"[bot] 명령어 메뉴 {len(entries)}개 등록", flush=True)
except Exception as error:
print(f"[bot] 명령어 메뉴 등록 실패: {error}", flush=True)
def main():
state = load_state()
register_commands()
if not CHAT_ID and (SCHEDULES or UPBIT):
print("[bot] TELEGRAM_CHAT_ID가 비어 있습니다. 봇에 /id 를 보내 확인하세요.", flush=True)
print(
f"[bot] 시작 · 명령어 {len(COMMANDS)}개 · 키워드 {len(KEYWORD_REPLIES)}개 · 예약 {len(SCHEDULES)}개",
flush=True,
)
threading.Thread(target=background_loop, args=(state,), daemon=True).start()
offset = int(state.get("offset") or 0)
while True:
try:
data = call("getUpdates", offset=offset, timeout=30)
for update in data.get("result", []):
offset = int(update["update_id"]) + 1
state["offset"] = offset
process_update(update, state)
except Exception as error:
print(f"[bot] 오류: {error}", flush=True)
time.sleep(3)
if __name__ == "__main__":
main()
생성된 봇은 롱폴링 방식이라 인바운드 포트·웹훅 설정 없이 동작합니다. 요금제 Free로도 바로 돌려볼 수 있고, 24시간 상시 가동은 대시보드에서 관리됩니다.
텔레그램 봇 빌더는 코딩 없이 브라우저에서 봇의 동작(명령어 응답, 키워드 자동응답, 새 멤버 환영, 예약 발송, 업비트 시세 알림)을 구성하면, 바로 실행 가능한 bot.py와 dashcloud.json을 생성해 주는 무료 도구입니다. 생성된 ZIP을 DashCloud 온보딩에 업로드하면 인바운드 포트·웹훅 설정 없이 24시간 가동되는 봇이 됩니다.
서버·도메인·Docker 없이 롱폴링 방식으로 동작하기 때문에, 노트북을 꺼도 봇이 멈추지 않게 만들고 싶은 분에게 가장 빠른 경로입니다. 토큰 발급부터 배포까지 10분이면 끝납니다.
사용 방법 (10분)
- 1
@BotFather에서 봇 토큰 발급
텔레그램에서 @BotFather → /newbot → 이름과 사용자명 입력 → 토큰 복사
- 2
빌더에서 동작 구성
명령어·키워드·환영·예약·시세 알림을 입력하고 오른쪽 미리보기로 확인
- 3
ZIP 다운로드 후 온보딩에 업로드
새 봇 배포(온보딩)에 ZIP을 드래그하면 프로젝트가 생성되고 배포가 시작됩니다
- 4
환경변수에 토큰 입력
프로젝트 설정 → 환경변수에 TELEGRAM_BOT_TOKEN(+필요 시 TELEGRAM_CHAT_ID) 등록
자주 묻는 질문
텔레그램 봇 토큰은 어떻게 발급하나요?
텔레그램에서 @BotFather 를 찾아 /newbot 을 보내면 봇 이름과 사용자명을 묻고 토큰을 발급합니다. 발급된 토큰은 DashCloud 프로젝트 설정의 TELEGRAM_BOT_TOKEN 환경변수에 넣으면 됩니다. 토큰은 비밀번호와 같으므로 코드나 GitHub에 올리면 안 됩니다.
코딩을 전혀 몰라도 텔레그램 봇을 만들 수 있나요?
가능합니다. 이 빌더는 명령어와 답변, 환영 문구, 예약 시각, 시세 목표가를 입력받아 완성된 파이썬 코드(bot.py)를 만들어 줍니다. 생성된 ZIP을 DashCloud 온보딩에 드래그하면 서버 설정 없이 배포됩니다.
롱폴링과 웹훅은 무엇이 다른가요?
롱폴링은 봇이 텔레그램 서버에 새 메시지를 주기적으로 물어보는 방식이라 공인 IP·도메인·포트 개방이 필요 없습니다. 웹훅은 텔레그램이 봇 서버로 직접 요청을 보내는 방식으로 별도 HTTPS 주소가 필요합니다. 이 빌더의 봇은 롱폴링으로 동작합니다.
명령어는 몇 개까지 만들 수 있나요?
텔레그램이 봇 메뉴(/ 를 입력했을 때)에 표시하는 명령어는 최대 100개입니다. 빌더는 입력한 명령어를 시작할 때 setMyCommands 로 자동 등록하므로, 만든 명령어가 텔레그램 메뉴에 그대로 나타납니다.
그룹에서 환영 메시지가 안 보여요.
환영 메시지는 그룹에 새 멤버가 들어올 때 전송됩니다. 봇이 그룹에 초대되어 있어야 하고, 개인정보 보호 모드(프라이버시 모드)가 켜져 있어도 새 멤버 알림은 받을 수 있습니다. 그래도 보이지 않으면 BotFather → /setprivacy 에서 봇의 프라이버시 설정을 확인하세요.
업비트 시세 알림에 API 키가 필요한가요?
필요 없습니다. 업비트 공개 시세 API(api.upbit.com/v1/ticker)를 읽어 목표가에 도달하면 알림을 보냅니다. 계좌 정보나 주문 권한이 전혀 필요 없어 안전합니다.
무료로 24시간 돌릴 수 있나요?
DashCloud Free 플랜에서도 배포와 실행이 가능하고, 갱신을 누르면 계속 가동할 수 있습니다. 트래픽·자원 한도는 요금제 페이지에서 확인할 수 있습니다.