Phone number check was added. Project structure was updated

devel
dl 2025-05-14 17:55:26 +05:00
parent 5e0c098758
commit 6256351aad
8 changed files with 148 additions and 54 deletions

View File

@ -19,4 +19,9 @@ AUTH_API - уникальный набор символов, для взаимо
## TODO ## TODO
- [x] Написать базовый функционал - [x] Написать базовый функционал
- [ ] Создать соотношение типа "id_пользователя: досутп_к_замку:" ~~- [ ] Создать соотношение типа "id_пользователя: досутп_к_замку:"~~
- [x] Сделать проверку пользователей по их номеру телефона ...
- [ ] Создать и парсить json с информацией о пользователях и их номерах
- [ ] Проверять, является ли пользователь администратором, если является
выводить дополнительную кнопку, предлагающую добавить номер в БД
- [ ] Сделать логирование о том, что кто-то открыл дверь в конкретное время

23
auth.py 100644
View File

@ -0,0 +1,23 @@
ALLOWED_PHONE_NUMBERS = [
"+79000959392",
]
AUTHORIZED_USERS = {}
def check_user_auth(phone: str) -> bool:
return phone in ALLOWED_PHONE_NUMBERS
def authorize_user(user_id: int, phone: str) -> bool:
if check_user_auth(phone):
AUTHORIZED_USERS[user_id] = phone
print(f"{user_id} авторизован с номером: {phone}")
return True
else:
print(f"Пользователь {user_id} пытался авторизоваться с номером {phone}")
return False
def is_user_auth(user_id: int) -> bool:
return user_id in AUTHORIZED_USERS

View File

@ -0,0 +1,9 @@
from .start_handler import register_start_handler
from .contact_handler import register_contact_handler
from .doors_handler import register_open_door_handler
def register_all_handlers(dp):
register_start_handler(dp)
register_contact_handler(dp)
register_open_door_handler(dp)

View File

@ -0,0 +1,25 @@
from aiogram import Dispatcher, F
from aiogram.types import Message
from keyboard import get_keyboard
from auth import authorize_user
def register_contact_handler(dp: Dispatcher):
@dp.message(F.contact)
async def contact_handler(msg: Message):
user_id = msg.from_user.id
if msg.contact is None:
await msg.answer("Ошибка: номер телефона не получен")
return
phone = msg.contact.phone_number
print(f"Номер {phone} получен от пользователя {user_id}")
if not authorize_user(user_id, phone):
await msg.answer("Доступ запрещен, номер не авторизирован")
return
await msg.answer(
"Номер подтвержден", reply_markup=get_keyboard(authorized=True)
)

View File

@ -0,0 +1,36 @@
import asyncio
import requests
from os import getenv
from aiogram import Dispatcher, F
from aiogram.types import Message
from auth import is_user_auth
def register_open_door_handler(dp: Dispatcher):
@dp.message(F.text == "Открыть дверь")
async def open_door_handler(msg: Message):
user_id = msg.from_user.id
if not is_user_auth(user_id):
await msg.answer(
"Доступ запрщен. Необходимо предоставить свой номер телефона."
)
return
url = f"http://{getenv('LOCK_IP')}/cgi-bin/ext"
auth = ("ext", f"{getenv('AUTH_API')}")
payload = f"CARD={getenv('CARD_ID')}&DIR=0"
headers = {"Content-Type": "application/x-www-form-urlencoded"}
try:
response = await asyncio.to_thread(
requests.post, url, auth=auth, data=payload, headers=headers, timeout=5
)
if response.status_code == 200:
await msg.answer("Открыто")
else:
await msg.answer(
f"Ошибка при открытии замка. Код ошибки: {response.status_code}"
)
except Exception as e:
await msg.answer(f"Исключение: {str(e)}")

View File

@ -0,0 +1,21 @@
from aiogram import Dispatcher, F
from aiogram.types import Message
from aiogram.filters import CommandStart
from keyboard import get_keyboard
from auth import is_user_auth
def register_start_handler(dp: Dispatcher):
@dp.message(CommandStart())
async def command_start_handler(msg: Message):
user_id = msg.from_user.id
if is_user_auth(user_id):
await msg.answer(
"Авторизация прошла успешно", reply_markup=get_keyboard(authorized=True)
)
else:
await msg.answer(
"Для пользования ботом, предоставьте номер телефона",
reply_markup=get_keyboard(authorized=False),
)

11
keyboard.py 100755
View File

@ -0,0 +1,11 @@
from aiogram.utils.keyboard import ReplyKeyboardBuilder, KeyboardButton
def get_keyboard(authorized: bool):
kb = ReplyKeyboardBuilder()
if authorized:
kb.button(text="Открыть дверь")
else:
kb.add(KeyboardButton(text="Поделиться контактом", request_contact=True))
return kb.as_markup(resize_keyboard=True)

48
main.py
View File

@ -1,18 +1,13 @@
import asyncio import asyncio
import logging import logging
import sys import sys
import requests
from aiogram.types import Message
from aiogram.filters import CommandStart
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram import F
from os import getenv from os import getenv
from buttons import FBI_open_up from aiogram import Bot, Dispatcher
from aiogram.enums import ParseMode
from aiogram.client.default import DefaultBotProperties
from handlers import register_all_handlers
from init_config import check_env_file, create_env_file, load_env from init_config import check_env_file, create_env_file, load_env
@ -24,42 +19,11 @@ load_env()
TOKEN = getenv("TOKEN") TOKEN = getenv("TOKEN")
dp = Dispatcher() dp = Dispatcher()
register_all_handlers(dp)
@dp.message(CommandStart())
async def command_start_handler(msg: Message):
await msg.answer("msg happens", reply_markup=FBI_open_up())
@dp.message(F.text == "Сизам вскройся")
async def handle_open_door(msg: Message):
user_id = msg.from_user.id
# print(msg.__dict__)
print(user_id)
url = f"http://{getenv('LOCK_IP')}/cgi-bin/ext"
auth = ("ext", f"{getenv('AUTH_API')}")
payload = f"CARD={getenv('CARD_ID')}&DIR=0"
headers = {"Content-Type": "application/x-www-form-urlencoded"}
try:
response = await asyncio.to_thread(
requests.post, url, auth=auth, data=payload, headers=headers, timeout=5
)
if response.status_code == 200:
await msg.answer("Открыто")
else:
await msg.answer(
f"Ошибка при открытии замка. Код ошибки: {response.status_code}"
)
except Exception as e:
await msg.answer(f"Исключение: {str(e)}")
async def main() -> None: async def main() -> None:
# Initialize Bot instance with default bot properties which will be passed to all API calls
bot = Bot(token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) bot = Bot(token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
# And the run events dispatching
await dp.start_polling(bot) await dp.start_polling(bot)