import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
import time
import json
from threading import Thread
from pathlib import Path
# Настройки бота
VK_TOKEN = "ВАШ_ТОКЕН_ГРУППЫ" # Токен группы VK
GROUP_ID = 123456789 # ID вашей группы (без минуса)
MESSAGE_TEXT = "Привет! Подпишитесь на наше сообщество 😊" # Текст рассылки
ATTACHMENTS = "photo-123456789_456239048" # Прикрепления (опционально)
INTERVAL = 900 # Интервал рассылки в секундах (15 минут = 900 сек)
CHATS_FILE = "saved_chats.json" # Файл для сохранения ID бесед
class VkBot:
def __init__(self, token, group_id):
self.vk_session = vk_api.VkApi(token=token)
self.vk = self.vk_session.get_api()
self.longpoll = VkBotLongPoll(self.vk_session, group_id)
self.running = True
self.chat_ids = self.load_chats()
def load_chats(self):
"""Загружает сохранённые ID бесед из файла"""
try:
if Path(CHATS_FILE).exists():
with open(CHATS_FILE, 'r') as f:
return json.load(f)
except Exception as e:
print(f"Ошибка загрузки чатов: {e}")
return []
def save_chats(self):
"""Сохраняет ID бесед в файл"""
try:
with open(CHATS_FILE, 'w') as f:
json.dump(self.chat_ids, f)
except Exception as e:
print(f"Ошибка сохранения чатов: {e}")
def add_chat(self, chat_id):
"""Добавляет беседу в список, если её там нет"""
if chat_id not in self.chat_ids:
self.chat_ids.append(chat_id)
self.save_chats()
print(f"Добавлена новая беседа: {chat_id}")
def send_message(self, chat_id, message, attachments=None):
"""Отправляет сообщение в указанную беседу"""
try:
self.vk.messages.send(
chat_id=chat_id - 2000000000, # Преобразование ID беседы
message=message,
attachment=attachments,
random_id=0
)
print(f"Сообщение отправлено в беседу {chat_id}")
except Exception as e:
print(f"Ошибка при отправке в {chat_id}: {e}")
def start_polling(self):
"""Обрабатывает входящие сообщения и сохраняет беседы"""
while self.running:
try:
for event in self.longpoll.listen():
if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat:
chat_id = event.chat_id + 2000000000 # Получаем полный ID беседы
self.add_chat(chat_id)
except Exception as e:
print(f"Ошибка в longpoll: {e}")
time.sleep(10)
def start_auto_posting(self):
"""Запускает автоматическую рассылку"""
while self.running:
if self.chat_ids:
print(f"Начинаю рассылку в {len(self.chat_ids)} бесед...")
for chat_id in self.chat_ids:
self.send_message(chat_id, MESSAGE_TEXT, ATTACHMENTS)
time.sleep(1) # Небольшая задержка между отправками
else:
print("Нет сохранённых бесед для рассылки")
time.sleep(INTERVAL)
def stop(self):
"""Останавливает бота"""
self.running = False
self.save_chats()
if __name__ == "__main__":
bot = VkBot(VK_TOKEN, GROUP_ID)
# Запускаем longpoll в отдельном потоке
poll_thread = Thread(target=bot.start_polling)
poll_thread.start()
# Запускаем авто-рассылку в основном потоке
try:
bot.start_auto_posting()
except KeyboardInterrupt:
bot.stop()
poll_thread.join()