Бот ВК не работает в других беседах
У меня есть бот, который кикает, мутит и банит пользователей.
В чате группы бот работает и всё отлично, но если его добавить в другую беседу, дать доступ к переписке и админку, то бот молчит и не реагирует на сообщения.
Вот кусок кода, отвечающий за чтение сообщений и ответов на них:
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.from_chat:
user_id = event.user_id
peer_id = event.peer_id # Получаем peer_id (может быть как chat_id, так и user_id)
message_text = event.text # Получаем текст сообщения
# Выводим сообщение в консоль
print(f"Получено сообщение от {user_id} в {'личных сообщениях' if peer_id < 2000000000 else 'беседе'}: {message_text}")
# Определяем chat_id
if peer_id >= 2000000000: # Это беседа
chat_id = peer_id - 2000000000
else: # Это личные сообщения
chat_id = None # ЛС не имеют chat_id
# Выводим сообщение в консоль
# Проверка нажатия кнопки "чеклист"
if event.text.lower() == "чеклист":
try:
if peer_id >= 2000000000: # Это беседа
chat_id = peer_id - 2000000000
else: # Это личные сообщения
chat_id = None # ЛС не имеют chat_id
members = get_chat_members(chat_id) if chat_id is not None else []
member_info = []
for member in members:
user_info = vk_bot.users.get(user_ids=member['id'])[0]
member_info.append(
f"ID: {user_info['id']}, Ник: {user_info['first_name']} {user_info['last_name']}")
# Проверка, есть ли участники
if not member_info:
response_message = "Участники беседы не найдены."
else:
response_message = "\n".join(member_info)
vk_bot.messages.send(
peer_id=peer_id,
message=f"Участники беседы:\n{response_message}",
random_id=0
)
except Exception as e:
vk_bot.messages.send(
peer_id=peer_id,
message="Произошла ошибка при получении участников беседы.",
random_id=0
)
continue
# Проверка нажатия кнопки "админка"
if event.text.lower().startswith(
"админка ") and user_id == 771857583: # Только главный администратор может добавлять
try:
target_user_id = int(event.text.split()[1])
add_admin(target_user_id) # Добавляем пользователя в администраторы
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} теперь администратор.",
random_id=0
)
except (IndexError, ValueError):
vk_bot.messages.send(
peer_id=peer_id,
message="Пожалуйста, укажите корректный ID пользователя для добавления в администраторы.",
random_id=0
)
continue
# Проверка нажатия кнопки "адмлист"
if event.text.lower() == "адмлист":
admin_list = get_admins_list()
if not admin_list:
response_message = "Нет администраторов."
else:
response_message = "\n".join([f"ID: {admin_id}" for admin_id in admin_list])
vk_bot.messages.send(
peer_id=peer_id,
message=f"Список администраторов:\n{response_message}",
random_id=0
)
continue
if event.type == VkEventType.MESSAGE_NEW and event.to_me: # Проверяем, что это новое сообщение
user_id = event.user_id # Получаем ID пользователя
message_id = event.message_id # Получаем ID сообщения
# Проверка на мутацию
if is_user_muted(user_id):
try:
vk_session.method('messages.delete',
{'message_ids': message_id, 'delete_for_all': 1}) # Удаляем сообщение для всех
print(f"Сообщение от пользователя {user_id} удалено для всех, так как он замучен.")
except Exception as e:
print(f"Ошибка при удалении сообщения пользователя {user_id}: {e}")
# Проверка на бан
if user_id in banned_users:
if chat_id is not None:
vk_bot.messages.removeChatUser(chat_id=chat_id, user_id=user_id)
continue
# Проверка на бан
if user_id in banned_users:
print(f"Пользователь {user_id} (сообщение: '{message_text}') - забанен.")
if peer_id >= 2000000000: # Проверяем, что это беседа
vk_bot.messages.removeChatUser(chat_id=peer_id - 2000000000, user_id=user_id)
continue # Пропускаем дальнейшую обработку для забаненного пользователя
# Вывод информации в консоль
print(f"Пользователь {user_id} отправил сообщение: '{message_text}'")
print(f"Пользователь {user_id} не забанен.")
if event.text.lower().startswith(("мут ", "бан ", "кик ")):
if is_admin(user_id): # Если пользователь администратор
try:
target_user_id = int(event.text.split()[1])
if not is_user_in_chat(target_user_id, chat_id):
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} не найден в чате.",
random_id=0
)
continue
# Обработка других команд, например, бана
if message_text.lower().startswith("бан "):
if is_admin(user_id):
try:
target_user_id = int(message_text.split()[1])
banned_users.add(target_user_id) # Добавляем пользователя в список забаненных
save_banned_users(banned_users) # Сохраняем обновленный список в файл
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} был забанен.",
random_id=0
)
print(f"Пользователь {target_user_id} был забанен администратором {user_id}.")
# Кикаем пользователя из беседы
if peer_id >= 2000000000: # Проверяем, что это беседа
vk_bot.messages.removeChatUser(chat_id=peer_id - 2000000000, user_id=target_user_id)
except (IndexError, ValueError):
vk_bot.messages.send(
peer_id=peer_id,
message="Пожалуйста, укажите корректный ID пользователя для бана.",
random_id=0
)
continue
# Пример вызова функции мутации
if event.text.lower().startswith("мут "):
if is_admin(user_id): # Если пользователь администратор
try:
parts = event.text.split()
target_user_id = int(parts[1])
mute_duration = int(parts[2]) * 60 # Переводим минуты в секунды
if not is_user_in_chat(target_user_id, chat_id):
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} не найден в чате.",
random_id=0
)
continue
mute_user(target_user_id) # Добавляем пользователя в файл мутаций
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} замучен на {parts[2]} минут.",
random_id=0
)
print(f"Пользователь {target_user_id} замучен на {parts[2]} минут.")
# Размучивание через mute_duration
threading.Timer(mute_duration, unmute_user,
args=(target_user_id,)).start() # Размучиваем через заданное время
continue
except (IndexError, ValueError):
vk_bot.messages.send(
peer_id=peer_id,
message="Пожалуйста, укажите корректный ID пользователя и время в минутах для выполнения команды.",
random_id=0
)
continue
else:
vk_bot.messages.send(
peer_id=peer_id,
message="У вас нет прав для выполнения этой команды.",
random_id=0
)
continue
elif event.text.lower().startswith("кик "):
kick_user(target_user_id, chat_id)
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} был исключен из беседы.",
random_id=0
)
continue
except (IndexError, ValueError):
vk_bot.messages.send(
peer_id=peer_id,
message="Пожалуйста, укажите корректный ID пользователя для выполнения команды.",
random_id=0
)
continue
else:
vk_bot.messages.send(
peer_id=peer_id,
message="У вас нет прав для выполнения этой команды.",
random_id=0
)
continue
# Пример вызова функции размутирования
if event.text.lower().startswith("размут "):
if is_admin(user_id): # Если пользователь администратор
try:
target_user_id = int(event.text.split()[1])
if not is_user_in_chat(target_user_id, chat_id):
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} не найден в чате.",
random_id=0
)
continue
unmute_user(target_user_id) # Убираем пользователя из файла мутаций
vk_bot.messages.send(
peer_id=peer_id,
message=f"Пользователь {target_user_id} размучен.",
random_id=0
)
print(f"Пользователь {target_user_id} размучен.")
continue
except (IndexError, ValueError):
vk_bot.messages.send(
peer_id=peer_id,
message="Пожалуйста, укажите корректный ID пользователя для выполнения команды.",
random_id=0
)
continue
else:
vk_bot.messages.send(
peer_id=peer_id,
message="У вас нет прав для выполнения этой команды.",
random_id=0
)
continue