45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
import aiohttp
|
|
from aiogram import Dispatcher
|
|
from aiogram.types import Message
|
|
|
|
from auth import AUTHORIZED_USERS, is_user_auth
|
|
from locks_api import get_lock_by_label
|
|
|
|
|
|
def register_open_door_handler(dp: Dispatcher):
|
|
@dp.message()
|
|
async def open_door_handler(msg: Message):
|
|
user_id = msg.from_user.id
|
|
if not is_user_auth(user_id):
|
|
await msg.answer("Доступ запрещён. Предоставьте номер телефона.")
|
|
return
|
|
|
|
user_data = AUTHORIZED_USERS.get(user_id)
|
|
if not user_data:
|
|
await msg.answer("Ошибка авторизации.")
|
|
return
|
|
|
|
lock_info = await get_lock_by_label(msg.text)
|
|
if not lock_info:
|
|
await msg.answer("Информация по замку не найдена.")
|
|
return
|
|
|
|
url = f"http://{lock_info['ip']}/cgi-bin/ext"
|
|
auth_info = aiohttp.BasicAuth(login="ext", password=lock_info["code"])
|
|
payload = f"CARD={user_data['card']}&DIR=0"
|
|
headers = {"Content-Type": "application/x-www-form-urlencoded"}
|
|
|
|
try:
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.post(
|
|
url, auth=auth_info, data=payload, headers=headers, timeout=5
|
|
) as response:
|
|
if response.status == 200:
|
|
await msg.answer("Открыто")
|
|
else:
|
|
await msg.answer(
|
|
f"Ошибка при открытии замка. Код ошибки: {response.status}"
|
|
)
|
|
except Exception as e:
|
|
await msg.answer(f"Исключение: {str(e)}")
|