import sqlite3 import json import requests import logging logging.basicConfig(level=logging.DEBUG) def handle_webhook(data, key_callback_vk, db_name, vk_st_alone): # Преобразуем строку key_callback_vk в JSON key_callback_dict = json.loads(key_callback_vk) # Проверяем тип события if data['type'] == 'confirmation': # Получаем номер сообщества из данных group_id = str(data['group_id']) # Возвращаем соответствующий пароль return key_callback_dict.get(group_id, 'unknown') # Обработка события подписки на рассылку if data['type'] == 'message_allow': user_id = data['object']['user_id'] group_id = data['group_id'] print(f"User {user_id} subscribed to the mailing list of group {group_id}") # Записываем информацию о подписке в базу данных conn = sqlite3.connect(db_name) cursor = conn.cursor() # Проверяем, существует ли запись для данного пользователя cursor.execute("SELECT canal FROM contacts WHERE vk_id = ?", (user_id,)) result = cursor.fetchone() if result: # Обновляем запись, если пользователь уже существует canal_data = json.loads(result[0]) if result[0] else {} canal_data[str(group_id)] = '1' canal_json = json.dumps(canal_data) cursor.execute("UPDATE contacts SET canal = ? WHERE vk_id = ?", (canal_json, user_id)) else: # Создаем новую запись, если пользователь не существует canal_data = {str(group_id): '1'} canal_json = json.dumps(canal_data) cursor.execute("INSERT INTO contacts (vk_id, canal) VALUES (?, ?)", (user_id, canal_json)) conn.commit() conn.close() return 'ok' # Обработка события отписки от рассылки if data['type'] == 'message_deny': user_id = data['object']['user_id'] group_id = data['group_id'] print(f"User {user_id} unsubscribed from the mailing list of group {group_id}") # Записываем информацию об отписке в базу данных conn = sqlite3.connect(db_name) cursor = conn.cursor() # Проверяем, существует ли запись для данного пользователя cursor.execute("SELECT canal FROM contacts WHERE vk_id = ?", (user_id,)) result = cursor.fetchone() if result: # Обновляем запись, если пользователь уже существует canal_data = json.loads(result[0]) if result[0] else {} canal_data[str(group_id)] = '0' canal_json = json.dumps(canal_data) cursor.execute("UPDATE contacts SET canal = ? WHERE vk_id = ?", (canal_json, user_id)) else: # Создаем новую запись, если пользователь не существует canal_data = {str(group_id): '0'} canal_json = json.dumps(canal_data) cursor.execute("INSERT INTO contacts (vk_id, canal) VALUES (?, ?)", (user_id, canal_json)) conn.commit() conn.close() return 'ok' # Обработка события вступления в закрытую группу if data['type'] == 'group_join': user_id = data['object']['user_id'] group_id = data['group_id'] logging.info(f"User {user_id} requested to join group {group_id}") # Читаем информацию из базы данных conn = sqlite3.connect(db_name) cursor = conn.cursor() logging.debug(f"Connected to database: {db_name}") # Проверяем, существует ли запись для данного пользователя cursor.execute("SELECT * FROM contacts WHERE vk_id = ?", (user_id,)) result = cursor.fetchone() logging.debug(f"Query result for user {user_id}: {result}") if result: # Получаем данные из столбца "orders" (предполагается, что данные хранятся в 17-м столбце) orders_data = result[17] if result[17] else '{}' logging.debug(f"Raw orders data for user {user_id}: {orders_data}") try: orders_data_json = json.loads(orders_data) logging.debug(f"Parsed orders data for user {user_id}: {orders_data_json}") except json.JSONDecodeError as e: logging.error(f"Failed to parse JSON for user {user_id}: {e}") orders_data_json = {} group_status = orders_data_json.get(str(group_id), 'not') logging.info(f"Group status for user {user_id} in group {group_id}: {group_status}") if group_status == 'yes': # Одобряем запрос на вступление logging.info(f"Approving join request for user {user_id} in group {group_id}") approve_join_request(group_id, user_id, vk_st_alone) return 'ok' else: # Отклоняем запрос на вступление logging.info(f"Denying join request for user {user_id} in group {group_id}") return 'not' else: # Если запись не найдена, отклоняем запрос logging.info(f"No record found for user {user_id}. Denying join request.") return 'not' conn.close() logging.debug("Database connection closed") # Если тип события неизвестен, возвращаем ошибку logging.error(f"Unknown event type: {data['type']}") return 'unknown event', 400 def approve_join_request(group_id, user_id, vk_st_alone): url = f'https://api.vk.com/method/groups.approveRequest' params = { 'group_id': group_id, 'user_id': user_id, 'access_token': vk_st_alone, 'v': '5.131' } response = requests.get(url, params=params).json() logging.info(f"Approve request response: {response}") return response