ChatGPT Telegram Бот на Zennoposter [By FLEXZ SHIT]
FLEXZ SHIT - https://t.me/f1rockstar
Telegram Бот на Zennoposter, а почему нет? А кто против?
Доброго времени суток, сегодня речь пойдет об использовании Zennoposter в достаточно нестандартной ситуации. Одним днём, в мою светлую голову пришла потрясающая идея реализовать бота Chat GPT средствами Зенки.
На этом моменте большинство людей знающих как расшифровывается аббревиатура ЯП, покинули данную статью, что ж, продолжаем.
Ну, а если серьезно, сама идея писать бота в зенке кажется безумием, в принципе таковым и является, но оно работает! Да, конечно, скорость оставляет желать лучшего, но как мне кажется для небольших ботов: шопов, аналитиков, чекеров - функционала Зенки более чем хватит, тем более, что мое решение подразумевает что ботом пользуется несколько человек параллельно.
Еще раз повторю, я и сам понимаю что это очень странное решение, более чем, я уверен что если грамотно составить ТЗ ChatGPT напишет бота лучше, функциональнее, быстрее на любом ЯП.
Но я здесь чтобы поделиться парой фишек, показать интересный кейс и подкинуть парочку идей. Можем начинать!
Логика работы бота
Дальше я буду рассказывать конкретно про мой кейс, но вы можете применять подобную механику где-угодно. Бот работает за счет Telegram API, DB, CHAT GPT API, хостинга для домена и DB.
Про устройство API особо рассказывать не буду, пару фишек по работе с ними покажу в конце статьи. Там же приложу всю полезную документацию.
Бот работает на некотором количестве шаблонов, минимально - 2. Для того чтобы объяснить логику работы, мне придется открыть Paint.
Для начала нам нужно как минимум два шаблона, удобства ради назовем первый - catcher'ом, второй - worker'ом.
Catcher принимает смски от юзера по средствам DB и WebHook(Об этом позже), отслеживает занятость worker'ов, и отклоняет последующие сообщения юзера, если одно из них уже находится в обработке.
Worker в свою очередь принимает в обработку сообщения которые ему передает Catcher, обрабатывает команды, работает с Chat GPT, ведет статистику потраченных юзером токенов и возвращает ответ в диалог TG.
Для чего нужна такая "двухъярусная" система? Если сунуть все в один шаблон, то ни о какой работе в потоке, и параллельно с несколькими юзерами речи не идет. Шаблон будет большой, и медленный, а если не дай бог, он разъебется где-то по пути...
Catcher занимается только ловлей смс, он делает это максимально быстро и надежно, после чего вручает запрос юзера свободному worker'у на обработку. Если мы хотим увеличить количество юзеров с которыми бот может взаимодействовать параллельно, мы просто добавляем еще пару шаблонов типа worker(как на картинке выше), а catcher'у добавляем возможность распределять сообщения юзеров новым worker'ам. Устройство шаблонов внутри Зенно я покажу чуть позже, сперва закроем тему с ловлей месседжей.
Ставим и настраиваем WebHook
Первый вопрос который перед нами встает - как отлавливать все мессаги юзеров, бесперебойно, 24/7. Все решения которые я находил на Zennolab'e подразумевают спам запроса Update к telegram API, что не самый надежный метод, тк юзер может отправить несколько сообщений подряд, или юзеров использующих бота параллельно может быть несколько. В таком случае следующий месседж просто пролетит мимо нашего бота, так как обычно параметр Update настроен на ловлю последнего отправленного боту сообщения, что делает невозможным работу в потоке.
Но, из этой ситуации есть выход - WebHook.
Что за "ВебКрючок"? WebHook это метод, который привязывает все обновления бота к конкретному юрлу и шлет на него запросы в формате JSON. Почти тоже самое что и Update, только имеет возможность модификации.
Установим WebHook. Для этого нам понадобится следующий url:
https://api.telegram.org/bot[бот_токен]/setWebhook?url=[ссылка_на_домен]
Как получить токен бота я рассказывать не буду, не маленькие уже, разберетесь.
А про домен расскажу подробнее. Нам надо чтобы сообщения юзеров летели на наш домен, и там, с помощью скрипта отлавливались и складывались в DB для дальнейшей обработки в Zennoposter. Собстна, если вы находитесь в данном чате - вероятнее всего у вас есть домен и хостинг на котором он стоит, в моем случае это lealhost, поэтому, покажу на его примере как выглядит настройка.
Для начала в файловом менеджере домена надо создать папку, где будет лежать скрипт с отловом запросов(это необязательно, но так будет удобнее)
У себя на компе создаем текстовый файлик index.php, в него вбиваем скрипт:
https://telegra.ph/Skript-12-19-3
Закинул скрипт и пояснения к нему на отдельную страницу, чтоб не уродовать оформление статьи.
Далее загружаем index.php в созданную нами папку на хостинге, и указываем путь к ней когда ставим webhook, конечная ссылка на подключение вебхука выглядит примерно так:
https://api.telegram.org/bot123456789:qwerty/setWebhook?url=https://domen.com/Chat_Gpt_script/
По ней надо перейти через браузер, или отправить get-запрос из самой зенки, если получаем ответ: Webhook was set, значит все прошло успешно.
Дабы проверить работоспособность, пишем какую-нибудь гадость нашему боту в TG, и смотрим поймали ли мы что-то в DB.
Как видим, появилась новая строчка с инфой о сообщение в JSON. Сам текст сообщения закодирован в Unicode, внутри Зенки его можно раскодировать на человеческий, но нам это ни к чему, тк ChatGPT API также работает только с JSON.
Важно! У домена к которому привязываем WebHook должен быть сертификат, иначе telegram обидится и не захочет с ним работать.
Также, наличие Webhook'a на домене никак не влияет на его работоспособность, он все также будет выполнять свои основные функции.
Внутри таблицы, рекомендую всегда добавлять столбик Id, который проставляется сам через AUTO_INCREMENT. А также парсить через скрипт user_id, вынося его в отдельный столбик(как на скрине выше). Эти два простых действия очень сильно облегчат процесс организации внутри Зенки.
И еще, почему-то нигде не упоминается что на lealhost'e, в самом простом тарифе дают бесплатные DB'шки, что меня очень обрадовало))
Как работает Бот в Zennoposter
Сперва Catcher тянет из DB смс юзеров, большую часть времени он бесконечно обновляет DB. К сожалению, Зенка пока не научилась самостоятельно принимать запросы и отвечать на них, поэтому приходится идти через костыль с DB и WebHook'ом.
Для того чтобы вы могли сами потыкать кнопочки, подергать стрелочки и по отправлять запросики приложу шаблон в конце статьи :)
Как Catcher видит новые смс? Помните, при описании скрипта я делал акцент на столбце status? Каждому пойманному запросу мы выдаем статус, по дефолту это ноль, что означает что запрос не обработан. Как только Catcher заканчивает работу с пойманным запросом, мы присваиваем ему значение 1. Что означает что запрос прямо сейчас в обработке в одном из Worker'ов. Нужно это для того, чтобы Catcher не брал бесконечно один и тот же запрос, забивая всех Worker'ов. Таким образом, Catcher обрабатывает каждый новый запрос по одному разу, после чего ждет новые. Дальше переходим к антиспаму.
Тут считаю нужным уточнить, что для взаимодействия с юзерами у меня предусмотрена отдельная таблица DB, с айдишниками, никами, статусами, токенами Chat GPT и тд.
Нужно это в первую очередь для защиты бота от спама, как только смс юзера поступает в обработку, в DB на него вешается статус blacklist. Пока первое смс юзера не обработается, бот не пустит новые сообщения на обработку. Собственно блок под Catcher'ом этим и занимается - проверкой статуса юзера, и если все норм - идем в worker's hub, если юзер в blacklist'е - просим подождать, и отчищаем DB Catcher'a от всех сообщений этого user_id. Для этого кстати и стоило парсить user_id отдельно, чтобы иметь возможность ссылаться на все смс конкретного пользователя.
Worker's Hub. Здесь мы обращаемся к еще одной DB таблице со статусами worker'ов. Тут все просто, если первый занят, идем ко второму, если второй занят идем к третьему, если третий занят пишем юзеру что бот переживает тяжелые времена, и вообще ему сейчас очень трудно, кризис среднего возраста, работа 24/7, крч помочь юзеру он сможет как-нибудь в следующий раз.
Если нашли свободного worker'a, то на месте его статуса в DB вставляем пойманный JSON. Внутри worker'ов устройство схожее с catcher'ом, только они слушают DB со своими статусами, и если он не нулевой, значит пора работать.
Самих worker'ов я показывать не буду, ибо там очень много лишнего мусора, да и если вы поняли принцип работы выше, то и worker'ов сможете сделать сами :)
Главное не забываем возвращать все статусы в исходное положение(blacklist, worker's status) чтобы бот не помер, или не случилась гуманитарная катастрофа в личке пользователя))
Про ChatGPT API
Вообще ChatGPT сам по себе это достаточно мощный инструмент, который в правильных руках очень сильно упрощает работу с кодом, креативами, изучением различных тем, библиотек и тд. По сути API это все тот же чат гпт, только с возможностью небольшой настройки и в формате post-запроса.
Чтобы отправить такой запрос указываем url: https://api.openai.com/v1/chat/completions
И вставляем само тело запроса:
"messages": [{"role": "user", "content": "{-Variable.user_message-}"}],
Также не забываем поставить тип данных application/json, и указать в заголовках API-Key ChatGPT(Получаете в настройках своего аккаунта на openai.com)
Параметр temperature отвечает за "креативность" ответа, 0 - сухой, максимально прямой и технически верный ответ, 1 - GPT напрягает все свои нейронные извилины чтобы выдумать самый креативный ответ. Ответ от сервера также приходит в JSON. Больше про работу с ChatGPT API можно почитать в их документации.
Тут важно отметить что использование ChatGPT API платно, но есть нюанс...
Во-первых, на любой новый аккаунт OpenAI дает халявных 5 баксов, которые можно потратить на доступ к API GPT 3.5, и ряд других моделей. Во-вторых, цена указана за 1к токенов.
Что такое токены? Токены это частички слов, которыми чат гпт видит ваш текст, и пишет свой. Тут конечно тоже проблем хватает, если в случае с английским языком 1к токенов это 750 слов, то в случае с русским эту цифру приходится делить на два :(
Но даже так, 5 баксов на одном аккаунте это чуть больше 2,5 миллионов токенов, что в русских словах ~800к слов. Напоминаю что номер для нового аккаунта OpenAI на некоторых сервисах смс активации стоит 1,5 рубля.
Я думаю суть вы уловили, API ChatGPT 3.5 - бесплатные :)
Чего не скажешь про ситуацию со старшей моделью - Gpt 4 Turbo
Мало того что цены начинают кусаться, так еще и нельзя использовать халявные 5 баксов. Тут лично я никаких вменяемых способов наебать систему не вижу. Могу сказать что тройки хватает для закрытия 95% задач.
Но если вам все же ОЧЕНЬ нужно воспользоваться API ChatGPT 4, есть ряд лайфхаков:
1) OpenAI принимает оплату банковскими картами. Российские карты очевидно не пройдут. Но есть сервисы на подобии Openrouter.ai, которые предоставляют доступ к API ChatGPT по идентичным ценам. Из преимуществ можно отметить оплату криптой(правда за свои услуги они просят 5%), работу с любым IP и решение проблемы с лимитами API. Но эти ребята не дают 5$ для GPT 3.5 :(
2) Можно экономить токены GPT 4, если переводить ваш русский запрос на английский, отправлять запрос гпт, принимать ответ, и переводить обратно. Реализовать это можно через API переводчика. Костыль? Да, но если запариться, можно сильно удешевить стоимость токена, в 2, 2.5 раза. Ну или пишите только на английском.
Также уточню что у ChatGPT API есть ряд лимитов, зависят они от количества бабок которые вы занесли OpenAI, по дефолту, на всех "бесплатных" аккаунтах - это 200 запросов в сутки. Openrouter например берет эту проблему на себя.
Но вам, в случае с GPT 3.5 ничего не мешает чередовать бесконечное количество API ключей с разных аккаунтов.
Подводим итоги
ChatGPT это замечательный инструмент который явно стал прорывом этого года. Лично я использую его чуть ли не каждый день, и отказываться от него смысла не вижу.
По материалу этой статьи можно реализовать следующую идею: Бот автоответчик внутри TG, который будет от лица модели, например, общаться с дрочерами. При грамотно выстроенной модели диалога, ChatGPT будет оформлять конверсии без вашего участия)) Такую систему можно применить и за рамками телеграма, потолок, как обычно - ваша фантазия :)
Документация:
https://core.telegram.org/bots/api - Telegram API
https://platform.openai.com/docs/api-reference - ChatGPT API
https://platform.openai.com/tokenizer - Как работают токены, стоимость слов
https://zennolab.com/discussion/threads/razbiraem-user-api-telegram-po-kostochkam.103142/ - Статья про Telegram User API, если все же решите реализовать идею с моделью)