Помогите с реферальной системой для администрации
Всем привет. Начал писать реферальную систему для администратора. Зачем она нужна? Ответ - когда закупаешь рекламу своего бота у многих каналов/и тд ресурсов, то надо следить сколько зашло с того или иного ресурса. Вот я написал код, но он не работает как надо. Ссылки то он создает, записывает в бд sqlite3, но при команде /show_links показывает ссылку и ноль переходов, но уже зашло 2 человека.
Помогите пожалуйста, я хз как решить. (добавил ниже фулл функцию)
conn = sqlite3.connect('link.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS clicks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
link_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()
conn.close()
@dp.message_handler(commands=["ref"])
async def get_ref(message: types.Message):
if message.from_user.id in admin_id:
user_id = message.from_user.id
link = await get_start_link(user_id, encode=True)
url = link
description = 'Реферальная ссылка'
with sqlite3.connect('link.db') as conn:
cursor = conn.cursor()
cursor.execute("INSERT INTO links (url, description) VALUES (?, ?)", (url, description))
conn.commit()
await message.answer(f"Ваша реф. ссылка {link}")
else:
await message.answer("Извините, только администратор может создавать реферальные ссылки.")
@dp.message_handler(commands=["start"])
async def handler(message: types.Message):
args = message.get_args()
reference = decode_payload(args)
await message.answer(f"Ваш реферал {reference}")
with sqlite3.connect('link.db') as conn:
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS links (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL,
description TEXT NOT NULL
)
''')
rows = cursor.fetchall()
print(rows)
async def add_click(link_id: int, user_id: int):
with sqlite3.connect('link.db') as conn:
cursor = conn.cursor()
cursor.execute("INSERT INTO clicks (link_id, user_id) VALUES (?, ?)", (link_id, user_id))
conn.commit()
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('ref'))
async def process_callback_reflink(callback_query: types.CallbackQuery):
link_id = callback_query.data.split(':')[1]
await add_click(link_id)
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, "Вы перешли по ссылке. Спасибо!")
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('link'))
async def link_clicked(callback_query: CallbackQuery, state: FSMContext):
link_id = int(callback_query.data.split('_')[1])
with sqlite3.connect('link.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM links WHERE id=?", (link_id,))
link = cursor.fetchone()
if link:
user_id = callback_query.from_user.id
await add_click(link_id, user_id)
conn.commit()
url = link[1]
await bot.answer_callback_query(callback_query.id, url)
await bot.send_message(callback_query.from_user.id, f"Ссылка: {url}")
else:
await bot.answer_callback_query(callback_query.id, "Ссылка не найдена")
@dp.message_handler(commands=["show_links"])
async def show_links(message: types.Message):
if message.from_user.id in admin_id:
with sqlite3.connect('link.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM links")
links = cursor.fetchall()
if len(links) == 0:
await message.answer("Список ссылок пуст.")
return
text = "Список ссылок:\n"
for link in links:
cursor.execute("SELECT COUNT(*) FROM clicks WHERE link_id=?", (link[0],))
count = cursor.fetchone()[0]
text += f"{link[1]}: {link[2]} ({count} переходов)\n"
await message.answer(text)
else:
await message.answer("Извините, только администратор может просматривать список ссылок.")
if name == 'main':
executor.start_polling(dp, skip_updates=True)