Телеграм бот с PostgreSQL на aiogram
Нужен бот с ежемесячной подпиской на VPN, который выдает конфиги Outline.
Соответственно, не обойтись без базы данных. Выбрал PostgreSQL, но в базу нужно добавлять id пользователей. Как это сделать? Если верно понимаю, то нужно использовать message.from_user.id, но как его засунуть в БД? В сообщении от бота выводить получается, а как в БД записать информации не нашел.
И еще, для создания новых ключей Outline — использую это: https://github.com/jadolg/outline-vpn-api. Там при использовании client.create.key() вывод такого вида:
OutlineKey(key_id='21', name='', password='8ygJ5y0eGOYSvsBv3Bo85w', port=52419, method='chacha20-ietf-poly1305', access_url='ss://Y2hhY2hhMjAtaWV0Zi1wb2x5M7MwNTo4eWdKdnBrZUdPWVN2c0J2M0JvODV3@197.81.132.137:52419/?outline=1', used_bytes=0, data_limit=None)
Как записать в БД только ссылку ss://Y2...?
Т.е. нужно получить id пользователя Telegram и записать его в БД, а также каким-то образом записать в БД часть вывода от client.create.key(), которая идет после access_url.
Чтобы было понятней чего я хочу: нужен бот, который после оплаты подписки выдает ключ Outline, в случае не продления подписки пользователем ключ перестает работать, а в ТГ пользователю приходит сообщение с напоминанием продлить подписку, пользователь продлевает и тот же ключ снова начинает работать. Вроде как, все уже работает (мой первый опыт в написании бота), но вот с самым, казалось бы, легким - с получением id пользователя — проблема, знаний не хватает :(
Ответы (1 шт):
На сколько я понял твою задачу, тебе нужен Telegram бот, который выдаёт ключи Outline VPN и сохраняет их в базе данных PostgreSQL. Вот примерный код, который будет решать твою задачу:
import asyncio
import asyncpg
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from outline_vpn_api import OutlineVPN
TOKEN = "ТОКЕН_ТВОЕГО_БОТА"
DATABASE_URL = "postgres://username:password@host:port/dbname"
OUTLINE_API_URL = "http://your-outline-server.com:port"
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
outline_vpn = OutlineVPN(api_url=OUTLINE_API_URL)
async def on_start():
global db_pool
db_pool = await asyncpg.create_pool(DATABASE_URL)
async def on_shutdown():
await bot.close()
await db_pool.close()
async def save_user_to_db(user_id: int, access_url: str):
async with db_pool.acquire() as conn:
await conn.execute("INSERT INTO users (user_id, access_url) VALUES ($1, $2) ON CONFLICT (user_id) DO NOTHING", user_id, access_url)
@dp.message_handler(commands=["start"])
async def start_command(message: types.Message):
user_id = message.from_user.id
# Здесь должна быть проверка оплаты подписки
key = await outline_vpn.create_key()
access_url = key.access_url
await save_user_to_db(user_id, access_url)
await message.reply(f"Вот твой ключ Outline: {access_url}")
if __name__ == "__main__":
from aiogram import executor
executor.start_polling(dp, on_startup=on_start, on_shutdown=on_shutdown)
Не забудь создать таблицу в базе
CREATE TABLE users (
user_id BIGINT PRIMARY KEY,
access_url TEXT
);
И установить необходимые библиотеки:
pip install aiogram asyncpg
Не забудь заменить ТОКЕН_ТВОЕГО_БОТА, DATABASE_URL и OUTLINE_API_URL на реальные значения.
Код выше создаёт бота, который при получении команды /start создаёт ключ Outline, сохраняет ID пользователя и ссылку доступа в базе данных, а затем отправляет ссылку доступа пользователю. Тут нет реализации проверки оплаты подписки и функционал связанный с продлением подписки, но основная логика работы с базой данных описана.
Надеюсь, это поможет тебе. Удачи!