Свой бесплатный телеграм-бот на базе GPT4free
В этой статье я покажу, как создать свой телеграм-бот ChatGPT на базе библиотеки GPT4free.
В телеграме меня просили написать гайд, как сделать телеграм-бот на базе бесплатной библиотеки GPT4free. Я решил его написать и также дополнительно выложить исходный код, в качестве базового, но вполне рабочего примера, на гитхаб, чтобы любой желающий мог нажать условные пару кнопок и протестировать или использовать в своих целях.
Я был очень удивлен, когда увидел, что в интернете на базе бесплатной библиотеки для Python GPT4free делают проекты, за которые берут деньги! Один из таких проектов даже сделал подписку на токены; по моему мнению, это полнейший кринж — брать деньги за то, что в открытом доступе и, более того, базируется на сторонних веб-сервисах, которые и предоставляют доступ к ChatGPT. GPT4free — ни что иное как API к веб-мордам этих сервисов, а никакое не хакерство и уязвимость в API Open AI, как в новостях писали неграмотные журналисты. Использование веб-версий кардинально отличается от платного оригинального API Open AI со всеми вытекающими минусами в виде лимитов или блокировок по GEO IP. Стоит ли говорить, что 100% стабильности бесплатное решение не гарантирует? Кто те особо одаренные, кто платит таким товарищам, я не знаю, поэтому и пишу эту статью, чтобы любой мог пользоваться бесплатно.
Для создания телеграм-бота я буду использовать библиотеки Aiogram и g4f. Структурно для работы нам потребуется несколько вещей.
1) Хранить историю сообщений пользователя, так как ChatGPT по API не имеет памяти, соответственно, чтобы вести связный диалог, нужно отправлять всю его историю вместе с каждым сообщением. При использовании g4f, а не оригинального API максимальный размер такого диалога ограничивается контекстным окном. Мы не знаем размер этого контекстного окна у сервисов, поэтому в коде будут использоваться простейшие методы для обнаружения этого в виде принтов в консоль после каждого сообщения с указанием общей длины диалога.
2) Обрезать историю сообщений пользователя, для того чтобы не превышать размер контекстного окна: превышение приведет к ошибке. Также необходимо дать возможность вручную очищать историю диалога, например, чтобы начать беседу на новую тему.
3) Отправлять историю сообщений и получать ответ от ChatGPT.
import logging
from aiogram import Bot, Dispatcher, types
import g4f
from aiogram.utils import executor
# Включите логирование
logging.basicConfig(level=logging.INFO)
# Инициализация бота
API_TOKEN = 'ВАШ ТОКЕН ТЕЛЕГРАММ'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Словарь для хранения истории разговоров
conversation_history = {}
# Функция для обрезки истории разговора
def trim_history(history, max_length=4096):
current_length = sum(len(message["content"]) for message in history)
while history and current_length > max_length:
removed_message = history.pop(0)
current_length -= len(removed_message["content"])
return history
@dp.message_handler(commands=['clear'])
async def process_clear_command(message: types.Message):
user_id = message.from_user.id
conversation_history[user_id] = []
await message.reply("История диалога очищена.")
# Обработчик для каждого нового сообщения
@dp.message_handler()
async def send_welcome(message: types.Message):
user_id = message.from_user.id
user_input = message.text
if user_id not in conversation_history:
conversation_history[user_id] = []
conversation_history[user_id].append({"role": "user", "content": user_input})
conversation_history[user_id] = trim_history(conversation_history[user_id])
chat_history = conversation_history[user_id]
try:
response = await g4f.ChatCompletion.create_async(
model=g4f.models.default,
messages=chat_history,
provider=g4f.Provider.GeekGpt,
)
chat_gpt_response = response
except Exception as e:
print(f"{g4f.Provider.GeekGpt.__name__}:", e)
chat_gpt_response = "Извините, произошла ошибка."
conversation_history[user_id].append({"role": "assistant", "content": chat_gpt_response})
print(conversation_history)
length = sum(len(message["content"]) for message in conversation_history[user_id])
print(length)
await message.answer(chat_gpt_response)
# Запуск бота
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Как видите, код очень простой, всего 66 строк. Это БАЗА. Если вы по непонятной причине планируете использовать бесплатный телеграм-бот в серьезных целях, то вам потребуется любая база данных для хранения истории пользователя. В текущем коде сообщения хранятся в памяти, и этого более чем достаточно даже для использования совместно с друзьями или коллегами. Также НИКОГДА не храните API ключи в самом коде, в примере это сделано нарочно для самых маленьких, чтобы уж точно запустилось у всех и не было вопросов в комментариях. Ссылка на исходники на гитхаб.
В переменной provider вы можете выбрать любой провайдер из тех, что доступны, посмотреть список можно на гитхабе.
Провайдеров с доступом к ChatGPT-4 не так много, и многие из них или нестабильны, или имеют ограничения по GEO IP, или требуют авторизацию либо cookies. В примере на гитхабе я использовал провайдера, который нормально относится к IP-адресам из России.
Из реально стабильно и постоянно работающих ChatGPT-4 провайдеров — bing, но для его использования нужен прокси или впн. Если устанавливать телеграм бота на VPS, лучше использовать зарубежный. В самой библиотеке gpt4free поддерживается использование прокси, но вот мое мнение: если уже есть прокси или впн, зачем тогда этот самый бинг в телеграм-боте нужен? Можно же его использовать в оригинальном виде. Chat.geekGPT и phind тоже работают, но с переменным успехом. Я лично рекомендую использовать провайдеров ChatGPT 3.5: там и с IP из России можно, и не нужно париться с cookies; да и работа быстрая и относительно стабильная.
Для того чтобы использовать прокси, нужен следующий код:
response = await g4f.ChatCompletion.create_async(
model=g4f.models.default,
messages=chat_history,
provider=g4f.Provider.GeekGpt,
proxy="http://host:port",
# or socks5://user:pass@host:port
timeout=120, # in secs
)
chat_gpt_response = response
Для выбора провайдера можно запускать телеграм-бот прямо из IDE и смотреть в консоли принты для отладки, чтобы определить максимальное контекстное окно выбранного провайдера. Просто пишите боту сообщения, можно сразу копипастить большие и смотреть, сколько символов они занимают; в коде для упрощения считаются только символы сообщений пользователя и ответы ChatGPT — то, что в словаре по ключу content. Технические данные не считаются, да и это не нужно. Надо понимать: это контекстное окно модели — 4096 токенов, либо 16384. Либо вообще что-то маленькое и ограниченное; да, есть и такие модели, но их лучше не использовать.
Инструкция по созданию телеграм-бота на Linux Ubuntu в картинках для самых маленьких
Для начала идем в телеграм-бот @BotFatherи пишем команду /newbot; далее выбираем название бота. Следующим сообщением нужно выбрать username — в конце обязательно нужно указать _bot по принципу, как сделано на скриншоте. Все, ваш бот создан.
Копируем токен бота в код.
# Инициализация бота
API_TOKEN = 'ВАШ ТОКЕН ТЕЛЕГРАМ'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
Далее сразу нужно создать кнопку в меню для очистки истории диалога, чтобы потом не возвращаться к этому. Пишем команду /mybots. Выбираем свой бот. Нажимаем Edit bot, далее Edit commands. Затем пишите clear — очистка истории сообщений. Теперь при написании команды или выборе в меню /clear будет очищаться диалог с пользователем.
Для работы на винде, например в IDE для тестов, достаточно запустить IDE, создать окружение, клонировать код с гитхаба или вручную скопировать в папку, далее ввести в терминале pip install -r requirements.txt и заменить API_TOKEN на токен вашего телеграм-бота, который вы только что получили.
На Ubuntu вам придется создать папку; я для удобства использую winSCP, вы можете использовать что удобно, в том числе клонировать с гита и перейти в папку командой.
Запускаем Putty и подключаемся к серверу либо из терминала:
git clone https://github.com/LORD-A-B/Telegram-bot-gpt4free.git
cd Telegram-bot-gpt4free
Либо создаем папку в WinSCP, копируем в нее main.py и requirements.txt. А затем переходим туда в консоли командой:
cd названиепапки
Обновляем список пакетов:
sudo apt update
По умолчанию в ubuntu уже установлен Python, проверяем командой:
python3 --version
pip3 --version
Обычно менеджер пакетов pip3 не установлен в Ubuntu, устанавливаем командой:
sudo apt install python3-pip
Также установите виртуальное окружение venv командой:
sudo apt install python3.10-venv
Далее убедитесь, что вы находитесь в нужной вам папке. Если нет — воспользуйтесь командой cd, а также командой ls и проверьте, содержатся ли в папке нужные вам файлы.
Создаем виртуальное окружение внутри папки:
python3 -m venv venv
Активируйте виртуальное окружение командой:
source venv/bin/activate
Установите необходимые библиотеки командой:
pip install -r requirements.txt
Теперь нужно сделать так, чтобы бот автоматически запускался и был активен при старте сервера. Идем в папку /etc/systemd/system/ и создаем любым удобным вам образом, я рекомендую через winSCP. Файл tgbot.service, в нем пишем:
[Unit]
Description=My Telegram bot
[Service]
WorkingDirectory=/tgbot/
User=ИМЯ ПОЛЬЗОВАТЕЛЯ ЗАМЕНИТЕ НА СВОЕ
ExecStart=/tgbot/venv/bin/python3 /tgbot/main.py
[Install]
WantedBy=multi-user.target
Замените в тексте имя пользователя на свое, а также tgbot замените на вашу директорию с папкой.
Далее используйте следующие команды:
sudo systemctl daemon-reload
sudo systemctl start tgbot.service
sudo systemctl enable tgbot.service
Ваш бот готов, чтобы проверить его статус, используйте команду:
sudo systemctl status tgbot.service
Все готово, тут все очень легко. Если выдает ошибку 403, значит, ваш IP провайдеру не нравится по каким-то причинам.
В данный момент я готовлю к релизу программу, ассистент на базе ChatGPT для Windows, который помогает проходить собеседования (лайв-кодинг, тестовые задания), а также его можно просто использовать как обычный ChatGPT, но без VPN, на базе оригинального API или на базе того же GPT4free. От аналогичных программ моя отличается тем, что имеет распознавание изображения и текста, сразу передает в ChatGPT и выводит ответ, также имеется режим невидимости, что очень полезно для собеседований и лайв-кодинга. В режиме невидимости интерфейс программы не видно, а ответы отправляются в ваш личный телеграм-бот. Программу я уже протестировал на прохождении собеседований. Когда все будет готово, тоже напишу статью. Если интересно, заходите в телеграм. https://t.me/game_2hard