- 23
- 7
Описание
Мой скрипт — это программа для автоматической массовой отправки сообщений в чаты социальных сетей (например, Telegram). Она позволяет:✅ Рассылать одно сообщение сразу в несколько чатов
✅ Настраивать интервалы между отправками
✅ Работать в фоновом режиме
✅ Останавливать рассылку горячей клавишей
Работает он, только в:
Microsoft Edge
Инструкция
Настройка координат
Перед началом работы нужно указать, где находится поле ввода сообщения в вашем браузере:- Автоматическое определение:
- Нажмите "Определить координаты"
- Наведите курсор на поле ввода чата и нажмите F1
- Ручной ввод:
- Нажмите "Ручной ввод"
- Введите координаты X и Y вручную
Заполнение данных
- Ссылки на чаты — вставьте ссылки на чаты (каждая с новой строки).
- Текст сообщения — введите текст, который нужно отправить.
- Интервал (сек) — задержка между сообщениями в одном чате (рекомендуется 0.5–2 сек).
- Задержка между чатами (сек) — пауза при переключении между вкладками (рекомендуется 1–3 сек).
Запуск рассылки
- Нажмите "Начать отправку".
- Подтвердите действие в диалоговом окне.
- Программа откроет все чаты в браузере и начнет рассылку.
- Нажмите кнопку "Остановить" в программе.
- Или используйте горячую клавишу — Tab + P.
Важные замечания
🔹 Браузер должен быть открыт на переднем плане.🔹 Не двигайте мышку во время работы скрипта (может сбить координаты).
🔹 Избегайте слишком маленьких задержек (может привести к ошибкам или банам).
🔹 Перед массовой рассылкой протестируйте на 1–2 чатах.
Ниже информация с исходным кодом(в коде есть пометки для каждого действия скрипта) и как запустить скрипт в формате py, если BlastHak не даст загрузить exe файл:
Запуск в формате py:
Убедитесь, что установлен Python 3.8+.Запуск в формате py:
Установите зависимости:
зависимости:
pip install pyautogui pyperclip keyboard win32gui
Исходный код (с детальными пометками, работа скрипта расписана по максемуму):
От себя:
Можете с этим скриптом делать все что хотите, главное указывайте мою тему, как автора исходного кода.
Исходный код:
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext, simpledialog
import webbrowser
import time
import pyautogui
import pyperclip
from threading import Thread, Event
import win32gui
import win32con
import json
import os
import keyboard
import sys
class AdvancedSocialFlooder:
def __init__(self, root):
self.root = root
self.root.title("Автопиар by Sanek Farmila (Ктатопалка ку)")
self.root.geometry("900x750")
self.root.configure(bg="#f0f0f0")
# Координаты по умолчанию
self.click_x = 1065
self.click_y = 987
self.coords_file = "coords.json"
self.coords_event = Event()
self.stop_hotkey = "tab+p"
# Загрузка сохраненных координат
self.load_coordinates()
# Переменные
self.is_running = False
self.message_count = 0
self.current_chat_index = 0
# Создание интерфейса
self.create_widgets()
# Настройки pyautogui
pyautogui.PAUSE = 0.1
pyautogui.FAILSAFE = True
# Обработчик горячих клавиш
keyboard.add_hotkey(self.stop_hotkey, self.stop_flooding)
def load_coordinates(self):
"""Загружает сохраненные координаты из файла"""
if os.path.exists(self.coords_file):
try:
with open(self.coords_file, 'r') as f:
data = json.load(f)
self.click_x = data.get('x', 1065)
self.click_y = data.get('y', 987)
except:
pass
def save_coordinates(self):
"""Сохраняет координаты в файл"""
with open(self.coords_file, 'w') as f:
json.dump({'x': self.click_x, 'y': self.click_y}, f)
def create_widgets(self):
# Основной фрейм
main_frame = ttk.Frame(self.root, padding=15)
main_frame.pack(fill='both', expand=True)
# Фрейм координат
coords_frame = ttk.LabelFrame(main_frame, text="Настройка координат", padding=10)
coords_frame.pack(fill='x', pady=5)
ttk.Label(coords_frame, text="Текущие координаты (X,Y):").pack(side='left')
self.coords_label = ttk.Label(coords_frame, text=f"{self.click_x}, {self.click_y}")
self.coords_label.pack(side='left', padx=5)
ttk.Button(
coords_frame,
text="Определить координаты",
command=self.set_coordinates
).pack(side='right')
ttk.Button(
coords_frame,
text="Ручной ввод",
command=self.manual_coordinates
).pack(side='right', padx=5)
# Список чатов
ttk.Label(main_frame, text="Ссылки на чаты (каждая с новой строки):", font=('Arial', 10)).pack(anchor='w')
self.chats_text = scrolledtext.ScrolledText(main_frame, height=8, wrap=tk.WORD, font=('Arial', 9))
self.chats_text.pack(fill='x', pady=5)
# Текст сообщения
ttk.Label(main_frame, text="Текст сообщения:", font=('Arial', 10)).pack(anchor='w')
self.message_text = scrolledtext.ScrolledText(main_frame, height=6, wrap=tk.WORD, font=('Arial', 9))
self.message_text.pack(fill='x', pady=5)
# Настройки
settings_frame = ttk.Frame(main_frame)
settings_frame.pack(fill='x', pady=10)
ttk.Label(settings_frame, text="Интервал (сек):", font=('Arial', 10)).pack(side='left', padx=5)
self.interval_entry = ttk.Entry(settings_frame, width=8, font=('Arial', 10))
self.interval_entry.insert(0, "0.5") # Увеличено минимальное значение по умолчанию
self.interval_entry.pack(side='left', padx=5)
ttk.Label(settings_frame, text="Задержка между чатами (сек):", font=('Arial', 10)).pack(side='left', padx=5)
self.delay_entry = ttk.Entry(settings_frame, width=8, font=('Arial', 10))
self.delay_entry.insert(0, "1.0") # Увеличено минимальное значение по умолчанию
self.delay_entry.pack(side='left', padx=5)
# Кнопки управления
btn_frame = ttk.Frame(main_frame)
btn_frame.pack(fill='x', pady=10)
self.start_btn = ttk.Button(
btn_frame,
text="Начать отправку",
command=self.start_flooding,
style='Accent.TButton'
)
self.start_btn.pack(side='left', expand=True, padx=5)
self.stop_btn = ttk.Button(
btn_frame,
text="Остановить",
command=self.stop_flooding,
state='disabled'
)
self.stop_btn.pack(side='left', expand=True, padx=5)
# Статус
self.status_var = tk.StringVar(value="Готов к работе")
status_label = ttk.Label(
main_frame,
textvariable=self.status_var,
font=('Arial', 10),
background="#f0f0f0"
)
status_label.pack(fill='x', pady=5)
# Лог
ttk.Label(main_frame, text="Лог выполнения:", font=('Arial', 10)).pack(anchor='w')
self.log_text = scrolledtext.ScrolledText(
main_frame,
height=10,
wrap=tk.WORD,
state='disabled',
font=('Arial', 9)
)
self.log_text.pack(fill='both', expand=True)
# Горячие клавиши
hotkey_frame = ttk.Frame(main_frame)
hotkey_frame.pack(fill='x', pady=5)
ttk.Label(hotkey_frame, text=f"Горячая клавиша остановки: {self.stop_hotkey}").pack(side='left')
# Стилизация
self.style = ttk.Style()
self.style.configure('Accent.TButton', font=('Arial', 10, 'bold'), foreground='white', background='#3498db')
self.style.map('Accent.TButton', background=[('active', '#2980b9')])
def set_coordinates(self):
"""Определяет координаты автоматически"""
self.log("Наведите курсор на поле ввода чата и нажмите F1 (в течение 10 секунд)")
self.status_var.set("Ожидание определения координат...")
def on_f1_pressed(e):
if e.event_type == keyboard.KEY_DOWN and e.name == 'f1':
self.click_x, self.click_y = pyautogui.position()
self.coords_label.config(text=f"{self.click_x}, {self.click_y}")
self.save_coordinates()
self.root.after(0, lambda: self.status_var.set("Координаты сохранены!"))
self.log(f"Новые координаты: {self.click_x}, {self.click_y}")
keyboard.unhook_all()
self.coords_event.set()
keyboard.on_press(on_f1_pressed)
self.coords_event.clear()
def timeout():
time.sleep(10)
if not self.coords_event.is_set():
keyboard.unhook_all()
self.root.after(0, lambda: self.status_var.set("Время вышло!"))
Thread(target=timeout, daemon=True).start()
def manual_coordinates(self):
"""Ручной ввод координат"""
x = simpledialog.askinteger("Координата X", "Введите X координату:", parent=self.root)
y = simpledialog.askinteger("Координата Y", "Введите Y координату:", parent=self.root)
if x is not None and y is not None:
self.click_x = x
self.click_y = y
self.coords_label.config(text=f"{x}, {y}")
self.save_coordinates()
self.log(f"Координаты изменены: {x}, {y}")
def log(self, message):
"""Потокобезопасное логирование"""
def _log():
self.log_text.config(state='normal')
self.log_text.insert('end', f"{time.strftime('%H:%M:%S')} - {message}\n")
self.log_text.see('end')
self.log_text.config(state='disabled')
self.root.after(0, _log)
def start_flooding(self):
# Получаем данные
chat_urls = [url.strip() for url in self.chats_text.get("1.0", "end").split('\n') if url.strip()]
message = self.message_text.get("1.0", "end").strip()
try:
interval = max(0.5, float(self.interval_entry.get())) # Минимум 0.5 секунды
delay = max(1.0, float(self.delay_entry.get())) # Минимум 1 секунда
except ValueError:
messagebox.showerror("Ошибка", "Введите корректные числовые значения (мин. 0.5 для интервала, 1.0 для задержки)")
return
if not chat_urls:
messagebox.showerror("Ошибка", "Добавьте ссылки на чаты")
return
if not message:
messagebox.showerror("Ошибка", "Введите текст сообщения")
return
# Подтверждение
if not messagebox.askyesno("Подтверждение",
f"Начать отправку в {len(chat_urls)} чатов?\n\n"
f"Интервал: {interval} сек\n"
f"Для остановки нажмите {self.stop_hotkey}"):
return
# Настройка интерфейса
self.is_running = True
self.message_count = 0
self.current_chat_index = 0
self.start_btn.config(state='disabled')
self.stop_btn.config(state='normal')
self.status_var.set(f"Работаю... 0/{len(chat_urls)} чатов")
# Открываем все чаты
for url in chat_urls:
webbrowser.open(url)
time.sleep(1) # Увеличенная задержка между открытием вкладок
# Запускаем поток
Thread(target=self.flood_messages, args=(chat_urls, message, interval, delay), daemon=True).start()
def stop_flooding(self):
if not self.is_running:
return
self.is_running = False
self.status_var.set("Остановлено пользователем")
self.start_btn.config(state='normal')
self.stop_btn.config(state='disabled')
self.log(f"Работа остановлена (нажата {self.stop_hotkey})")
def flood_messages(self, chat_urls, message, interval, delay):
time.sleep(5) # Увеличенное время на открытие всех вкладок
try:
while self.is_running:
for i, url in enumerate(chat_urls):
if not self.is_running:
break
# Обновляем статус в главном потоке
self.root.after(0, lambda idx=i: self.status_var.set(f"Работаю... {idx+1}/{len(chat_urls)} чатов"))
try:
# Переключаемся на нужную вкладку
self.switch_to_tab(i)
time.sleep(delay) # Увеличенная задержка перед отправкой
# Отправляем сообщение (только один раз)
self.send_social_message(message)
self.message_count += 1
self.log(f"Отправлено в чат {i+1}")
# Ждем интервал
time.sleep(interval)
except Exception as e:
self.log(f"Ошибка в чате {i+1}: {str(e)}")
continue
if not self.is_running:
break
except Exception as e:
self.log(f"Критическая ошибка: {str(e)}")
self.root.after(0, self.stop_flooding)
def switch_to_tab(self, tab_index):
"""Переключается между вкладками браузера"""
try:
browser_hwnd = self.get_browser_window()
if browser_hwnd:
win32gui.ShowWindow(browser_hwnd, win32con.SW_RESTORE)
win32gui.SetForegroundWindow(browser_hwnd)
time.sleep(0.5) # Увеличенная задержка
pyautogui.hotkey('ctrl', str(tab_index + 1))
time.sleep(1.0) # Увеличенная задержка после переключения
except Exception as e:
raise Exception(f"Ошибка переключения вкладки: {str(e)}")
def get_browser_window(self):
"""Находит окно браузера"""
def callback(hwnd, hwnds):
if win32gui.IsWindowVisible(hwnd):
title = win32gui.GetWindowText(hwnd).lower()
if any(browser in title for browser in ['chrome', 'firefox', 'edge', 'opera']):
hwnds.append(hwnd)
return True
hwnds = []
win32gui.EnumWindows(callback, hwnds)
return hwnds[0] if hwnds else None
def send_social_message(self, message):
"""Отправляет сообщение в активном чате (только один раз)"""
try:
# Копируем сообщение
pyperclip.copy(message)
time.sleep(0.3) # Увеличенная задержка
# Кликаем по сохраненным координатам
pyautogui.click(self.click_x, self.click_y)
time.sleep(0.3) # Увеличенная задержка
# Вставляем и отправляем
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.3) # Увеличенная задержка
pyautogui.press('enter')
time.sleep(0.5) # Увеличенная задержка после отправки
except Exception as e:
raise Exception(f"Ошибка отправки: {str(e)}")
def on_closing(self):
"""Обработчик закрытия окна"""
self.stop_flooding()
self.root.destroy()
keyboard.unhook_all()
sys.exit()
if __name__ == "__main__":
root = tk.Tk()
app = AdvancedSocialFlooder(root)
root.protocol("WM_DELETE_WINDOW", app.on_closing)
root.mainloop()
От себя: