Для начала работы нужно скачать и импортировать библиотеки aiogram и gigachat. Для скачивания библиотеки нажмите Alt + F12, тогда у Вас на экране откроется терминал. После ввода этой команды у Вас скачается библиотек с командами для использования ИИ:

pip install gigachat
pip install aiogram

После этого нужно импортировать библиотеки. Для этого переходим в сам код и пишем строчку:

import asyncio
from gigachat import GigaChat
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton

Для регистрации бота нужно получить уникальный токен. Сделать это можно только через официального бота @BotFather. После получения токена, в коде нужно ввести несколько переменных:

bot = Bot(token='Ваш токен бота')  # создание переменной бота
dp = Dispatcher()

Dispatcher() - функция, которая отслеживает действия пользователя в боте, такие как нажатие кнопок, а ещё использование команд, таких как /start и т.д.


Теперь можно заняться добавлением кнопок.

def start_keyboard():  # функция с клавиатурой
    keyboard = ReplyKeyboardMarkup(  # переменная = функции
        keyboard=[
            [KeyboardButton(text='Да')],  # задается 2 кнопки, текст в кавычках = текст на кнопке
            [KeyboardButton(text='Нет')],
        ],
        resize_keyboard=True  # чтобы кнопки были под размер экрана пользователя
    )
    return keyboard 

Далее напишем условия, при которых функция, выводящая эти кнопки, вызывается:

@dp.message(Command('start'))
async def f(message: types.Message):
    msg = "Здравствуйте, Вы  уже писали статьи на Хабре?"
    await bot.send_message(message.chat.id, msg, reply_markup=start_keyboard())

Разберём этот код по строчкам:

  1. проверяет, отправил ли пользователь команду /start

  2. async значит, что функция асинхронна, то есть может работать даже тогда, когда несколько пользователей одновременно используют бота аргумент функции лишь проверяет, что сообщение отправлено именно в телеграмме (хотя по другому и быть не может)

  3. Вопрос, который выдаст бот

  4. бот отправит сообщение (команда send_message) пользователю с тем же id, как и у пользователя, который нажал команду /start (проще говоря, тому же пользователю) сообщение, записанное в строчке 3 и выведет пользователю клавиатуру с кнопками, прописанными в функции start_keyboard() (смотреть прошлый блок кода).


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

def type_keyboard():
    keyboard = ReplyKeyboardMarkup(
        keyboard=[
            [KeyboardButton(text='Социальные сети')],
            [KeyboardButton(text='Реклама')],
            [KeyboardButton(text='Сарафанное радио')],
        ],
        resize_keyboard=True
    )
    return keyboard

А теперь пропишем условия для вывода этих кнопок с помощью уже импортированной команды F:

@dp.message(F.text.in_(['Да', 'Нет']))
async def with_children(message: types.Message):
    msg = "Откуда Вы узнали о Хабре?"
    await bot.send_message(message.chat.id, msg,reply_markup=type_keyboard())

В этом блоке разберём только первую и четвёртую строчки:

Функция F проверяет, какое сообщение пользователь отправил боту. Так как на прошлый вопрос из вариантов ответа были только да и нет, то функция точно запустится после ответа на прошлый вопрос.

В четвёртой строчке мы сохранили ответ пользователя в строковую переменную


Следующим шагом сформируем пропт для ИИ:

@dp.message(F.text.in_(['Социальные сети', 'Реклама', 'Сарафанное радио']))
async def banana(message: types.Message):
    user_id = message.from_user.id
    fonk = message.text
    prompt = "Контекст: ты великий предсказатель и экстрасенс. Задача: угадать информацию о пользователе Хабра по уже данным тебе сведеньям о нём. от информация о пользователе:"
    prompt += f"Пользователь пришёл в Хабр благодаря {fonk}"
    bruh = ask_ai(prompt)
    await bot.send_message(user_id, bruh)

В этой функции мы записываем id пользователя в переменную user_id и ответ пользователя на прошлый вопрос в переменную fonk. далее мы составляем промт через f строку и вызываем функцию для ИИ, после чего отправляем ответ пользователю.


Теперь можно наконец приступить к программированию самой нейросети! Для удобства можно выделить отдельный Python-File под эту задачу.

def ask_ai(user_prompt):
    giga = GigaChat(
        credentials='Api code, полученный на сайте гигачата'
        verify_ssl_certs=False #При запуске с ПК. Если бот размещён на сервере, то указать значение True
    )

    prompt1 = giga.chat(user_prompt)
    return prompt1.choices[0].message.content

Эта функция возвращает ответ нейросети на промпт, указанный в аргументе функции. Важно отметить, что если Вы всё-таки решили писать этот блок кода в отдельном файле, то Вам понадобиться написать ещё одну строчку в файле с ботом:

from 'Название файла с ИИ' import ask_ai

Для того, чтобы бот запустился нужно написать эту команду в конце кода:

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


asyncio.run(main())

Теперь бот готов, и его полный код выглядит так:

import asyncio
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from GigaPred import ask_ai

bot = Bot(token='bot-token')  # создание переменной бота
dp = Dispatcher()

def start_keyboard():  # функция с клавиатурой
    keyboard = ReplyKeyboardMarkup(  # переменная = функции
        keyboard=[
            [KeyboardButton(text='Да')],  # задается 2 кнопки, текст в кавычках = текст на кнопке
            [KeyboardButton(text='Нет')],
        ],
        resize_keyboard=True  # чтобы кнопки были под размер экрана пользователя
    )
    return keyboard



def type_keyboard():
    keyboard = ReplyKeyboardMarkup(
        keyboard=[
            [KeyboardButton(text='Социальные сети')],
            [KeyboardButton(text='Реклама')],
            [KeyboardButton(text='Сарафанное радио')],
        ],
        resize_keyboard=True
    )
    return keyboard


@dp.message(Command('start'))
async def f(message: types.Message):
    msg = "Здравствуйте, Вы  уже писали статьи на Хабре?"
    await bot.send_message(message.chat.id, msg, reply_markup=start_keyboard())


@dp.message(F.text.in_(['Да', 'Нет']))
async def with_children(message: types.Message):
    msg = "Откуда Вы узнали о Хабре?"
    await bot.send_message(message.chat.id, msg,reply_markup=type_keyboard())

@dp.message(F.text.in_(['Социальные сети', 'Реклама', 'Сарафанное радио']))
async def banana(message: types.Message):
    user_id = message.from_user.id
    fonk = message.text
    prompt = ("Контекст: ты великий предсказатель и экстрасенс. Задача: угадать информацию о пользователе Хабра по уже данным тебе сведеньям о нём. от информация о пользователе:")
    prompt += f"Пользователь пришёл в Хабр благодаря {fonk}. В ответе добавь смайлики и напиши ответ так, будто ты человек с экстрасенсорными способностями"
    bruh = ask_ai(prompt)
    await bot.send_message(user_id, bruh)


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


asyncio.run(main())

А в файле с ИИ остался этот код:

from gigachat import GigaChat

def ask_ai(user_prompt):
    giga = GigaChat(
        credentials='MDE5YjNmOTktNzZmZi03Y2Q0LWIzZGUtODdkYTM5OWM0ZjRlOjc4Yjc4ZGQ0LThhNmUtNGE1Yy1iZGM3LTc1YWU3ZDU5NTU5OQ==',
        verify_ssl_certs=False
    )

    prompt = giga.chat(user_prompt)
    return prompt.choices[0].message.content

Осталось лишь запустить и протестировать бота:

На этом создание бота окончено. В следующей статье расскажу, как добавить базу данных, в которую бот сможет добавлять новую информацию!