📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Новая ниша в Telegram? Большой гайд по запуску своего проекта

ИИШНЫЙ1:12:09

Transcription

В последнее время в Телеграме появилось много вот таких и ботов, и у них десятки тысяч, у многих даже миллионы пользователей. На самом деле это классная, относительно свободная ниша для микропроекта или какого-то микробизнеса, чтобы параллельно с основной работой такой сервис запустить и зарабатывать какие-то деньги, если вы правильно его прорекламируете.

Глобальная такая тема называется GPT враперы. Это сервисы, которые используют стандартные и - модели. Ну, например, берут обычный GPT или VO 3, берут Telegram, как-то всё это соединяют и предоставляют пользователю доступ за подписку или за покупку кредитов. Иногда к этим сервисам докручивают какие-то персональные промты, например, это может быть тренер, а, или диетолог, или, может быть, даже AI друг или AI девушка. Кстати, ниша AI девушка очень активно сейчас набирает обороты.

И в этом видео я покажу вам, как создать такого бота на примере нового генератора картинок от Гугла nно банана. Мы создадим бота в Телеграме, подключим к нему нейросеть Нанопана, сделаем функционал регистрации пользователя. У каждого пользователя будет внутренний баланс, который будет списываться после каждой генерации. Ну, и, соответственно, сам бот будет уметь по промту, по текстовому запросу генерировать картинки. В итоге у нас получится готовый бот, который можно рекламировать, привлекать туда пользователей, продавать подписки, продавать кредиты и зарабатывать на этом.

Как обычно, я буду всё подробно объяснять и рассказывать, так что любой даже новичок разберётся. Просто берите, повторяйте за мной, и у вас тоже получится на выходе результат. Ну, прежде чем мы начнём, все промты и дополнительные файлы к этому уроку я прикреплю в своём Telegram-канале. Если я что-то в видео копирую, вставляю, откуда-то беру, то знаете, что это будет в моей телеге. По ссылке в описании можете переходить, и там всё это будет лежать. Ну, а сейчас я выключу камеру, оставлю только свой рабочий стол, чтобы ничего нас не отвлекало. Поэтому давайте переходить к самому уроку и начинать. Погнали.

Первым делом создадим нашего бота, с которым мы будем работать. Заходим в сервис Botfer. Это такой официальный бот Телеграма, который позволяет создавать ботов. После того, как мы запустим его старт, тут есть кнопка New Bot. Я нажимаю New Bot и пишу название моего бота. Пусть он будет называться, скажем, банано банана бот. О'кей. Теперь нам нужно выбрать usернейм, и оно должно оканчиваться на бот. Сейчас я быстренько это за кадром подберу. Я вот такое вот выбрал нано банана нижнее подчеркивание бот, ботбот, потому что очень много юзернеймов было занято, но тут мне с первого раза прямо удалось подобрать подходящий. Конечно, он не запоминающийся, я вам рекомендую выбирать какие-то более запоминающиеся юзернеймы, но, в принципе, мне для видео и так о'кей. Всё, с созданием бота закончили. Теперь давайте ему накинем какую-нибудь аватарку. Вот мы можем сюда вот перейти. У нас тут этот вот нано банана наш бот. Можно нажать начать, чтобы он у нас там в списке чатов появился, никуда не пропал. И теперь быстренько давайте я сейчас прикину ему какую-нибудь аватарочку. Кликаем тут изменить и выбираем аватарку нашу. Я нарисовал вот такой вот стикер. Это на самом деле просто был один промт. Самый первый вариант. Вы можете подзаморочиться, сделать покруче что-то. Всё, жму готово. И загружается наша аватарка. Готово. Всё, вот такой бот у нас получился. Теперь давайте уже его оживим, потому что сейчас он ничего не умеет делать. Если я ему буду что-то писать, ничего не получится. Поэтому давайте перейдём к следующему шагу.

Переходим вn - это такой софт для автоматизации процессов. На нём мы будем создавать нашего бота. По ссылочке в описании я оставлю ссылку на их официальное облако. Можете там зарегистрироваться. Там даётся бесплатный четырнадцатидневный период. А если вам всё будет в кайф, получится что-то на нём создавать, то потом можете установить его на свой сервер, и это будет стоить вам вообще каких-то копеек, типа там 300 руб., можно даже сделать 500 руб. В общем, будет стоить столько-то, сколько вы платите за аренду сервера, потому что сам софт, он с открытым исходным кодом, то есть почти бесплатный. А я перехожу в N. Можете зарегаться, если со мной хотите повторять, прямо в официальном облаке, и попадёте вот вы на такую страницу. И я жму create workflow, создаю наш сценарий. Так, давайте сразу его назовём вот тут нано банана бот.

Теперь нам нужно подключить к NosN наш Telegram бота, который будет отвечать пользователям. То есть в N8N у нас будет вся логика. Я нажимаю плюсик, пишу тут Telegram, выбираю ноду Telegram и выбираю on message. Также здесь я сразу вот эту штуку уберу и выберу all updates, чтобы принимались все вообще события из Telegram. Дальше вот здесь вот у вас будет пусто. У меня тут уже подключено много ботов. У вас тут будет пусто. Нам нужно добавить токен нашего бота. Чтобы подключить этого бота к Nat. Я нажимаю Create New Credential. И мне нужно вставить некий токен. Давайте я тут сразу напишу, что это наш нано банана бот, чтобы потом использовать его. Вставляю наш токен. Откуда взять токен? Значит, мы переходим обратно вот сюда нашего бота, нажимаем сюда, выбираем изменить и жмём изменить настройки бота. Нас возвращает обратно в ботфазer. И мы здесь жмём вкладку API Tкеen. Ну либо можете его сразу после создания бота отсюда скопировать. Я копирую токен и просто вставляю его сюда. Жму сохранить и жду, когда он законнектится. Всё, коннект у нас успешен. Закрываем это. А, и теперь нужно протестить, что у нас вся эта штука работает. А, я жму Execute Workflow. И, видите, он мне пишет: "Waiting for trigger event". То есть он ждёт какого-то события в нашем боте. Давайте мы напишем старт. И если вернёмся в нашей, но увидим, что что-то сюда пришло. Открываем и видим, что у нас прошло тут вот от моего аккаунта. Вот моё имя, фамилия, вот там тип сообщения, пришёл текст команда старт. И что это? Тип bot command. Супер. У нас теперь этот бот связан с Nat. Если я, например, напишу сюда любое сообщение, там может быть 32, то я увижу, что это всё у нас успешно поймал наш бот.

Какая у нас вообще есть штука? Как только пользователь открывает бота, первым делом, что он видит? Он видит вот эту кнопочку "Начать", которая как бы отправляет команду "Старт" в бота". То есть, смотрите, я жму кнопку начатим, и как бы отправляется сообщение старт. Нам нужно по этому сообщению старт отдавать какое-то приветственное сообщение, типа добро пожаловать, там вот этот бот умеет то-то, то-то, и там будет менюшка с кнопками. Давайте мы прямо сейчас это и сделаем. Значит, я здесь пишу switch. И здесь нам нужно разделять потоки наших сообщений. То есть мы сейчас должны реагировать только на текст старт. Вот здесь вот нахожу наш текст start, переношу его вот так этой переменной. Видите, он мне подставляет messageк. Типа я у него спрашиваю, типа, если message is equal to, то есть, если у нас равняется сst, а здесь я сразу напишу вот так rename output, нажму и напишу start. А если у нас message rвен start, то мы ведём как бы по отдельной ветке. Если у нас, например, сейчас для примера вам добавлю, покажу. Если у нас messageтекст, однако, будет равен, например, э, привет, да, сейчас привет, то он меня поведёт, может повести по другой ветке и отвечать разные, а, сообщения выдавать в зависимости от того, что мы боту отправили. Итак, у нас пока есть только старт. Давайте мы к старту проведём и напишем здесь снова Telegram. Нам нужно отправить сообщение в Telegram в ответ на, ой, это не то, на нашу команду старт. Пишем Telegram и здесь пишем send a text message. Send text message. Я сейчас выберу своего бота, который только что создал. У меня их тут прям очень много. Выбираю. И здесь у нас никаких данных нет, потому что нам нужно вот здесь нажать Play, чтобы прокинулось. Видите, я здесь последнее, что писал, было старт. Соответственно, этот старт пошёл по этой ветке, по ветке старт. Всё, теперь тут у нас появились данные из предыдущих веток, и мы можем ответить что-то пользователю, который прислал нам старт. А значит, тут что нам требуется? Некий чат ID. То есть какой вообще чат ID нам отвечать? В какой чат нам нужно э нужно слать это сообщение? Я переношу вот этот чат ID. Соответственно, мне нужно ответить в тот чат ID, откуда пришло это сообщение старт. И пишу какой-то текст. Давайте напишу текст привет. Для начала сейчас мы всё протестим, а потом быстренько этот же текст накатаем с гугловской нейронкой. Быстронько. А здесь я добавляю field. И вот здесь есть такая appent nenosn attribution. Я её убираю, потому что иначе он будет к каждому сообщению добавлять такой вводяной знак N8N достаточно противный. И сразу pars mode напишу HTML. Всё. Если я нажму вот так напишу, нажму Play, то мне пришло сообщение привет. Видите, так тут это можно удалить. Пришло сообщение: "Привет". И теперь смотрите, если я вот так жму активировать, то бот у нас будет работать уже в таком боевом режиме. То есть нам не нужно будет постоянно нажимать вот тут execute. Я могу отправить старт и мне пришлёт привет. Могу отправить старт, снова пришлёт привет. То есть, видите, у нас бот наш реагирует на сообщение старт. А если я напишу что-то другое, соответственно, он мне ничего не пришлёт. Э, так, супер, с этим всё.

Теперь нужно добавить нам какое-то приветственное сообщение. Давайте быстренько с гугловской и неронкой его сгенерим. Я вот тут закинул просто в Gemini T, что я создаю Telegramбота, и он мне выдал вот такой вот текст, который я немного поправил. То есть, что тут у нас? Добро пожаловать. Это ботгенератор изображений, работающий на даже можно написать нейрости нано банана. Я умею воплощать ваши самые смелые идеи. Та-та-та. Ваш текущий баланс - три токена. Стоимость одной генерации - один токен. То есть мы предполагаем, что пользователю там накинется три токена, чтобы он мог попробовать сгенерировать несколько картинок. Используйте меню ниже, чтобы начать. Давайте даже не так. Давайте мы вот это вот уберём и просто напишем, э, отправь описание того, что хочешь сгенерировать точка. И, соответственно, пользователь будет нам писать какой-то текст, и мы будем уже генерировать ему изображение. Давайте протестим, посмотрим, что у нас получилось. Так, я жму Execute, а, и он мне говорит: "Деактивируй Workflow, чтобы провести тестовую тестовый прогон". Я просто убираю тут кнопку activate, чтобы у нас снова перешло всё в тестовый режим. И жму кнопку Execute. Всё, он мне отправил это сообщение. Давайте посмотрим, как оно выглядит в боте. Вот оно нам пришло. Добро пожаловать. Выделено жирным. Это ботгенератор. У вас три токена. И отправи в описание того, чтобы начать. Теперь пользователь будет отправлять описание картинки, которую ему нужно сгенерировать. И следующий наш шаг - это делать так, чтобы, собственно, бот это всё генерировал. Как только он всё это сгенерирует, мы это настроим. Дальше мы сделаем уже э регистрацию, учёт генерации, баланс и всё остальное. Но главное нам сейчас этот сценарий воспроизвести.

Теперь давайте настроим генерацию самих картинок. Как мы это будем делать? Есть такой сервис, Open Router называется. Это Marketplйс всех и моделей. Тут они собрали и GNA, и GPT, и CLТО. В общем, чтобы вам не регистрироваться в куче разных кабинетах, вот есть один единый маркетплейс, где есть все модели. Я этим сервисом сам пользуюсь постоянно. Это очень удобно, на самом деле. И у нём есть несколько плюшек. Ну, например, это пополнение с баланса скрипты, что очень удобно для тех, кто в России. И надо иностранные карты. Итак, в Openроутере, если мы вот здесь кликнем output modalities image, то мы найдём вот эту самую модель нанобана, наш Gemini 2 с по, и с её помощью мы можем генерировать наши картинки. Я перехожу здесь во вкладку KYS. Давайте открою её в новой вкладке. Вот так. И нажму здесь кнопку Create API key. И напишу nно банана бот токен. Жму create, создаю наш новый AP токен. И давайте я его вот здесь скопирую и вот сюда добавлю в заметочку. Сразу же добавлю. Вам нужно будет, соответственно, создать ваш. Просто зарегистрируйтесь тут в сервисе. Это очень удобно, быстро, понятно. Если я закрою эту страницу, ключ пропадёт. Я не смогу его больше увидеть. Это для безопасности нужно, но я скопировал уже себе, поэтому закрываю.

Теперь, когда пользователь нам пишет любое сообщение, кроме старт, ну и в нашем случае это привет, который мы позже удалим, э, нам нужно отправлять запрос на генерацию картинки, чтобы он уже воспринимал любое сообщение как промт. И, соответственно, для этого я перехожу в наш сch, спускаюсь тут ниже. И здесь есть такая штука, э, кнопка add option. Я её нажимаю и нажимаю output. Что значит fall output? Это значит, что если у нас запрос не подходит ни под один из этих условий, ни под одно из этих условий, то он отправляет его в одну единственную ветку. То есть, если не подходит под условие, идёт только по вот этой ветке лback. Вот я здесь выберу extra output. Если я закрою, то увижу, что у меня появился появилась ветка Fback, то есть старт, привет и FB. То есть всё, что не подходит под старт и привет, у нас пойдёт в FB. Соответственно, любой текст, который пользователь напишет, он сразу же пойдёт в fallк. Аа теперь, чтобы мне сгенерировать изображение, а мне нужно, что? Мне нужно вот так протащить здесь и создать ноду http request. http request. И я возвращаюсь в наш Open roуter. Вот Gemini 25 Flash Image. Как её найти, собственно, я рассказываю. Мы кликаем вот сюда в models, выбираем здесь Output Modalities Image и находим единственную вот эту модель Gemini 2 Мне нужна вкладка API. API. Он мне говорит: "Создайте API key." Мы его уже создали. И здесь ниже мне нужна вот эта вкладка Curl. Я это копирую вот так. Перехожу в наш NATN вот сюда, в нашу ноду HTTP request. Жму import CRL, вставляю то, что у нас тут есть, и жму импорт. И видим, что у нас здесь импортировалось, импортировался весь этот код. Он уже встал, как нам нужно. Единственное, что нам нужно - это вот здесь заменить наш ключ на апи ключ, который мы только что создали. Я вот отсюда его забираю и вставляю вот сюда. Вставляю. Дальше, что у нас тут есть? А мы отправляем некий запрос на некий адрес API V1 ch completions. И дальше здесь есть наш API ключ и есть некие параметры, которые мы передаём. И видите параметры тут какие? Наша модель Geminite 25 Flash Rol user content типтекст. Что? И тут он для примера поставляет what is in this image? Ну, типа, что на этом изображении и пример чисто для нас, как это всё будет работать. Я стираю вот эту штуку, она мне не нужна, я её удаляю. Нам нужен только текст. И вот здесь в конце надо не забыть запятую убрать. Дальше нам нужно передать наш промт в этот запрос, чтобы мы, соответственно, получили обратно изображение. Давайте мы сейчас снова я нажму execute и давайте напишем, например, что создай картинку обезьяны. Видим, что получилось наше сообщение. Если мы здесь нажмём Play, то он ведёт уже его по ветке Fallback. Я открываю CTP request, и моя задача вот здесь в prompt передать наш запрос. Я сначала напишу так: generate image и вот так передаю наш текст. Можно даже вот так вот нажать здесь подробнее. И нам важно, чтобы вот эта переменная, которую мы только что перенесли, давайте я её ещё раз перенесу. Вот. Generate image on this prompt. Не знаю, правильно ли это звучит по-английски, но меня вроде все модели понимают. Так, я переношу вот так. Вставляю. Важно, чтобы здесь, Обратите внимание, видите, он в предпросмотре тут поставил, а что в итоге будет передано в модель. То есть он взял текст нашего сообщения из переменной и подставил его сюда. Generate image. Он здесь prompt. Э, создай картинку обезьяны. Теперь давайте пробовать запускать. Может быть, у нас будет какая-то ошибка из-за русскоязычных символов. Не знаю. А, возможно, всё и получится сразу. Обязательно здесь нужно сказать generate image, потому что мы как бы передаём команду модели, что нужно именно сгенерировать картинку по этому запросу. Видим, что у нас успешно, у нас что-то вернулось от нашего Openроутера. Ну, кстати, обратите внимание, что вам нужно пополнить баланс, чтобы что-то было, чтобы это всё работало. баланс можно пополнять там баксов на пять, но мне хватает вообще с запасом. Ну вот видите, я там примерно раз в месяц пополняю на 10 баксов, хотя я очень много пользуюсь openроутером. Вот у меня постоянно тут какой-то баланс есть. И стоит это, ну совсем недорого. Поэтому, чтобы заработало, нужно пополнить баланс. Можете пополнять крипто и можете пополнять с иностранный карты, как вам удобно. Смотрите, мне что вернулось. Вот он говорит, там генерация такая-то, провайдер Гугла i Studio. Вот он вернул мне сообщение, некий Type Image URL он мне вернул. И видим, что тут нам пришло некое некий код, который нам сейчас нужно превратить в картинку. Я здесь вот жму плюс, пишу set и выбираю Edit Fields. Здесь нажимаю плюс и пишу а или даже вот так напишу base переношу сюда вот это вот value. И здесь нам нужно вытащить вот этот вот код base 64 запятая и вот эта вот штука. Значит, что я тут пишу? imageurl. Пишу split. Дальше я здесь ставлю кавычки, пишу запятая. И на этом этапе он может достаточно долго думать, потому что он сейчас, так как я вот так написал запятую, он мне пытается все эти буквы разделить по запятой. Это может быть оченьочень долго. Когда он ожил, вот здесь вот обращаем внимание, сейчас я вот так вот приближу. Обращаем внимание, что у нас после кавычек у нас запятая, дальше вот эта закрывающая скобка идёт. И мы здесь ставим квадратные скобки и пишем один. То есть мы как бы обращаемся к первому элементу вот массива, который нам получил. Вот этот код я оставлю в телеге у себя в канале, прикреплю. И видите, он нам разделил как бы вот это вот. Видите, тут data image PNG BS64. И вот она у нас тут маленькая такая запятая есть. Он выдал всё, что после запятой. То есть выдал нам, соответственно, наш код, который, собственно, представляет из себя картинку. Теперь я иду снова в жму плюс и пишу convert to file. И выбираю тут move bs64 string to file. Дальше мне здесь нужно вот это нажать и чтобы оно прокинулось. Так, готово. И я передаю свой вот этот base вот сюда в base 64 input file field, вернее, и put output file in field data. Снова жму execute. На этом этапе он должен может достаточно долго думать, потому что он каждый раз почему-то делает новый запрос. Так работает NEN. Ну, в общем, он может достаточно долго тут думать, но в итоге отработает. И смотрите, что у нас получилось. Мы получили наш файл extension PNG 1,65 Мб. Вот если я нажму View, то он мне сгенерировал мою обезьяну. Мы уже получили это как картинку. Круто. Круто.

Теперь нам нужно отправить этот ответ пользователю в Telegram. Соответственно, я вот здесь вот так продублирую наше стартовое сообщение, перенесу его вот сюда и соединю. Дальше здесь я сразу пропишу название, что это sendто. Здесь чат ID у нас подсвечивается красным. Мне его надо заново будет проставить. Я вот так сотру, вернусь в схему сюда, открою Telegram triг. Найду тут чат ID и перетащу его сюда. И здесь нам нужно не send message отправлять, а sendто. Где-то здесь вот sendфото. Sendфото мы отправляем и binary file. Выбираем галочку. И вот она, наш binary data, наш файл data, он автоматически сюда подставился. А, всё, теперь я могу ещё добавить здесь addfield, написать caption. Вот твоя картинка. Всё. Теперь, если я жму Execute, нам в Telegram отправится эта картинка. Так, у нас тут вышла небольшая ошибка. Статус код 502. Я думаю, что просто это связано с тем, что слишком долго это всё тормозит. Здесь нажму Execute Workflow и вставлю тот же самый текст. И смотрите, он получил сообщение, отправил его в FB. Сейчас он генерирует эту картинку через Open Router. Как только он её сгенерирует, он вытащит из неё вот этот Base 64 код. Вытащил, конвертирует это в файл, всё это происходит автоматически. И отправляет мне в Telegram. И если я посмотрю, то он мне прислал. Вот твоя картинка. Супер. Вот так просто. На самом деле уже вы можете просто брать и использовать этого бота для себя. Это будет стоить сильно дешевле, чем другие такие боты. Если вам просто нужно генерировать картинки по запросу, то вы просто берёте вот так, нажимаете active и генерируете любые картинки. Давайте напишу, например, сгенерируй и агента. Ну как-то так, не знаю, просто любой запрос. И сейчас, так как у нас acтив, у нас тут ничего не проходит. Но если я перейду во вкладку Execution, то я увижу, что у нас тут некий ранинг. То есть что-то у нас работает, какой-то процесс. И вот он отработал и вернул мне картинку. То есть всё, Gemini 255 нанобана работает. Понятно, что мы не можем сейчас редактировать эту картинку, хотя это эту штуку тоже можно донастроить. Вот э чтобы можно было, например, вот эту картинку скопировать, вставить и сказать: "Добавь туда ещё что-то". Это тоже можно сделать.

Друзья, прежде чем мы перейдём уже дальше к регистрации пользователей, там, к созданию баланса, скажу, что у этого видео будет ещё вторая часть. Она будет уже закрытая. И в этой части мы прикрутим реальную оплату. Ну, то есть, чтобы вы могли с карт там пользователей за вот этот сервис брать деньги. Мы прямо всё это настроим, всё это сделаем, чтобы оплата у вас подключилась. Работать это всё будет через сервис Lava Top. Этот сервис не требует, не требует. То есть вы можете как виз лицо принимать деньги, выводить их себе на карту, на крипту. Это очень крутая платёжная система. Я ей сам пользуюсь. А, и я расскажу в закрытой части, как настроить платежи и подписки с автоматическим списанием через этот сервис. Я сам им пользуюсь. Очень удобная штука. А я расскажу, закрытую часть, вторую выложу в своём клубе. Это мой такой закрытый канал по подписке. Здесь 148 человек. Сейчас здесь он будет вот выложен эксклюзив к этому видео. Я настрою оплату, настрою вот баланс, чтобы деньги списывались, чтобы баланс пополнялся, чтобы когда баланс заканчивался, он говорил, типа, у вас не хватает баланса, пополните его. То есть вот вторая такая большая часть, которая позволит уже подключить реальные платёжки, чтобы вы могли выводить деньги. А доступ к этому клубу стоит 1.00 в месяц. Здесь помимо вот этого эксклюзива есть ещё очень много всего. Тут, например, есть большой курс по NA, в котором мы разбираем вообще всё, что касается NA, как строить своих ассистентов и агентов, сценаристов. В общем, вы сами сможете создавать любые свои автоматизации. Я вот в этот курс заморочился очень, записал его. Также тут есть куча других полезных уроков, как работать с кнопками в Telegram, как вот анализировать картинки, как ээ тут вот ещё какой-то гайд, э, например, вот вот основные ноды, как работают. В общем, очень много всего. И ещё недавно я тут выложил очень классную штуку. Это тренвоching. Это целая система большая по анализу залетевших лсов конкурентов. Вы вушене и в N это всё дело разворачиваете и получаете систему, которая 24x7 мониторит залетевшие видосы и вам выдаёт самые вирусные ролики, чтобы вы могли эти идеи брать. Вот так эта система выглядит. Всё это в клубе уже доступно. И помимо этого ещё выложу вторую закрытую часть. Поэтому, если вы хотите создавать иагентов, если вам нужно это для вашего бизнеса или, может быть, вы хотите запустить вот такой микропроект, то жду вас вшном клубе стоит всего 1.00 в месяц доступ ко всей вот этой золотой информации. Также тут ещё у нас есть чатик, где я активно отвечаю на вопросы. Если у вас что-то не работает, какая-то ошибка, что-то сломалось, у вас есть какая-то идея, которую вы хотите реализовать, короче, вы можете сюда написать. Я здесь очень часто отвечаю. Тут у нас, ну, достаточно много вопросов сыпется. Очень активное сообщество у нас получается для тех, кто создаёт свои проекты, качает свой бизнес, строит и автоматизации. Поэтому закрытая вторая часть с привязкой оплаты будет в яишном клубе.

А сейчас мы продолжим и сделаем уже регистрацию пользователей. Зачем нам вообще нужна регистрация? Нам нужно хранить где-то данные о каждом пользователе, потому что сейчас это просто, ну, где-то растворяется. Если пользователь сам пишет, мы его нигде не регистрируем, соответственно, мы не можем учитывать его баланс, не можем потом принимать с него оплату. И, короче, база нужна. В этой базе будет таблица с пользователями, где будут храниться каждый пользователь, который бота запустил.

Будет также его баланс генерации, и дальше будет список там транзакций, чтобы после каждой генерации мы списывали баланс. Для базы данных я буду использовать сервис Superbase. А вот он так выглядит.

Сервис Superbase, он тоже бесплатный. Ну, как до двух проектов он бесплатный. Вы можете использовать, если у вас больше двух проектов, соответственно, 25 баксов в месяц. Ну, двух проектов нам, в принципе, хватит. Я здесь регистрируйтесь, просто переходите, вот у меня тут создано две организации, и нажимаете New Project. Пишете наш project name, это может быть нано банана бо и password. Использую очень надёжный пароль, который вы все увидели, но я эту базу потом сотру после видоса. На всякий случай этот очень надёжный пароль я, а, скопирую и вставлю куда-то вот сюда, потому что он тоже нам пригодится. Всё, я жму create New Project. Тут можно ещё выбрать локацию. Ну, я как бы обычно не заморачиваюсь, выбираю где-то в Европе, поближе ко мне. Всё, у нас создался новый проект.

И теперь нам нужно подключить Supbase к нашему N10. Давайте я вот так вот здесь оттяну и здесь, да, нажму плюс и напишу Superbase. Superabase и выберу get arrow. И здесь нам также нужно добавить credentials, как мы это добавляли в Телеграме. У меня несколько подключено, но я создам сейчас новый. Жму create. И здесь соответственно пишу мои доступы. Значит, где найти доступы? Переходим в Superbase, переходим в Project Settings. Выбираем здесь data API. Копируем вот этот вот URL. Он будет нашим хостом. Вставляем его вот сюда. И теперь нам нужен Service Roll Secret. Я перехожу во вкладку Apase. Перехожу вот сюда во вкладку API Keys и жму Create New API key. Создаю этот ключ и копирую его вот отсюда. Теперь я всё это дело вставляю в Supbase и жму save. И видите, он уже успешно законнектился к моей базе данных.

Но в этой базе данных пока нет никаких таблиц. Нам нужно эти таблицы создать. Переходим. Вот, если мы перейдём в Table Editor, увидим, что тут никаких таблиц у нас нет. А я, значит, покопался с Gemini и просто попросил его написать мне такой код. Вот я ему там прямо дал ТЗ. Я создаю бота в Telegram там, который генерирует. Дай мне таблицу пользователей и таблицу генераций. И он мне прекрасно выдал код, который мне нужно вставить. Я этот код также у себя в ТГЭшке, в бесплатной ТГЭшке прикреплю. Ссылка будет в описании. Я беру вот этот код, копирую его, иду в Superbabase, перехожу в SQL Editor, вставляю и жму Run. Всё, он говорит Success. Никаких колонок не было возвращено. И теперь, если я перейду в Table Editor, я уже увижу наши таблицы. Таблицы с пользователями. Что у нас тут есть? У нас есть ID, у нас есть, а, таблица с генерациями, у нас есть ID, User ID, Prompt. А сколько было потрачено кредитов? Какая модель была использована? Статус, ссылка на картинку, этот image URL и generated AD - это время, когда картинка была сгенерирована. Дальше таблица пользователей. Что у нас тут есть? ID, Telegram, ID, username, баланс генераций, имя, first name, last name, isbot. Ну вот это, наверное, изbot можно удалить, оно нам не нужно. И у нас что ещё? Language code и created, когда пользователь был зарегистрирован. В принципе, этого нам достаточно на первое время.

Теперь нам нужно, чтобы, когда пользователь стартует бота впервые, чтобы он регистрировался, чтобы автоматически без всяких там сложных форм у нас создавался юзер в нашей таблице. Давайте мы это сделаем. Значит, каждый раз, когда нам что-то приходит в Telegram, мы должны проверить, не новый ли это пользователь, не впервые ли он запускает бота. Потому что, если пользователь у нас впервые запускает бота, нам нужно его зарегистрировать. А если он не впервые запускает бота, соответственно, он уже есть в базе, значит, у него уже есть баланс, есть какая-то история, генерация, и мы как бы уже знаем, что это за пользователь. Соответственно, после каждого Telegram-триггера, вот этого пришедшего любого сообщения в бота, нам нужно проверять этого пользователя, доставать от него информацию. Поэтому мы сразу же, ещё перед всеми действиями после Telegram-триггера вытаскиваем этого пользователя из базы. Так как у нас сейчас в базе ничего нет, то нам сейчас ничего не вернётся, но мы всё равно это напишем. Видите, когда мы создали таблицы, если я сюда перейду или если у вас не появляется, можете вот тут нажать refresh list. У вас появится здесь наша таблица, которую мы создали. Вкладку Users я выбираю, и мне нужно вытащить пользователя с условиями. Я жму Add Condition и выбираю условия. У нас Telegram ID этого пользователя должен быть равен ча. Вот так. И, соответственно, теперь, когда какой-то пользователь напишет, он пойдёт в Supase и попробует вытащить пользователя, у которого Telegram ID равен ча. Я жму Execute. А мне нужно деактивировать, чтобы заработало. Я жму Execute, и он сейчас мне ничего не вернёт. Он мне выдаст пустую строку. Так, давайте я тут всё сохраню и перезагружу страницу и попробуем заново, чтобы он не тормозил. Видите, в тестовом режиме часто подтормаживает. В боевом режиме обычно всё работает. А я жму execute и напишу 1 2 3. 1 2 3. И видите, смотрите, а он пошёл к superbase и ничего не нашёл. No output data return. То есть нашего пользователя просто нет в базе. Это хорошо. Значит, теперь мы вот здесь обязательно, где get arrow, переходим в setting и ставим always output data, чтобы он не тормозил на этом сценарии, потому что если мы вот так оставим, то каждый новый пользователь, ну, дальше не пойдёт, потому что он типа: "Я не нашёл, всё, я остановился, дальше не иду". А если мы выбираем always output data, то тогда мы говорим ему типа: "Э, ну всё равно дальше продолжай". И если я вот так нажму на play, то вижу, что он дальше прокинул, но прокинул он уже пустую строку. Типа ничего нам не вернулось. Если я тут во вкладку Jon перейду, то увижу, что просто нет ничего. И дальше нам нужно поставить такое условие. Проверка. Если нам что-то вернулось, то значит пользователь существует. Если нам ничего не вернулось, соответственно, значит пользователя не существует. Его нужно зарегистрировать. Я вот эту связь удалю. И вот здесь напишу такое условие if. Выбираю if. И здесь я пишу прямо руками. Пишу вот так вот. Выбираю Expression и пишу руками. А доллар Jon точка здесь вот отсюда Telegram ID. Я возьму Telegram ID. Если у нас Telegram IDст string, а это даже, по-моему, не string, это число у нас. Это важно очень не string, а number. Если у нас Telegram ID, вот здесь number, выбираем is not exist, вернее, does not exist. Does not exist, то мы, соответственно, будем пользователя регистрировать. Если у нас он exist, как бы существует, то мы не регистрируем пользователя. Здесь я вот так напишу, переименую новый юзер. Типа спрашиваем у системы. Ой, юзер. Если, видите, у нас тут появилось две ветки. Если у нас юзер новый, то есть у нас не существует этого Telegram ID, тогда мы его регистрируем. Если у нас false, то есть он существует, тогда мы его ведём уже вот по этой ветке switch.

Теперь нам осталось добавить регистрацию. Мы от ветки true отводим. И пишем base create arrow. Здесь у нас аккаунт наш верный. И давайте вот тут мы через if вот это прокинем. И видите, он нас повёл по ветке true, потому что у нас как бы тут doesn't exist. Всё правильно. Повёл по ветке true. Значит, пользователя такого в базе нет. Create arrow - это значит создай запись в этой базе данных. Я выбираю table name users. И теперь я выбираю заполнить поля. Вот я жму. Выбираю тут поле ID, оно будет сгенерировано автоматически. Telegram ID, я подставляю наш чат ID. То есть наша задача сейчас просто то, что мы приняли от Телеграма, отправить в нашу в наш Superbase. Telegram ID, ээ username - это у нас вот он. Username. Мы будем записывать в базу. Дальше generate balance мы попозже сделаем. First name у нас, соответственно, first name. Last name - это переменная last name. Language code. Language code - это на случае, если вы будете локализацию делать. Я всегда сохраняю. Language code. Это какой язык у пользователя стоит на устройстве. Потом можно будет делать с этим условия. Create, мы просто вот так вот выберем expression и пропишем здесь доллар now, то есть передать текущую дату. И я это переименую. Напишу регистрация. Регистрация. Всё. Смотрите, теперь, если я жму Play, то он зарегистрировал мне пользователя, и вот он появился в нашей базе. Только у него generation balance ноль. И давайте мы сейчас отдельной нодой добавим ему баланс. Почему отдельный? Ну, потому что я как бы люблю, когда всё отдельно, каждое действие у нас регистрация отдельно, а потом у нас будет начисление вот этого бонусного баланса в токенах. Ну там типа три, три токена добавим. Вот три бесплатной генерации, предположим. А я снова пишу superabase. Superabase. Выбираю update arrow. Уже update. Мы будем апдейтить нашего пользователя. Table name у нас users. И нам нужно вот эту запись от регистрации как бы обновить. Ну, добави обновить туда какие-то данные. Значит, здесь у нас ээ select conditions. Я выбираю add conditions. Выбираю здесь поле ID. Condition у нас будет equals. И переношу вот эту айдишку нашей нашего юзера, который создался. Соответственно, он сейчас найдёт вот этого юзера, только что созданного, вытащит его и обновит ему то, что нам нужно. Обновление, по сути, происходит так же. Мы выбираем вот здесь add field, выбираем здесь у нас generation balance и пишем просто цифру три. То есть мы начисляем три бонусных ээ генерации и сразу же переименуем. Напишу добавляем баланс. Бонусный баланс. Жму execute. Всё отлично. И сейчас у меня обновится вот эта штука. Видите, она обновилась. Замечательно. Теперь мне по сути что нужно? Нужно просто отправить ему то же самое стартовое сообщение. Я вот это вот так продублирую, перенесу вот так. И всё. Мы будем отправлять ему стартовое сообщение. Только в этом стартовом сообщении, смотрите, нам снова нужно обновить наш чат ID. Вот этот. Мы его переносим отсюда снова, потому что красным загорелось. и пишем ему вот это же приветственное сообщение. Добро пожаловать. Только смотрите, видите ваш текущий баланс, три токена. Теперь мы возьмём и выведем эту цифру из базы. Даже, наверное, вот логичнее нам, знаете, будет написать вот так: "Ваш текущий баланс токенов двоеточие, и здесь будет число". Потому что тут же могут быть разные склонения, там токен, не токены, там один токен, два токена. И чтобы со склонениями не париться, просто чтобы тут было число. Ваш текущий баланс токенов, двоеточие. И давайте мы найдём вот этот наш generation balance. Вот мы его переносим, вставляем сюда и видим в предпросмотре сейчас вот так на полный экран сделаю, что он показывает. Ваш текущий баланс токенов три. Только в отличие от того, что мы тогда писали руками. Теперь мы это берём из базы. Стоимость одной генерации, один токен. Тут всё оставляем как есть. Отправьте описание того, что хочешь сгенерировать. Всё, давайте отправим, посмотрим, отработала ли эта штука. Да, вот нам пришло ваш текущий баланс токенов. Три. Стоимость генерации один токен. О'кей. Как бы нам теперь это проверить, да, чтобы у нас всё работало? Давайте-ка я просто сейчас попробую что-то написать, так как я уже есть в базе, он меня должен найти. Я напишу там 343. Получил своё сообщение. Теперь мы получаем пользователя следующим шагом. Хоп, говорим, что нам уже какой-то пользователь вернулся. Видите, вернулся вот этот пользователь. Вот его баланс генераций. Вот он я. Всё хорошо. И дальше он нас уже ведёт не по ветке регистрации, а по ветке FЛSE в наш, собственно, switch. И всё. И дальше у нас всё хорошо. Теперь давайте проверим, регистрируется ли пользователь. Я себя сейчас вручную удалю. Вот так удалю. вернусь в нашей 10, запущу вот это наше приветственное сообщение и напишу тоже любую штуку. И вот он пошёл и снова меня зарегистрировал автоматически. Ну, соответственно, напоминаю вам, что если вы включите acтив, то вам не надо будет это всё прокликивать, это всё будет само. Мы обновим и увидим, что пользователь снова добавился. Супер, регистрация у нас готова.

Теперь дальше нам нужно создавать некую генерацию после каждого запроса. Чтобы у нас прямо формировалась в базе генерация, чтобы списывался баланс, чтобы всё было чётко. Давайте сейчас это реализуем. Ну, во-первых, давайте вот это сообщение тоже у нас обновим, потому что, видите, у нас тут три токена по-прежнему написано вручную. Вообще тут бы по хорошему зарегистрированному пользователю уже отправлять какое-то другое сообщение, потому что он уже знает, что это забот. И, э, поэтому давайте мы вот это вот уберём и просто напишем. Ваш текущий баланс, три токена, стоимость одной генерации один токен. Отправь в описание того, что хочешь сгенерировать, потому что тут мы уже поздоровались, в принципе. А давайте сейчас заново вот это я сохраню, обновлю страницу и попробую снова написать сш и вот здесь нажму execute. Смотрите, видите, он меня нашёл. Только у нас тут кое-что сломалось, потому что мы добавили вот здесь вот вот эту get user. И смотрите, если я перейду в наш свич, то он уже тут всё подсвечивает красненьким, хотя мы ему отправили старт. Для этого нам нужно сейчас всё это быстренько починить. Давайте вот этот привет мы удалим вообще. И вот здесь нам нужно починить. Здесь я выбираю JON. Вот так. Выбираю здесь Telegram и снова перехожу в схема. И вот здесь у нас уже появились данные. Это какой-то баг NIT, но он так немного глючит. Поэтому, если у вас вот в Telegram-тригре ничего нет, переходите в JSON, выбираете Telegramтгer, возвращаетесь, и у вас тут всё появится. Я вот это удаляю красненькое и переношу наш новый чат ID. Ой, фу ты. Какой чат ID? Текст нам нужен. Текст. Переношу текст. Старт. Всё. Э, видите, потому что так как тут всё сломалось, он меня повёл по веткефолbaбек и по запросу старт повёл меня картинку генерировать. А это неправильное действие, поэтому чуть-чуть нужно исправить. Ээ, дальше давайте снова жму здесь execute и отправляю снова старт. И вот и тут тоже у нас сломалось. Замечательно, да? Тут тоже мы забыли поправить. Видите, ошибка. Чат ID, говорит, пустой. Давайте мы ча вот этот возьмём уже из базы нашей. Вот отсюда Telegram ID перенесём. Это он у нас и так равен ча. Всё, жму execute. И он мне отправил сообщение. Ваш баланс три токена. Всё о'кей. Но текста мы не поправили, да? Нам теперь нужно текст поправить. Нужно актуальный баланс показывать. Ваш текущий баланс токенов и нашу переменную. Вот из этой вкладки get r мы же уже достали юзера и достали его баланс. Соответственно, вот мы перетаскиваем вот эту цифру три и всё. И теперь, если мы снова отправим, то нам уже отправится всё чётко с нашей переменной. Отправи в описание того, что хочешь сгенерировать. Всё, у нас работает вся эта штука с проверкой. Я надеюсь, ээ, работает. Давайте ещё раз попробуем. Вот это подотрём и попробуем ещё разок. Жму execute, пишу старт, и он пошёл и отправил мне сообщение очень быстро. Добро пожаловать. Ваш текущий баланс, три токена, стоимость одной генерации один токен.

Теперь нам нужно сделать самую сложную штуку. Нам нужно после перед каждой генерацией записывать в базу, в вот этот generations записывать данные о нашей генерации. Перед тем, как мы это сделаем, мы добавим одну штуку. Смотрите, если я, например, вот сейчас такой пишу там, а что, как там, а есть тут кто? И он мне по этому запросу уже побежит генерировать картинку. Но ведь так, по идее, не надо делать, потому что так пользователь у нас расстроится, у него будут списываться токены, если он просто будет писать какие-то рандомные штуки. Поэтому хорошо бы нам здесь добавить некое подтверждение. Подтверждение того, что, ну, хочешь ли ты сгенерировать именно картинку по этому запросу. Поэтому давайте мы вот так здесь у нас под fall вот эту связь мы удалим. Это пока отодвинем вбок. И добавим здесь тоже наш send message. Вот так я сделаю duplicate, перенесу это вот сюда и назову это подтверждение. Теперь нам нужно опять какие-то получить тестовые данные, например, с нашим запросом. Где-то там наш был промт про обезьянку. Вот так я его скопирую и сюда вставлю. Так, он нам сейчас вот отправил снова вот этот текст с подтверждением, но нам нужны просто тестовые данные здесь получить. Мы их получили. Теперь давайте отредактируем наш текст подтверждения. Мы спросим ваш промт. И здесь нам нужно вывести пользователю промт блок код. Я вот так напишу. То есть это будет такой цитатой в Телеграме оформлено ваш промт и текст нашего сообщения. Видите, опять тут подглючило. Я перехожу в JSON, выбираю Telegram и возвращаюсь обратно. И вижу тут, что всё появилось. Ваш промт, текст нам нужен, типа ваш промт вот такой. Ваш текущий баланс тоже покажем. Стоимость одной генерации один токен. Хотите сгенерировать? Ну, хотите сгенерировать? О'кей. И давайте добавим пару кнопок. Я выбираю inline keyбоard, добавляю кнопку, пишу сгенерировать и добавляю здесь, а, callback data. Callback data. Start generation. И вторую кнопку добавляю. Отмена. Отмена. И callback data добавляю. Пусть будет cancel generation. Вот так. Теперь жму execute. И посмотрите, у нас появились появилось две кнопки. Сгенерировать и отмена. Вот он говорит: "Ваш промт создай картинку обезьяны. Ваш текущий баланс токенов три. Хотите сгенерировать?" Да, сгенерировать. Но прежде, чем нам запрашивать подтверждение, нам нужно создать черновик генерации. То есть пользователь что-то написал, мы сразу в базе создали ему там генерация с промтом, вот такой-то черновик. И, соответственно, дальше он уже либо генерирует, либо нет. Давайте создадим наш черновик генерации. А, жму вот тут плюс. До подтверждения жму плюс, пишу Superbase, create arrow. Здесь у нас superaseun, всё подключено. Table name у нас generation. И я добавляю наши айтемы. ID у нас генерируется автоматически. User ID мы берём вот отсюда. Так, сейчас, секунду. Опять у нас глюки. Берём вот отсюда user ID. Нам нужно его ID этой генерации связать с пользователем. Соответственно, мы берём User ID. Так, переносим из get. Дальше, что у нас тут нужно добавить?Мt Промт. А промт у нас будет равен сообщению пользователя, которое он отправил. А дальше у нас есть а credit spend один, ну, то есть стоимость генерации один кредит. Models, model used пока мы не ставим. И статус напишем draft, ну, то есть черновик. Драфт. Что ещё тут у нас есть? Image URL пока не нужен. Generated AD пока не нужен. Всё, убираем. Так, здесь напишем, что создаём генерацию. Мы создаём генерацию. Сейчас он у нас создаст нашу генерацию. Вот видите, у нас создал создалась генерация с нашим чер в статусе черновик. И у нас тут уже прекрасно записался наш промт, насколько я помню. Да, вот промт наш записался. И дальше мы отправляем пользователю наше подтверждение, но уже генерация в базе у нас создана. Отправляем подтверждение. И снова, видите, вот это приходит. А сейчас тут чуть-чуть вот это сейчас почистю, уберу. Теперь смотрите, важный момент достаточно сложный. Вот здесь, где у нас callback data, старт генерация, нам нужно передать вот так через пробел ID вот этой созданной генерации. Пока не спрашивайте зачем, но просто это сделайте вот через один пробел. Вот так. То есть просто start generation и вот так jon перетаскиваете вот этот ID и создаём генерацию. И здесь тоже самое. Копируем. У нас cancel generation. Нам нужно передать Jon ID. Только вот тут нужно выбрать Expression обязательно, чтобы она зелёненькой стала. И я снова нажму Execute, чтобы он нам отправил новые кнопки. Вот это старое уберу. Дальше это мы спустим пониже. Теперь смотрите, если я нажму на какую-то кнопку, например, сгенерировать, я на кнопку нажал, и мне что-то сюда пришло в Telegram. Что мне сюда пришло? Мне сюда пришло некий callback query. Здесь та же инфа, а message и callback data. Это по сути тот колбк, который мы только что отправляли с кнопки. Он пришёл нам сюда. Теперь в зависимости от того, что в этом колбэке, мы можем выполнять разные действия и также прокидывать его там через наши свечи. Сейчас мы это сделаем. Вn это достаточно выглядит странно по логике, но смотрите, вот мы получили сообщение, нам нужно вот здесь добавить ещё один switch. Вот так. даже не switch, а if ещё один if нужно добавить, и мы его назовём callback. То есть, если у нас callк, если это нажатие какой-то кнопки, нам нужно вести по новому сценарию. И как мы это проверяем? Если у нас callback query object exist, соответственно, то мы ведём его вот по этой ветке true. То есть, если у нас пришёл какой-то callback, то мы понимаем, что это пользователь нажал кнопку какую-то, и мы ведём его по ветке true. А если не нажал, то мы ведём его по ветке fф дальше к нашим всем историям. Значит, соответственно, сейчас, если я нажму, то увижу, что он меня поведёт по ветке true. И здесь нам снова нужно, нам нужно эээ проверить, что это был за колбк. Выбираем switch. И в этом свитче, сейчас так это уберём. И в этом свиче нам нужно проверять вот этот data. То есть, если у нас data string contains, то есть содержит слово start generation, то это у нас, соответственно, генерация картинки. А если у нас вот этот вот query data содержит cancel generation, то это у нас, соответственно, отмена. То есть только тут не equal, а contents. Так, и надо здесь переименовать. Переименовать. Супер. Значит дальше давайте делать, дожимать. А если у нас Start Generation приходит, а у нас пришёл Start Generation, видите, он меня повёл по ветке Start Generation. Нам нужно вытащить нашу генерацию и, соответственно, отправить это всё вот уже по нашему запросу, чтобы отправить фото в чат. Я выбираю Base Get Arrow. И здесь у нас из stable name generations я вытаскиваю нашу генерацию по ID. А ID, напомню, мы с вами отправляли в кнопке, помните, мы его передавали. Только теперь нам нужно вот так это перенести callback date. Но, видите, он его сейчас не найдёт. То есть, если я нажму Execute, то он ничего не найдёт и вообще выдаст ошибку, потому что у меня вот тут, кроме ID затисалась вот эта start generation. Поэтому нам нужно вот так сделать spлиit. То есть пишем точка split. Здесь возвращаемся в скобки, ставим кавычки, пишем пробел и один. Вот так. И видите, он нам вернул наш ID генерации. То есть он обрезал вот этот вот starten и оставил нам только ID. Я жму Execute, и он нашёл нам нашу генерацию. Вот она, статус драфт. Всё хорошо у нас. А, только здесь я ещё помимо этого добавлю один фильтр. У нас должен быть статус генерации драфт на всякий случай. Хотя мы вытаскиваем её по ID, но можно и ещё статус добавить. Генерацию мы вытащили. А что это? О чём нам это говорит? О том, что мы вытащили генерацию? О том, что у нас здесь есть уже наш промт. Мы его записывали на прошлом шаге. Вот он, наш промт. И теперь мы этот промт можем спокойненько передать в наш вот этот вот запрос. Так. И передаём. Тут нужно нам будет поправить. Здесь у нас всё о'кей. Только промт нам нужно заменить. Вот так я открою вот это сотру обязательно до кавычек. Тут важно, чтобы всё было чётко, иначе будет ошибка. и просто передаю наш промт. В итоге, видите, как у нас интересно. Всегда актуальный промт, короче, будет пользователю. То есть, если даже он там что-то передумает, перепишет, то промт у нас здесь будет актуальный, потому что мы генерацию вытаскиваем. Правильно. Закрываем. Давайте тут проверим, чтобы у нас, в принципе, всё работало. Я не знаю, может быть, кстати, сейчас будет какая-то ошибка. Вот в сфото меня интересует, но, скорее всего, всё заработает. Давайте теперь попробуем отправить нашу картинку. Всё, он пошёл генерировать. Сейчас сгенерирует и отправит картинку в Telegram. Так, как я и сказал, у нас какая-то ошибка. А он не смог достать чат ID, потому что у нас тут, видите, совсем другая структура приходила изначально тут с колбком и со всей этой фигнёй. Поэтому давайте мы чат ID отсюда удалим и возьмём его. Давайте сейчас мы сделаем ещё одно важное действие. Прежде чем мы всё это отправим, нам нужно вытащить чат ID пользователя и списать с него баланс. Это тоже важно. Про это я и забыл что-то. Значит, после того, как у нас картинка была сгенерирована, мы идём вот сюда, снова пишем super base. Get get arrow. И вот отсюда из сейчас я вот здесь переименую, где мы доставали генерацию, что мы получаем генерацию. Переименую, чтобы вот здесь нам было удобно. Что мы видим? Вот здесь у нас получаем генерацию. И мы здесь вытаскиваем пользователя, у которого ID равен usеer ID из той генерации, которую мы вытащили. Сохраним. И теперь я даже проверять не буду. Открою Telegram. Я просто знаю, что мне тут вернётся. Я просто пропишу, jon Telegram ID. Всё, сохраняем это дело. Давайте обновим страницу и попробуем весь процесс пройти заново. Смотрим, как это сработает. Так, вот тут я нажму Start Execution. И вот наш промт. Мы его снова копируем. Вставляем. Вот он пошёл, нашёл меня в базе, спросил, выдал подтверждение. Ваш промт, создай картинку обезьяны. Я жму execute и жму сгенерировать. И он, видите, пошёл в callback, пошёл генерить мою картинку. И сейчас он мне её отправит уже по нажатию на кнопку пользователя. Мы сейчас вытащили, сейчас всё должно быть хорошо. И потом нам нужно будет после того, как мы отправим это сообщение, ещё списать баланс пользователя, соответственно, обновить вот эту колонку. И сейчас мне пришлёт. Нет, не пришёл. А что-то случилось. А что у нас случилось? А, я понял, что случилось. Да, ребят, сорян, сорян. Мне нужно до того, как мы конвертим всё это в файл это делать. Давайте мы сразу же после того, как получаем генерацию, будем сразу же получать юзер, чтобы у нас вот этот вот процесс наш уже рабочий, он не ломался. То есть мы получили генерацию. Вот это мы убираем и получаем юзера сразу. Я даже переименую. Так. Получаем юзера. Юзера. И дальше уже введём в наш запрос. Всё. Вот здесь мы получаем юзера. Единственное, только вот здесь нам нужно поправить наш промт, потому что он будет опять с ошибкой. И получаем генерацию. Мы берём наш промт и вставляем сюда. Так, save. Сейчас должно заработать. Давайте попробуем просто нажать на кнопку и заново всё это дело отправить. Так вот, он получил генерацию, получил юзера, делает запрос и отправляет, надеюсь, уже нам в Telegram нашу картинку. Нет, не отправляет. Да, друзья, сорян, бывает. Значит, в чём ошибка? Опять видите, чат ID красным загорелся. Убираем и от нашего получаем юзера переносим сюда чат ID. Вот теперь точно должно заработать. Ура, картиночка наша пришла. Супер, супер, супер. Остался финальный шаг у нас. Это обновить баланс. После того, как мы отправили нашу фотку, мы снова пишем Supase. И мы выбираем update arrow. Значит, сначала мы обновим у нас генерацию нашу. Выбираем table name generation, выбираем add condition. здесь, э-э, idals и находим наш ID генерации. Из ночаем генерацию, перетаскиваем ID. Э, и добавляем. Что мы тут добавляем? Во-первых, промт у нас уже добавлен, credit spend у нас добавлен, model used. Ну, давайте напишем тут [музыка] нанобана, например, если вдруг у нас потом будет много моделей. Дальше статус мы пишем complete. Completed, то есть генерация, всё, она завершена. Дальше image URL. Давайте передадим сюда просто вот этот вот basйс. Ну, на случай, если нам надо будет потом его как-то вытащить. Вот этот вот этот текст и передадим. Отлично. И здесь мы напишем, что мы обновляем, завершаем генерацию вот так в базе в нашей. И теперь обновляем баланс финально. Сейчас я ещё разок это перезапущу. Даже не так. Давайте вот прямо смотрите, из Телеграма отводим ещё одну стрелочку и пишем снова Superbase. Superbase update arrow. Выбираем нашу таблицу users. Выбираем, что нам нужно обновить пользователя. ID. Находим этого пользователя. Вот отсюда получаем юзера. Находим его ID. Condition equals и обновляем. Нам нужно обновить Generation Balance. И давайте мы возьмём вот этот Generation Balance. Вот так. И просто сделаем ему вот так. Минус пробел и из получаем генерацию. Мы возьмём Credдиit spend. Вдруг у нас будет потом что-то стоить. Дороже какая-то генерация. Пока что она везде по умолчанию один, но видите, как смотрите, мы взяли текущий баланс и отняли знаком минус от него стоимость генерации в кредитах. И у нас был баланс три, стало два. Всё. Сейчас напишем. Обновляем баланс. Обновляем баланс. Сохраняем. Сложная штука получается уже, но зато красиво всё работает. Сейчас финал. Финалочка. Ещё добьём всякие украшательства, там типа менюшки и отмены генерации. Нам ещё нужно сделать. А давайте, что попробуем ещё раз. Давайте прямо в режиме реального времени, что ли. Надеюсь, ошибок не будет. Какую бы ещё картинку сгенерировать? Э, нарисуй, э, фото человека на фоне гор. Ну, хотя нарисуй фото, нарисуй человека на фоне гор. Вот он мне говорит: "Ваш промт такой-то, ваш текущий баланс генерации 3," потому что мы последнюю генерацию не протестили, то есть не нажали тут п и поэтому в базу ничего не записалось. Поэтому сейчас я жму сгенерировать. и он пойдёт мне генерировать. Смотрим execution. Видим, что у нас что-то тут работает, завелось после нескольких ошибок. И вот получилась картинка. Пришла картинка. И теперь смотрите, если я напишу старт, то он мне напишет, что генерации осталось две. Две штуки. То есть одна у нас а была вычистена. О'кей. Давайте добавим теперь отмену генерации. Ээ, быстренько последним шагом отмену генерации. Значит, напомню, у нас тут был callback, start generation и cancel generation. И в cancel generation нам, по сути, нужно что сделать? Нам нужно вот так продублировать, получить вот эту нашу генерацию и сделать ей статус cancel. Ну, то есть типа пользователь отменил. Давайте я сохраню и для начала получу какие-то тестовые данные. Тестовые данные, чтобы он у нас пошёл по нужной ветке. Жму так, деактивирую, чтобы заработало. Жму, а, и пишу: "Привет". Ну, например, любое сообщение. Нам тут не важно, важно данные получить. А, привет. Сейчас быстренько мы это всё прогоним. Так, так, так. И вот сюда на подтверждение отправляет подтверждение. Хотите сгенерировать? Я сейчас нажму отмена. Нажму отмена. И он меня, видите, повёл уже по ветке cancel generation. Даже вот вот так сделаю, чтобы было понятнее. Cancel generation. Мы получили вот эту генерацию. И теперь нам нужно даже не get, а update. Arrow update ID equal. Вот это ID генерация. И статус у нас equal. А так это мы статус удаляем. Получаем генерацию по ID. И field у нас статус cancel. Cancel. Статус canceled мы обновляем. И теперь давайте ещё одну сделаем штуку. Напишем Telegram и напишем Delete chat message, чтобы у нас бот не захломлялся. Я вот здесь так сейчас найду своего бота. Подключение. И нам нужно удалить просто предыдущее сообщение. Вот это, потому что если мы жмём отмена, то пусть оно удаляется. Зачем оно тут пользователю нужно? Давайте его удаляем. Удалять будем. Э, я иду в Telegram и, а, соответственно, я иду в Telegram, забираю вот здесь чат ID нахожу, забираю и Message ID, который нам нужно удалить. Message ID. Вот он 74 Message ID. Всё, save. И теперь смотрите, если я нажму Execute, я нажму отмена, то он мне просто удалит это сообщение. Ну, и как бы э скажет, что генерация у нас у нас тут сейчас насоздаётся куча генераций, что мы много раз тестировали. Вот. И вот она у нас генерация status canceled. Вот она пришла. А тут всё у нас заполнилось. Видите, у нас и картинка есть, и текст, и всё, всё у нас хранится. Давайте финально добавим парочку украшательств небольших, чтобы у нас тут какая-то менюшка появилась, ээ чтобы пользователь мог всегда вернуться там к своему балансу генераций. Я жму тут нано бананобот, выбираю изменить, изменить команды и закидываю боту команды вот по такой схеме у нас будет команда, соответственно старт. И это типа пусть будет, э, баланс генераций. Одну команду мы добавим всё. Команда в бота добавлена. Сейчас она вот здесь появится у нас. Вот она появилась в меню старт, баланс генерации. И, соответственно, тут всё очень просто. Если я активирую и жму просто старт, то мне приходит моё сообщение: "Добро пожаловать". Ваш баланс генерации два, стоимость одной генерации один токен. Также здесь вы можете добавить команду "Пополнить баланс" или вот в этом сообщении можно добавить кнопку "пополнить баланс". Также ввести его через кнопки, в общем, через свечи и настраивать уже оплату. Как я и сказал, видос по оплате будет в моём закрытом канале. Это будет такой эксклюзивчик. Вот. А здесь полностью сейчас разберём, как это всё реализовать, как прикрутить пополнение баланса, покупку токенов. Также все промты будут вот в этом канале Яишный клуб. Эээ, всё, что я использовал, все тексты вот этих вставок в Superabase, вот эти все переменные разные промты, не промты, вернее, команды. Промтов тут не было, команды. Всё, я сюда выложу весь код, который использовали, поэтому переходите. Тут классный канал. Я сюда очень редко пишу, ребят, на самом деле. Тут, ну, прямо редко пишу, поэтому качественно пишу туда сам. Много народу. Смотрите, какая активность хорошая. И эксклюзивчик вшном клубе. Если хотите также создавать и агентов разных операторов, чатботов, всё, что нужно, у вас есть большой курс по автоматизации втnном клубе. Переходите. Стоит полтораха в месяц. Дополнительно ещё куча куча шаблонов, микроуроков, активность, ответы на вопросы. Это такое комьюнити наша, автоматизаторов, людей, которые создают свои проекты, запускают микробизнесы и на этом зарабатывают. Я сейчас активно буду эту тему продвигать. Подписывайтесь на YouTube канал. Получился у нас классный бот. Давайте мы ещё раз его протестируем, напишем какой-нибудь любой промт. Сделай мне фото собаки австралийской овчарки. Я, кстати, ещё забыл, ребята, одну штуку сделать. Сейчас только понял, когда в финале видео забыл сделать проверку баланса, чтобы если у нас был баланс ноль, соответственно, то у нас ничего не генерировалось. Ну, это я тоже сделаю в закрытом канале. Это логичнее делать, когда у нас будет оплата привязана. Тоже проверку баланса туда добавлю. Вот у нас получилось наше фото. Ну всё, спасибо вам. Спасибо, что досмотрели до конца. Очень приятно мне, когда люди досматривают до конца длинные мои ролики. Напишите в комментариях, как вам формат, подача, каких ещё сервиса сделать, что рассмотреть. Если есть какие-то ошибки, вопросы, то пишите либо в комментах на Ютубе, либо вот здесь вот в мой ТГ канал, либо вступайте в яичный клуб, я там отвечаю каждый день. Спасибо всем, пока-пока. M.