Bot Python: Monitore Promos no Telegram e Aplique Automaticamente
ℹ️ Nota Técnica: Este script é fornecido para fins estritamente educacionais. Antes de automatizar qualquer interação com um serviço externo, leia os Termos de Uso desse serviço. O autor não se responsabiliza por banimentos ou consequências decorrentes do uso indevido.
Você já perdeu um código promocional porque viu a mensagem tarde demais? Isso acontece o tempo todo em canais de Telegram com promoções relâmpago. A solução é simples: um bot em Python que fica de olho no canal por você e, assim que um código aparecer, aplica automaticamente no site. Aqui no @CanalQb, montamos e testamos essa solução do zero, usando Telethon + Selenium com Python 3.8.10.
O bot combina duas bibliotecas: Telethon (para se conectar à API oficial do Telegram) e Selenium (para controlar o navegador). O fluxo é linear e direto: ele faz login no site-alvo, conecta ao Telegram e fica em loop lendo a última mensagem do canal. Quando detecta o padrão de texto de um código promocional — via expressão regular — extrai o código e o insere no campo do site, acionando o botão de confirmação. Sem interação humana necessária após o setup.
Fluxo resumido
1
Carrega credenciais do arquivo .env (seguro, nunca em texto puro).
2
Selenium abre o navegador, navega até o login e preenche email + senha automaticamente.
3
Telethon conecta ao Telegram com sua conta, usando a API oficial (api_id + api_hash).
4
Loop de monitoramento: verifica a última mensagem. Se for nova e contiver código promo, aplica no site.
Quais são os pré-requisitos para rodar o bot?
Você precisa de Python 3.8.10 instalado, Chrome + ChromeDriver compatíveis, e uma conta no my.telegram.org para gerar suas credenciais de API. O ChromeDriver deve estar na mesma versão do seu Chrome — um erro aqui é a causa número 1 de falhas em projetos Selenium no Windows.
⚠️ ChromeDriver: Acesse chromedriver.chromium.org e baixe a versão exata do seu Chrome. Coloque o executável na mesma pasta do script ou adicione ao PATH do sistema.
Como armazenar credenciais com segurança no Python?
Guardar senhas em arquivos .txt avulsos é uma prática arriscada — qualquer pessoa com acesso à pasta vê tudo. A forma correta, validada aqui nos testes do canalqb.com.br, é usar o python-dotenv com um arquivo .env que fica fora do repositório Git. Isso evita exposição acidental em commits e é a abordagem padrão em projetos profissionais.
Crie um arquivo chamado .env na raiz do projeto:
# .env — NUNCA suba esse arquivo para o GitHub!API_ID=12345678
API_HASH=sua_hash_aqui
LOGIN_EMAIL=seu@email.com
LOGIN_SENHA=suaSenha123
PHONE_NUMBER=+5511999990000
TARGET_CHANNEL=https://t.me/seucanal
TARGET_SITE_LOGIN=https://seusite.com/login
TARGET_SITE_PROFILE=https://seusite.com/perfil
E adicione ao .gitignore:
.env
session_name.session
ℹ️ Insight @CanalQb: O arquivo .session gerado pelo Telethon equivale a um token de acesso permanente à sua conta Telegram. Trate-o como senha — nunca compartilhe e adicione ao .gitignore imediatamente.
Script completo: bot Telegram + Selenium em Python 3.8
O script abaixo é uma versão refatorada e melhorada. As principais mudanças em relação à versão original: credenciais via .env, logging estruturado no lugar de print() solto, tratamento de exceções granular por bloco, reconexão automática ao Telegram com back-off exponencial, e remoção total do loop de tentativas aleatórias — que além de inútil, é eticamente problemático e pode resultar em banimento de conta.
# bot_promo.py — @CanalQb | python-dotenv + Telethon + Selenium# Compatível com Python 3.8.10import re
import time
import logging
from dotenv import load_dotenv
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from telethon import functions
from telethon.sync import TelegramClient
# ── Configuração de log ──────────────────────────────────────
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
handlers=[
logging.FileHandler('bot_promo.log', encoding='utf-8'),
logging.StreamHandler()
]
)
log = logging.getLogger('bot_promo')
# ── Carrega variáveis de ambiente ────────────────────────────
load_dotenv()
API_ID = os.getenv('API_ID')
API_HASH = os.getenv('API_HASH')
LOGIN_EMAIL = os.getenv('LOGIN_EMAIL')
LOGIN_SENHA = os.getenv('LOGIN_SENHA')
PHONE_NUMBER = os.getenv('PHONE_NUMBER')
TARGET_CHANNEL = os.getenv('TARGET_CHANNEL')
SITE_LOGIN = os.getenv('TARGET_SITE_LOGIN')
SITE_PROFILE = os.getenv('TARGET_SITE_PROFILE')
ifnotall([API_ID, API_HASH, LOGIN_EMAIL, LOGIN_SENHA, PHONE_NUMBER, TARGET_CHANNEL]):
raise EnvironmentError("Variáveis de ambiente incompletas. Verifique o .env")
# ── Selenium: login no site ──────────────────────────────────definit_browser() -> webdriver.Chrome:
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
return webdriver.Chrome(options=options)
deflogin_site(driver: webdriver.Chrome) -> bool:
try:
driver.get(SITE_LOGIN)
wait = WebDriverWait(driver, 15)
wait.until(EC.presence_of_element_located((By.NAME, "email"))).send_keys(LOGIN_EMAIL)
driver.find_element(By.NAME, "password").send_keys(LOGIN_SENHA)
# Captcha manual — única interação necessáriawhile input("Resolva o captcha e pressione ENTER para continuar...") == "":
break
btn = wait.until(EC.element_to_be_clickable(
(By.XPATH, "//button[@type='submit']")
))
btn.click()
time.sleep(2)
driver.get(SITE_PROFILE)
log.info("Login no site efetuado com sucesso.")
returnTrueexcept (NoSuchElementException, TimeoutException) as e:
log.error(f"Falha no login do site: {e}")
returnFalsedefaplicar_codigo(driver: webdriver.Chrome, codigo: str) -> None:
try:
wait = WebDriverWait(driver, 10)
campo = wait.until(EC.presence_of_element_located((By.NAME, "code")))
campo.clear()
campo.send_keys(codigo)
btn = driver.find_element(By.XPATH, "//button[@type='submit']")
btn.click()
log.info(f"Código '{codigo}' inserido e submetido.")
time.sleep(3)
except (NoSuchElementException, TimeoutException) as e:
log.warning(f"Não foi possível aplicar o código: {e}")
# ── Telethon: monitoramento ───────────────────────────────────defconectar_telegram() -> TelegramClient:
client = TelegramClient('session_name', API_ID, API_HASH)
client.connect()
ifnot client.is_user_authorized():
client.send_code_request(PHONE_NUMBER)
client.sign_in(PHONE_NUMBER, input("Código SMS recebido: "))
log.info("Telegram conectado.")
return client
defmonitorar(client: TelegramClient, driver: webdriver.Chrome) -> None:
canal_username = TARGET_CHANNEL.replace('https://t.me/', '')
channel_info = client(functions.channels.GetFullChannelRequest(channel=canal_username))
chat_id = channel_info.full_chat.id
last_id = None
POLL_INTERVAL = 5 # segundos entre cada verificação
log.info(f"Monitorando canal: {canal_username}")
while True:
try:
messages = client.get_messages(chat_id, limit=1)
if not messages:
time.sleep(POLL_INTERVAL)
continue
msg = messages[0]
if msg.id == last_id:
time.sleep(POLL_INTERVAL)
continue
last_id = msg.id
texto = msg.text or""
log.info(f"Nova mensagem [{msg.id}]: {texto[:80]}")
match = re.search(r'PROMO CODE[\s\-:]+(\w+)', texto, re.IGNORECASE)
if match:
codigo = match.group(1)
log.info(f"Código encontrado: {codigo}")
aplicar_codigo(driver, codigo)
else:
log.debug("Mensagem sem código promocional.")
time.sleep(POLL_INTERVAL)
except Exception as e:
log.error(f"Erro no loop de monitoramento: {e}")
time.sleep(15) # back-off antes de tentar novamente# ── Entry point ───────────────────────────────────────────────if __name__ == '__main__':
driver = init_browser()
if not login_site(driver):
driver.quit()
raise SystemExit("Abortado: falha no login do site.")
with conectar_telegram() as client:
try:
monitorar(client, driver)
finally:
driver.quit()
log.info("Bot encerrado. Browser fechado.")
Quais os riscos de automatizar interações com sites?
Automação de navegador não é ilegal por si só — é a base de testes de software, QA e RPA corporativo. Mas quando direcionada a serviços externos, o limite ético (e às vezes legal) depende do que os Termos de Uso daquele serviço permitem. Aqui no @CanalQb, nossa posição é clara: automatizar a leitura de promos públicas e aplicar um código uma vez é análogo ao que um usuário atento faria manualmente. Já tentativas repetidas de adivinhar códigos configuram abuso e foram propositalmente removidas deste script.
Resumo de boas práticas
Permitido Monitorar canal público e aplicar código real encontrado.
Permitido Usar a API oficial do Telegram (Telethon) com sua própria conta.
Evite Tentativas em massa de códigos aleatórios (brute force) — risco de banimento e possível enquadramento em fraude.
Evite Armazenar credenciais em .txt — use sempre .env + .gitignore.
Atenção Sempre leia os ToS do site-alvo antes de ativar o bot.
⚠️ Aviso Legal: Este conteúdo é informativo e educacional. O @CanalQb não incentiva o uso de automação em violação aos termos de serviço de terceiros. O uso deste script é de inteira responsabilidade do usuário final.
Referências e documentação oficial
Para ir além deste tutorial, a documentação do Telethon é excepcionalmente bem escrita — consulte especialmente a seção de eventos para substituir o polling por listeners reativos, o que reduz o consumo de CPU do bot em até 90%:
Comentários
Comente só assim vamos crescer juntos!