Как стать автором
Обновить

Бот для телеграмм за три вечера без знания языков

Вообще-то я ювелир. Мне понадобился бот для учета спецпредложений. В начале пытался напрячь знакомого программиста, потом найти что-то похожее и адаптировать, потом читать учебники по созданию ботов, из плюсов - в школе по информатике было 5, из минусов школу я закончил в 1989 г... и даже в эмуляторе питона создал Hello world!

Но! мне нужен работающий бот на сервере. А для хранения информации мне нужна база данных. На хабре нашел ключевые слова телеграм бот, база данных, первое упоминание мне попалось postgreSQL и aiogram3.

Инструменты: Bitvise, Sublime text, Браузер, GPT-3.5

В Bitvise создаем SSH ключ, берем ВДС, Ставим убунту с ключом сразу и устанавливаем туда БД postgreSQL

$ sudo apt update
$ sudo apt install postgresql

устанавливаем PostgreSQL, входим в оболочку и создаем пользователя и бд, назначаем права

$ sudo su - postgres
$ psql
# CREATE USER main WITH PASSWORD 'P@$$w0rd';
# CREATE DATABASE my_bd;
# GRANT ALL PRIVILEGES ON DATABASE my_bd to main;

выходим из оболочки и отключаем от пользователя

# \q
$ exit

Долее я установлю pgAdmin4.

Для этого сначала необходимо установить данный репозиторий.

И добавить публичный ключ для репозитория и создайте его конфигурационный файл:

 curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
$ sudo sh -c 'echo "deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" > /etc/apt/sources.list.d/pgadmin4.list && apt update'

Запускаем установку, а затем скрипт настройки, который идект в комплекте из репозитория

$ sudo apt install pgadmin4
$ sudo /usr/pgadmin4/bin/setup-web.sh

при установке вводим емейл и пароль, который нам потом понадобится для входа в бд через веб интерфейс pgAdmin4

В процессе установки скрипт перезапустит службу Apache2 для того, чтобы вступили в силу произведённые изменения.

После того, как скрипт закончит свою работу, вам нужно будет добавить разрешение для Apache2 на доступ через брандмауэр. Чтобы сделать это, наберите:

$ sudo ufw allow 'Apache'

Запускаю брандмауэр:

$ sudo ufw enable

Тут я делаю снепшот с остановкой сервера.

И тут все пропало!

После перезапуска перестает коннектится терминал ни через битвайз, ни веб итерфейс. Верер поздний, Служба поддержки спит. Тикет отправлен.

Утром запустили сервер, делаю снепшот с остановкой... дело было не сервере, второй раз запустили его сразу. Да,

sudo ufw allow 'Apache' 
sudo ufw allow 'OpenSSH'
$ sudo ufw enable

Теперь после перезагрузки терминал работает, ставим питона, вернее его пипку для последующей установки aiogram3

$ sudo apt -y install python3-pip  

и виртуальное окружение

sudo pip3 install virtualenv

далее создаем папку для бота, переходим в нее и оттуда активируем окружение и устанавливаем в него нужные библиотеки

mkdir t_bot
cd t_bot
virtualenv venv -p python3
pip install aiogram3

Теперь объясняем Жепете какого мы хотим бота, Жепета дает первый кусок кода и два SQL запроса для создания таблиц.

Заходим http://Your-Server-IP-address/pgadmin4

Создаем БД Bot и тут вводим sql запросы

и запускаем бота

python3 main.py
from aiogram import types
from aiogram.dispatcher import Dispatcher
from keyboards import get_join_keyboard
import sql
import config
import loyalty


async def start(message: types.Message):

Это малый кусок кода, потому что -

Ничего не получилось!

from aiogram import Bot, Dispatcher, executor, types
ImportError: cannot import name 'executor' from 'aiogram' (/root/t_bot/venv/lib/python3.10/site-packages/aiogram/init.py)

Жепета переделывает код, я кормлю ее ошибками, она переделывает код, кода я замечаю что мы говорим по кругу, я понимаю что вечер окончен и пора отложить на завтра.

Завтра настало. перечитываю ее бесконечные Извините за путаницу. Вероятно, моя предыдущая информация устарела. Давайте перепишем скрипт, используя более современный подход с использованием метода start_polling напрямую из объекта Dispatcher:

задаю ей вопрос в лоб, на для какой версии aiogram оно гренит код, на голубом глазу оно отвечает что на 3, а на Извините за путаницу. Давайте попробуем заново. Для использования более современного способа инициализации бота в aiogram 3 мы можем использовать классы Executor и Webhook, а также методы start_polling и start_webhook для запуска бота.

в итоге:

Извините за недоразумение. К сожалению, документация по aiogram 3.0 еще не завершена, и официальные примеры могут быть недоступны.

Пожалуйста, позвольте мне сообщить команде aiogram об этой проблеме и предложить следить за их официальной документацией или репозиторием в поисках доступной информации по использованию aiogram 3.0.

Если у вас возникнут другие вопросы или понадобится помощь с другими темами, пожалуйста, не стесняйтесь обращаться.

в итоге

$ pip uninstall aiogram
$ pip install aiogram==2.14

И делаем простого бота, который возвращает мой ИД, по которому я в таблице назначу себе права администратора бота

import logging
import asyncio
from aiogram import Bot, Dispatcher, types
import config

logging.basicConfig(level=logging.INFO)
bot = Bot(token=config.TELEGRAM_TOKEN)
dp = Dispatcher(bot)

keyboard_markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
button_id = types.KeyboardButton('/get_my_id')
keyboard_markup.add(button_id)

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.answer("Привет! Я бот. Нажми кнопку /get_my_id, чтобы получить свой Telegram ID.", reply_markup=keyboard_markup)

@dp.message_handler(commands=['get_my_id'])
async def send_id(message: types.Message):
    user_id = message.from_user.id
    await message.answer(f'Your telegram ID: {user_id}')

async def main():
    await dp.start_polling()

if __name__ == '__main__':
    asyncio.run(main())

Откуда взялся config? если вовремя говорить Жепете, какие функции выделить в отдельный файл, она прекрасно это далет, иногда правда может поменять переменные. нужно внимательно следить.

Ура я получил свой ID!

Третий вечер закончен, задача до конца не выполнена, пока затык - не могу подключится к бд.

Но бот написан без знания языка и работает на сервере!

ЗЫ упростил задачу, пытаюсб получить данные из таблицы offers (данные там есть, проверял sqlем из pgadmin)

from aiogram import Bot, Dispatcher, executor, types
import aiogram
import asyncpg
import asyncio
import config

# Инициализация бота и диспетчера
bot = Bot(token=config.TELEGRAM_TOKEN)
dp = Dispatcher(bot)

# Функция для создания пула соединений с базой данных
async def create_pool():
    return await asyncpg.create_pool(user=config.DB_USER, password=config.DB_PASSWORD, database=config.DB_NAME, host=config.DB_HOST)

# Функция для получения данных из таблицы offers
async def get_offers():
    pool = await create_pool()
    async with pool.acquire() as connection:
        return await connection.fetch('SELECT * FROM offers')

# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_offers(message: types.Message):
    try:
        offers = await get_offers()
        if offers:
            response_text = "Доступные предложения: \n"
            for offer in offers:
                response_text += f'Offer ID: {offer["offer_id"]}, Promo Code: {offer["promo_code"]}, End Offer Date: {offer["end_offer_date"]}\n'
        else:
            response_text = "В настоящий момент нет доступных предложений."

        await message.answer(response_text, parse_mode=aiogram.types.ParseMode.HTML)
    except Exception as e:
        print(f'Произошла ошибка: {e}')
        await message.answer("Произошла ошибка при обработке запроса.")

# Функция для запуска бота
async def on_startup(dp):
    await dp.start_polling()

if __name__ == '__main__':
    executor.start_polling(dp, on_startup=on_startup)

Получаю ошибку - нет такой бд, но это уже другая история.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.