¿Te imaginas escribir desde el móvil “crea un archivo notas Comprar pan” y que aparezca en tu ordenador un archivo con ese texto? Se puede hacer con un bot de Telegram y un script de Python de unas 40 líneas. En este tutorial lo hacemos paso a paso, con todos los errores que me encontré por el camino y cómo solucionarlos.
Qué vas a necesitar
- Un Mac con Python 3 instalado (yo he usado Python 3.12)
- Una cuenta de Telegram en el móvil
Paso 1: crear el bot con BotFather
Todos los bots de Telegram se registran con BotFather, el bot oficial para esto. Solo lo necesitas una vez.
- En Telegram, busca @BotFather (con el check azul de verificado).
- Escribe
/newbot. - Elige un nombre para el bot (por ejemplo, “Mi bot de archivos”).
- Elige un nombre de usuario que termine en
bot(por ejemplo,mi_archivos_bot). - BotFather te enviará un token con este aspecto:
123456789:AAExampleTokenLooksLikeThisXXXXXXXXXXXX
⚠️ Copia el token completo, empezando por los números y con los dos puntos. Si copias solo la parte que empieza por AA..., Telegram lo rechazará con un error de “Invalid token”.
⚠️ No compartas nunca tu token. Quien lo tenga controla tu bot. Si se te escapa, en BotFather usa /mybots → tu bot → API Token → Revoke current token para generar uno nuevo.
Paso 2: preparar la carpeta e instalar la librería
Abre el Terminal del Mac y ejecuta:
bash
mkdir ~/telegram
cd ~/telegram
pip3 install python-telegram-bot
Paso 3: averiguar tu ID de Telegram
El bot solo debe obedecerte a ti. Para eso necesita tu ID numérico de Telegram.
Opción A (rápida): escribe a @userinfobot en Telegram y te responderá con tu Id. A veces estos bots fallan; si no te responde, usa la opción B.
Opción B (siempre funciona): usa tu propio bot para que te lo diga.
- Crea un archivo llamado
miid.pydentro de la carpetatelegramcon este contenido:
python
import os
from telegram.ext import ApplicationBuilder, MessageHandler, filters
async def responder(update, context):
await update.message.reply_text(f"Tu ID es: {update.effective_user.id}")
app = ApplicationBuilder().token(os.environ["TELEGRAM_TOKEN"]).build()
app.add_handler(MessageHandler(filters.ALL, responder))
app.run_polling()
- Ejecútalo con tu token completo:
bash
export TELEGRAM_TOKEN="NUMEROS:RESTO_DEL_TOKEN"
python3 miid.py
- En el móvil, abre tu bot, pulsa Start y escríbele “hola”. Te responderá con tu ID.
- Vuelve al Terminal y pulsa Ctrl + C para pararlo.
⚠️ No llames al archivo token.py (ni telegram.py, random.py, json.py…). Python ya tiene módulos internos con esos nombres y tu archivo los tapa, lo que provoca un error de importación circular que parece no tener sentido.
Paso 4: el script del bot
Crea un archivo bot.py dentro de la carpeta telegram con este código:
python
import os
import re
from datetime import datetime
from pathlib import Path
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, ContextTypes, filters
TOKEN = os.environ["TELEGRAM_TOKEN"]
MI_ID = int(os.environ["TELEGRAM_USER_ID"])
CARPETA = Path.home() / "Documents" / "telegram"
CARPETA.mkdir(parents=True, exist_ok=True)
async def manejar(update: Update, context: ContextTypes.DEFAULT_TYPE):
# Ignorar a cualquiera que no seas tú
if update.effective_user.id != MI_ID:
return
texto = update.message.text.strip()
m = re.match(r"(?i)^crea un archivo(?:\s+(\S+))?(?:\s+(.*))?$", texto, re.S)
if not m:
await update.message.reply_text(
'Escribe: "crea un archivo nombre contenido"'
)
return
# Limpiar el nombre para que no pueda salirse de la carpeta
nombre = re.sub(r"[^\w\-]", "", m.group(1) or "")
if not nombre:
nombre = datetime.now().strftime("archivo-%Y%m%d-%H%M%S")
contenido = m.group(2) or ""
ruta = CARPETA / f"{nombre}.txt"
if ruta.exists():
await update.message.reply_text(f"Ya existe: {ruta}")
return
ruta.write_text(contenido + "\n", encoding="utf-8")
await update.message.reply_text(f"Archivo creado: {ruta}")
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, manejar))
app.run_polling()
Paso 5: ponerlo en marcha
En el Terminal, dentro de la carpeta telegram, ejecuta (con tus datos):
bash
export TELEGRAM_TOKEN="NUMEROS:RESTO_DEL_TOKEN"
export TELEGRAM_USER_ID="tu_id"
python3 bot.py
Si no aparece ningún error, el bot está escuchando. Deja esa ventana del Terminal abierta.
Paso 6: probarlo desde el móvil
Abre tu bot en Telegram y escríbele:
crea un archivo notas Comprar pan y leche
El bot responderá con la ruta, y en tu Mac tendrás un archivo notas.txt dentro de Documentos/telegram con ese texto.
Cómo funciona el formato:
- La primera palabra después de “archivo” es el nombre (sin espacios; usa guiones:
lista-compra). - Todo lo que escribas después del nombre es el contenido, y puede tener varias líneas.
- Si solo escribes
crea un archivo, se crea uno con la fecha y la hora como nombre. - Si el archivo ya existe, el bot te avisa y no lo sobrescribe.
Errores frecuentes
InvalidToken/ “Not Found”: el token está incompleto o mal copiado. Cópialo entero desde BotFather, con los números y los dos puntos del principio.ImportError ... circular import: has llamado a tu scripttoken.py(o con otro nombre reservado). Renómbralo y borra la carpeta__pycache__.- El bot arranca pero no responde: revisa que
TELEGRAM_USER_IDsea tu ID correcto, porque el bot ignora a cualquier otra cuenta. - Los
exportdesaparecen: si cierras el Terminal, tienes que volver a escribirlos antes de lanzarpython3 bot.py.
Seguridad: lo importante
- La comprobación del ID es imprescindible. Sin ella, cualquiera que encuentre tu bot podría crear archivos en tu ordenador.
- El script limpia el nombre del archivo y solo escribe dentro de una carpeta fija. No ejecuta comandos.
- Mantén el token en secreto y no lo pegues en capturas ni en foros.
- El Mac tiene que estar encendido y con el script en marcha para que el bot responda.