Spaces:
Sleeping
Sleeping
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 | |