Помогите сделать запрос на поделиться номером
Я уже всё перепробовал, но всё время крашит вот код, помогите если сможете.
main.py
import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.filters.command import Command, CommandStart
from keyboards import phone_number
from db import Database
logging.basicConfig(level=logging.INFO)
bot = Bot(token="TOKEN")
dp = Dispatcher()
db = Database('users.db')
@dp.message(CommandStart())
async def cmd_start(message: types.Message):
if message.chat.type == 'private':
if not db.user_exists(message.from_user.id):
db.add_user(message.from_user.id)
await bot.send_message(message.from_user.id, "Вы успешно зарегистрированы!, пожалуйста нажмите на кнопку ниже:", reply_markup=phone_number())
async def main():
await bot.delete_webhook()
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
db.py
import sqlite3
class Database:
def __init__(self, db_name):
self.conn = sqlite3.connect(db_name)
self.cursor = self.conn.cursor()
self.create_table()
def create_table(self):
self.cursor.execute('''CREATE TABLE IF NOT EXISTS users
(user_id INT PRIMARY KEY, phone_number TXT)''')
self.conn.commit()
def user_exists(self, user_id):
with self.conn:
result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)).fetchmany(1)
return bool(len(result))
def add_user(self, user_id):
self.cursor.execute('''INSERT INTO users (user_id) VALUES (?)''', (user_id,))
self.conn.commit()
def add_number_phone(self, phone_number):
self.cursor.execute('''INSERT INTO users (phone_number) VALUES (?)''', (phone_number,))
self.conn.commit()
Вот я вроде бы добавил проверку: Но не сохраняется номер
@dp.message(F.content_type == ContentType.CONTACT)
async def handle_contact(message):
if message.chat.type == 'private':
user_id = message.from_user.id
if not db.has_contact(user_id):
phone_number = message.contact.phone_number
db.add_contact(user_id, phone_number)
await bot.send_message(message.chat.id, "Данные успешно записаны!")
А вот в бд:
def has_contact(self, user_id):
with self.conn:
result = self.cursor.execute("SELECT phone_number FROM users WHERE user_id = ?", (user_id,)).fetchone()
return result is not None
Ответы (1 шт):
Совершенно не понял смысл от работы кода, потому что он не записывает номер телефона в итоге.
Так как вы не приложили файл keyboard.py
, в котором скорее всего и происходила ошибка, я добавил кнопку в основной файл.
import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.filters.command import CommandStart
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from db import Database
logging.basicConfig(level=logging.INFO)
bot = Bot(token="TOKEN")
dp = Dispatcher()
db = Database('users.db')
@dp.message(CommandStart())
async def cmd_start(message: types.Message):
keyboard = [
[KeyboardButton(text="? Поделиться контактом", request_contact=True)]
]
if message.chat.type == 'private':
if not db.user_exists(message.from_user.id):
db.add_user(message.from_user.id)
await bot.send_message(message.from_user.id, "Вы успешно зарегистрированы!, пожалуйста нажмите на кнопку ниже:",
reply_markup=ReplyKeyboardMarkup(keyboard=keyboard))
async def main():
await bot.delete_webhook()
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Ошибок в файле db.py
я не обнаружил.
По поводу добавления номера телефона в базу данных. Для решения данной проблемы вам необходимо создать обработчик получения контакта.
В основном файле импортируем необходимые инструменты и создаём обработчик
from aiogram import F
from aiogram.types import ContentType
@dp.message(F.content_type == ContentType.CONTACT)
async def handle_contact(message):
phone_number = message.contact.phone_number
# Добавляем нового пользователя в базу данных
has_contact = db.has_context(message.chat.id)
if not has_contact:
db.add_contact(message.from_user.id, phone_number)
await bot.send_message(message.chat.id, "Данные успешно записаны!")
else:
await bot.send_message(message.chat.id, 'Ваш номер уже есть в базе данных!')
В файле с базой данных создаём новый метод add_contact()
def add_contact(self, user_id, phone_number):
self.cursor.execute('''UPDATE users SET phone_number = ? WHERE user_id = ?''', (phone_number, user_id))
self.conn.commit()
Проверка на существование номера в базе данных
def has_context(self, user_id):
self.cursor.execute('''SELECT phone_number FROM users WHERE user_id = ?''', (user_id,))
result = self.cursor.fetchone()
for phone_number in result:
result = phone_number
if result is not None:
return True
return False