Bot Telegram Inteligente com IA: Guia Completo 2026
O Telegram é a plataforma ideal para bots de IA: API gratuita, sem limites de mensagens, suporte a rich media e grupos de até 200.000 membros. Este guia mostra como criar seu bot inteligente.
Por Que Telegram para Bots de IA?
| Recurso | Telegram | |
|---|---|---|
| API | Gratuita | Paga |
| Limites | Praticamente sem | Por conversa |
| Aprovação | Instantânea | Processo longo |
| Grupos | 200.000 membros | 1.024 membros |
| Bots inline | Sim | Não |
| Markdown | Completo | Limitado |
| Arquivos | Até 2GB | Limitado |
Opções para Criar Seu Bot
1. OpenClaw (Recomendado)
A forma mais rápida de ter um assistente inteligente no Telegram.
Vantagens:
- Configuração em minutos
- Claude, GPT-4 ou modelos locais
- Memória persistente
- Ferramentas integradas (web, arquivos, etc.)
Configuração:
# config.yaml
channels:
telegram:
enabled: true
token: "BOT_TOKEN_DO_BOTFATHER"
allowedUsers:
- 123456789 # Seu Telegram ID
Obtendo o token:
- Abra @BotFather no Telegram
- Envie
/newbot - Escolha nome e username
- Copie o token
Obtendo seu ID:
- Abra @userinfobot
- Envie qualquer mensagem
- Copie o ID retornado
2. Python + python-telegram-bot
Para quem quer controle total do código.
Instalação:
pip install python-telegram-bot openai
Bot básico com GPT-4:
import os
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from openai import OpenAI
# Configuração
TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=OPENAI_API_KEY)
# Histórico de conversas (em memória)
conversations = {}
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Comando /start"""
user_id = update.effective_user.id
conversations[user_id] = []
await update.message.reply_text(
"Olá! Sou um assistente de IA. Como posso ajudar?"
)
async def clear(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Comando /clear - limpa histórico"""
user_id = update.effective_user.id
conversations[user_id] = []
await update.message.reply_text("Histórico limpo!")
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Processa mensagens de texto"""
user_id = update.effective_user.id
user_message = update.message.text
# Inicializa histórico se necessário
if user_id not in conversations:
conversations[user_id] = []
# Adiciona mensagem ao histórico
conversations[user_id].append({
"role": "user",
"content": user_message
})
# Mantém apenas últimas 20 mensagens
if len(conversations[user_id]) > 20:
conversations[user_id] = conversations[user_id][-20:]
# Envia "digitando..."
await context.bot.send_chat_action(
chat_id=update.effective_chat.id,
action="typing"
)
# Chama a API do OpenAI
try:
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": "Você é um assistente útil e amigável."},
*conversations[user_id]
],
max_tokens=1000
)
assistant_message = response.choices[0].message.content
# Salva resposta no histórico
conversations[user_id].append({
"role": "assistant",
"content": assistant_message
})
await update.message.reply_text(assistant_message)
except Exception as e:
await update.message.reply_text(f"Erro: {str(e)}")
def main():
"""Inicia o bot"""
app = Application.builder().token(TELEGRAM_TOKEN).build()
# Handlers
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("clear", clear))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
# Inicia polling
print("Bot iniciado!")
app.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()
Executando:
export TELEGRAM_TOKEN="seu_token"
export OPENAI_API_KEY="sua_chave"
python bot.py
3. Python + LangChain
Para recursos avançados como RAG e memória persistente.
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferWindowMemory
from langchain.chains import ConversationChain
from telegram import Update
from telegram.ext import Application, MessageHandler, filters, ContextTypes
# LLM e memória
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0.7)
memories = {}
def get_chain(user_id):
"""Retorna chain com memória do usuário"""
if user_id not in memories:
memories[user_id] = ConversationBufferWindowMemory(k=10)
return ConversationChain(
llm=llm,
memory=memories[user_id],
verbose=False
)
async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_id = update.effective_user.id
chain = get_chain(user_id)
response = chain.predict(input=update.message.text)
await update.message.reply_text(response)
4. n8n (No-Code)
Para automações visuais sem programar.
Fluxo básico:
- Telegram Trigger - Recebe mensagens
- OpenAI - Processa com IA
- Telegram - Envia resposta
Configuração no n8n:
{
"nodes": [
{
"type": "n8n-nodes-base.telegramTrigger",
"position": [250, 300],
"parameters": {
"updates": ["message"]
}
},
{
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [450, 300],
"parameters": {
"model": "gpt-4-turbo",
"prompt": "={{ $json.message.text }}"
}
},
{
"type": "n8n-nodes-base.telegram",
"position": [650, 300],
"parameters": {
"operation": "sendMessage",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"text": "={{ $json.text }}"
}
}
]
}
Recursos Avançados
Processamento de Imagens
import base64
from openai import OpenAI
async def handle_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Analisa imagens enviadas"""
photo = update.message.photo[-1] # Maior resolução
file = await context.bot.get_file(photo.file_id)
# Download da imagem
image_data = await file.download_as_bytearray()
base64_image = base64.b64encode(image_data).decode()
# Análise com GPT-4 Vision
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "O que você vê nesta imagem?"},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}
}
]
}
]
)
await update.message.reply_text(response.choices[0].message.content)
Transcrição de Áudio
async def handle_voice(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Transcreve áudios enviados"""
voice = update.message.voice
file = await context.bot.get_file(voice.file_id)
# Download do áudio
audio_path = f"/tmp/{voice.file_id}.ogg"
await file.download_to_drive(audio_path)
# Transcrição com Whisper
with open(audio_path, "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
# Responde sobre a transcrição
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=[
{"role": "system", "content": "Responda à mensagem de áudio transcrita."},
{"role": "user", "content": transcript.text}
]
)
await update.message.reply_text(
f"📝 Transcrição: {transcript.text}\n\n💬 Resposta: {response.choices[0].message.content}"
)
Botões Inline
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
async def menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Mostra menu com botões"""
keyboard = [
[
InlineKeyboardButton("Ajuda", callback_data="help"),
InlineKeyboardButton("Config", callback_data="config")
],
[InlineKeyboardButton("Limpar histórico", callback_data="clear")]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(
"Escolha uma opção:",
reply_markup=reply_markup
)
async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Processa cliques em botões"""
query = update.callback_query
await query.answer()
if query.data == "help":
await query.edit_message_text("Envie qualquer mensagem para conversar!")
elif query.data == "clear":
conversations[update.effective_user.id] = []
await query.edit_message_text("Histórico limpo!")
Deploy
Railway (Recomendado)
# Instale CLI do Railway
npm install -g @railway/cli
# Login e deploy
railway login
railway init
railway up
railway.json:
{
"build": {
"builder": "NIXPACKS"
},
"deploy": {
"startCommand": "python bot.py"
}
}
Docker
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "bot.py"]
docker build -t telegram-bot .
docker run -d --env-file .env telegram-bot
VPS (DigitalOcean, Linode)
# No servidor
git clone seu-repo
cd telegram-bot
pip install -r requirements.txt
# Systemd service
sudo nano /etc/systemd/system/telegram-bot.service
[Unit]
Description=Telegram Bot
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/telegram-bot
ExecStart=/usr/bin/python3 bot.py
Restart=always
EnvironmentFile=/home/ubuntu/telegram-bot/.env
[Install]
WantedBy=multi-user.target
Custos
| Componente | Custo |
|---|---|
| API Telegram | Grátis |
| GPT-4 Turbo | ~$10/1M tokens input |
| Claude Sonnet | ~$3/1M tokens input |
| Whisper | $0.006/minuto |
| Railway | $5/mês (básico) |
| VPS | $5-10/mês |
Estimativa para uso moderado (100 msgs/dia): $5-15/mês
Segurança
Boas Práticas
Restrinja usuários
ALLOWED_USERS = [123456789, 987654321] async def check_user(update: Update, context: ContextTypes.DEFAULT_TYPE): if update.effective_user.id not in ALLOWED_USERS: await update.message.reply_text("Acesso negado.") return False return TrueRate limiting
from collections import defaultdict from datetime import datetime, timedelta user_requests = defaultdict(list) def rate_limit(user_id, max_requests=10, window=60): now = datetime.now() user_requests[user_id] = [ t for t in user_requests[user_id] if now - t < timedelta(seconds=window) ] if len(user_requests[user_id]) >= max_requests: return False user_requests[user_id].append(now) return TrueNão exponha tokens em código
# Use variáveis de ambiente import os TOKEN = os.getenv("TELEGRAM_TOKEN")
Próximos Passos
- Iniciantes: Use OpenClaw para começar em minutos
- Desenvolvedores: Clone o template Python e customize
- No-code: Configure n8n com template Telegram
Recursos
Quer o caminho mais rápido? O OpenClaw configura um bot Telegram inteligente em minutos, com Claude ou GPT-4, memória e ferramentas integradas.