Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from telegram import Update
- from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes, CommandHandler
- from youtube_transcript_api import YouTubeTranscriptApi
- import re
- TOKEN = "8644668740:AAFJEgoiIx-KdngXFR4Oq-jFKuqBofDnza4" #Tú token, este es el mío revocado.
- user_data = {}
- def extraer_video_id(url):
- match = re.search(r"(?:v=|youtu\.be/)([a-zA-Z0-9_-]+)", url)
- if match:
- return match.group(1)
- return None
- async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
- user_id = update.message.from_user.id
- user_data[user_id] = {"estado": "esperando_url"}
- await update.message.reply_text(
- "📺 Envíame la URL del video de YouTube"
- )
- async def handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
- user_id = update.message.from_user.id
- texto = update.message.text
- if user_id not in user_data:
- user_data[user_id] = {"estado": "esperando_url"}
- estado = user_data[user_id]["estado"]
- # ESPERA URL
- if estado == "esperando_url":
- video_id = extraer_video_id(texto)
- if video_id:
- user_data[user_id]["video_id"] = video_id
- user_data[user_id]["estado"] = "esperando_palabra"
- await update.message.reply_text(
- "🔎 Ahora envía la palabra clave que quieres buscar"
- )
- else:
- await update.message.reply_text(
- "❌ No detecté una URL válida de YouTube"
- )
- # ESPERA PALABRA
- elif estado == "esperando_palabra":
- keyword = texto.lower()
- video_id = user_data[user_id]["video_id"]
- try:
- ytt_api = YouTubeTranscriptApi()
- transcript = ytt_api.fetch(video_id, languages=['es'])
- resultados = []
- for snippet in transcript:
- if keyword in snippet.text.lower():
- segundos = int(snippet.start)
- minutos = segundos // 60
- seg = segundos % 60
- tiempo = f"{minutos:02d}:{seg:02d}"
- link = f"https://youtube.com/watch?v={video_id}&t={segundos}"
- resultados.append(
- f"⏱ {tiempo}\n🔗 {link}\n{snippet.text}\n"
- )
- if resultados:
- respuesta = "\n".join(resultados[:10])
- else:
- respuesta = "❌ No encontré esa palabra en el video."
- await update.message.reply_text(respuesta)
- except:
- await update.message.reply_text(
- "⚠️ No pude obtener los subtítulos del video."
- )
- # volver a pedir URL
- user_data[user_id]["estado"] = "esperando_url"
- await update.message.reply_text(
- "📺 Puedes enviarme otro video."
- )
- app = ApplicationBuilder().token(TOKEN).build()
- app.add_handler(CommandHandler("start", start))
- app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handler))
- app.run_polling()
Advertisement