├── requirements.txt ├── vercel.json ├── movies_scrapers.py └── index.py /requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4==4.11.1 2 | python_telegram_bot==13.14 3 | requests==2.28.1 4 | Flask==2.2.2 5 | werkzeug==2.0.3 6 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "version": 2, 4 | "builds": [ 5 | { 6 | "src": "./index.py", 7 | "use": "@vercel/python" 8 | } 9 | ], 10 | "routes": [ 11 | { 12 | "src": "/(.*)", 13 | "dest": "/" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /movies_scrapers.py: -------------------------------------------------------------------------------- 1 | 2 | import requests 3 | from bs4 import BeautifulSoup 4 | 5 | 6 | url_list = {} 7 | api_key = "179bafbc18435031b4e82a09ca874db866f59563" 8 | 9 | 10 | def search_movies(query): 11 | movies_list = [] 12 | movies_details = {} 13 | website = BeautifulSoup(requests.get(f"https://mkvcinemas.skin/?s={query.replace(' ', '+')}").text, "html.parser") 14 | movies = website.find_all("a", {'class': 'ml-mask jt'}) 15 | for movie in movies: 16 | if movie: 17 | movies_details["id"] = f"link{movies.index(movie)}" 18 | movies_details["title"] = movie.find("span", {'class': 'mli-info'}).text 19 | url_list[movies_details["id"]] = movie['href'] 20 | movies_list.append(movies_details) 21 | movies_details = {} 22 | return movies_list 23 | 24 | 25 | def get_movie(query): 26 | movie_details = {} 27 | movie_page_link = BeautifulSoup(requests.get(f"{url_list[query]}").text, "html.parser") 28 | if movie_page_link: 29 | title = movie_page_link.find("div", {'class': 'mvic-desc'}).h3.text 30 | movie_details["title"] = title 31 | img = movie_page_link.find("div", {'class': 'mvic-thumb'})['data-bg'] 32 | movie_details["img"] = img 33 | links = movie_page_link.find_all("a", {'rel': 'noopener', 'data-wpel-link': 'internal'}) 34 | final_links = {} 35 | for i in links: 36 | url = f"https://urlshortx.com/api?api={api_key}&url={i['href']}" 37 | response = requests.get(url) 38 | link = response.json() 39 | final_links[f"{i.text}"] = link['shortenedUrl'] 40 | movie_details["links"] = final_links 41 | return movie_details 42 | 43 | -------------------------------------------------------------------------------- /index.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | from io import BytesIO 4 | from queue import Queue 5 | import requests 6 | from flask import Flask, request 7 | from telegram import Bot, Update, InlineKeyboardButton, InlineKeyboardMarkup 8 | from telegram.ext import CommandHandler, MessageHandler, Filters, CallbackQueryHandler, Dispatcher 9 | from movies_scrapers import search_movies, get_movie 10 | 11 | 12 | TOKEN = os.getenv("7531633114:AAGKHTO_mCMiBuxXBfPG-n8tB0Zw1iWKaTk") 13 | URL = os.getenv("https://t.me/MovieDnd_bot") 14 | bot = Bot(TOKEN) 15 | 16 | 17 | def welcome(update, context) -> None: 18 | update.message.reply_text(f"Hello {update.message.from_user.first_name}, Welcome to SB Movies.\n" 19 | f"🔥 Download Your Favourite Movies For 💯 Free And 🍿 Enjoy it.") 20 | update.message.reply_text("👇 Enter Movie Name 👇") 21 | 22 | 23 | def find_movie(update, context): 24 | search_results = update.message.reply_text("Processing...") 25 | query = update.message.text 26 | movies_list = search_movies(query) 27 | if movies_list: 28 | keyboards = [] 29 | for movie in movies_list: 30 | keyboard = InlineKeyboardButton(movie["title"], callback_data=movie["id"]) 31 | keyboards.append([keyboard]) 32 | reply_markup = InlineKeyboardMarkup(keyboards) 33 | search_results.edit_text('Search Results...', reply_markup=reply_markup) 34 | else: 35 | search_results.edit_text('Sorry 🙏, No Result Found!\nCheck If You Have Misspelled The Movie Name.') 36 | 37 | 38 | def movie_result(update, context) -> None: 39 | query = update.callback_query 40 | s = get_movie(query.data) 41 | response = requests.get(s["img"]) 42 | img = BytesIO(response.content) 43 | query.message.reply_photo(photo=img, caption=f"🎥 {s['title']}") 44 | link = "" 45 | links = s["links"] 46 | for i in links: 47 | link += "🎬" + i + "\n" + links[i] + "\n\n" 48 | caption = f"⚡ Fast Download Links :-\n\n{link}" 49 | if len(caption) > 4095: 50 | for x in range(0, len(caption), 4095): 51 | query.message.reply_text(text=caption[x:x+4095]) 52 | else: 53 | query.message.reply_text(text=caption) 54 | 55 | 56 | def setup(): 57 | update_queue = Queue() 58 | dispatcher = Dispatcher(bot, update_queue, use_context=True) 59 | dispatcher.add_handler(CommandHandler('start', welcome)) 60 | dispatcher.add_handler(MessageHandler(Filters.text, find_movie)) 61 | dispatcher.add_handler(CallbackQueryHandler(movie_result)) 62 | return dispatcher 63 | 64 | 65 | app = Flask(__name__) 66 | 67 | 68 | @app.route('/') 69 | def index(): 70 | return 'Hello World!' 71 | 72 | 73 | @app.route('/{}'.format(TOKEN), methods=['GET', 'POST']) 74 | def respond(): 75 | update = Update.de_json(request.get_json(force=True), bot) 76 | setup().process_update(update) 77 | return 'ok' 78 | 79 | 80 | @app.route('/setwebhook', methods=['GET', 'POST']) 81 | def set_webhook(): 82 | s = bot.setWebhook('{URL}/{HOOK}'.format(URL=URL, HOOK=TOKEN)) 83 | if s: 84 | return "webhook setup ok" 85 | else: 86 | return "webhook setup failed" 87 | --------------------------------------------------------------------------------