up_fail / webhook_handler.py
DmitrMakeev's picture
Update webhook_handler.py
0ce3faf verified
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