Сложность: Уровень сложностиУровень сложностиУровень сложности

Как сделать Telegram-бота на основе нейросетей для мониторинга сообщений

Бывает, что нужно контролировать несколько чатов одновременно: в одних следить за общением сотрудников, в других — за переговорами с клиентами. И вовремя реагировать на все возможные проблемы. Следить за чатами вручную неудобно, потому что придется тратить на мониторинг 90% рабочего времени. Чтобы сэкономить время, можно создать бота, который будет следить за чатами вместо вас. И если что-то пойдет не так — будет сигнализировать вам.

Как создать такого бота и подключить к нему нейросеть — рассказываем в гайде.

Шаг 1. Создаем бота

Откройте Telegram и перейдите в бот @BotFather. Когда откроется диалог, нажмите start и выберите команду /newbot. Придумайте название для бота и юзернейм. В ответном сообщении вам пришлют ссылку на него и токен. Обязательно скопируйте его и сохраните где-нибудь. Он выделен красным и похож на ссылку.

Шаг 2. Пишем код бота

Чтобы создать бота для мониторинга чатов, придется написать код на Python. Конструктор для таких целей не подойдет, потому что там придется погружаться в функционал сервиса и тратить много времени на разработку.

Чтобы получить рабочий код, я продумал механику работы бота → подумал над промптом → пришел в Claude и написал такой запрос:

Prompt

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

Пояснение:

Я и мои сотрудники много общаются с клиентами в Telegram. Обычно мы создаем чат: я, Project Manager и клиент. И Project Manager общается с клиентом, а я в этом чате не участвую. Но иногда происходит такое, что клиент начинает злиться или проявлять агрессию. А Project Manager может не справляться или отвечать неэтично. Я хочу автоматически получать уведомление о том, что в чате какая-то проблема. 

Если помощник не справляется или клиент злится, бот это замечает и пишет мне в личные сообщения.

В итоге получился такой код:

import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
import requests
import json

# Настройки
TELEGRAM_BOT_TOKEN = "YOUR_BOT_TOKEN"
PERSONAL_CHAT_ID = YOUR_CHAT_ID  # Замените на ваш личный chat_id
OPENAI_API_KEY = "YOUR_OPENAI_API_KEY"
MODEL_NAME = "gpt-4o-mini" 

# Настройка логирования
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)

def analyze_message(text: str) -> str:
    headers = {
        "Authorization": f"Bearer {OPENAI_API_KEY}",
        "Content-Type": "application/json"
    }
    
    data = {
        "model": MODEL_NAME,
        "messages": [
            {"role": "system", "content": "Ты анализируешь сообщения на наличие конфликта или негатива. Отвечай только 'конфликт' или 'нет'."},
            {"role": "user", "content": f"Определи, негативно или конфликтно ли следующее сообщение. Ответь одним словом: 'конфликт' или 'нет'.\n\"{text}\""}
        ]
    }
    
    try:
        response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=data)
        response.raise_for_status()
        result = response.json()['choices'][0]['message']['content'].strip().lower()
        return result
    except Exception as e:
        logger.error(f"Ошибка при анализе сообщения: {e}")
        return "ошибка"

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    if update.message and update.message.text:
        text = update.message.text
        result = analyze_message(text)
        if result == "конфликт":
            chat = update.effective_chat
            user = update.effective_user
            
            if chat.username:
                message_link = f"https://t.me/{chat.username}/{update.message.message_id}"
            elif chat.type != 'private':
                message_link = f"https://t.me/c/{str(chat.id)[4:]}/{update.message.message_id}"
            else:
                message_link = "Личное сообщение"

            # Формирование информации о пользователе
            user_info = f"@{user.username}" if user.username else f"{user.first_name} {user.last_name}".strip()
            user_info += f" (ID: {user.id})"

            await context.bot.send_message(
                chat_id=PERSONAL_CHAT_ID,
                text=f"Проблема в чате {chat.title or 'Личный чат'}:\n\n"
                     f"Ссылка: {message_link}\n\n"
                     f"Отправитель: {user_info}\n\n"
                     f"Содержание: '{text}'"
            )

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text('Бот запущен и готов анализировать сообщения.')

def main() -> None:
    application = Application.builder().token(TELEGRAM_BOT_TOKEN).build()

    application.add_handler(CommandHandler("start", start))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))

    logger.info("Бот запущен")
    application.run_polling()

if __name__ == '__main__':
    main()

Жирным в коде выделены места, которые вам нужно заменить. Вместо YOUR_BOT_TOKEN нужно вставить токен вашего бота. Его мы получили на шаге 1.

Вместо YOUR_CHAT_ID нужно вписать личный chat id Telegram. Чтобы его найти, перейдите в Telegram и напишите боту @userinfobot. В ответ он пришлет ваш chat id.

В поле YOUR_OPENAI_API_KEY вставьте API-ключ от ChatGPT. Чтобы его найти, перейдите на сайт platform.openai. Кликните на «Dashboard» → раздел «API keys» и нажмите «Create new secret key». Скопируйте ключ.

В строке MODEL_NAME по умолчанию стоит старая версия gpt-4o-mini. Для наших задач ее хватает, поэтому можно оставить ее. Преимущество в том, что она очень дешевая и на месяц работы хватит буквально $5.

Если вы планируете использовать какой-то более сложный промпт или нейросети нужно будет анализировать сложные сообщения, можете прописать модель gpt-4o. Она умнее версии mini.

В разделе «role»: «system», «content» нужно прописать системный промпт для нейросети. То есть, задать главную инструкцию, которой бот должен придерживаться в работе.

Например, можно использовать такой промпт:

Prompt

{“role”: “system”, “content”: “Ты анализируешь сообщения на наличие конфликта или негатива. Отвечай только ‘конфликт’ или ‘нет’.”}

А в разделе «role»: «user», «content» нужно подробнее расписать, как именно нейросеть должна справиться с заданием. Так как в нашем случае задача бота — находить агрессию, злобу и что-то в этом роде — можем дать ей такую инструкцию:

Prompt

Оскорбления и унижения:

  • “Ты никогда ничего не добьешься!”
  • “Ты совсем тупой/тупая, как можно было так сделать?”
  • “С тобой невозможно разговаривать, ты вообще не понимаешь, о чем идет речь!”

Обвинения без доказательств:

  • “Ты всегда все портишь!”
  • “Ты опять меня предал/предала!”
  • “Ты специально это сделал(а), чтобы мне навредить!”

Грубые, высокомерные или агрессивные замечания:

  • “Как ты вообще смеешь со мной разговаривать таким тоном?”
  • “Тебе нужно больше думать, прежде чем говорить.”
  • “Ты мне надоел(а), уйди из моего пути.”

Манипуляции или угрозы:

  • “Если ты не сделаешь, как я сказал(а), я больше с тобой не буду разговаривать.”
  • “Ты меня сильно расстраиваешь, если так будет продолжаться, мы с тобой точно поссоримся.”

Неправомерные обобщения и стереотипы:

  • “Все мужчины такие идиоты!”
  • “Женщины всегда лгут.”
  • “Ты как и все люди, всегда ищешь повод для ссоры.”

Пренебрежительные или саркастические замечания:

  • “Ну конечно, ты же всегда знаешь, как все делать.”
  • “Отлично, ты снова все испортил(а), как обычно.”

Игнорирование и обесценивание чувств другого человека:

  • “Ты так переживаешь по пустякам.”
  • “Это не проблема, забудь об этом.”
  • “Почему ты так реагируешь, никто другой так не делает.”

Примеры сообщений, которые считаются негативными:

Выражение недовольства или разочарования:

  • “Мне не нравится, как ты это сделал.”
  • “Я уже устал(а) от всего этого.”
  • “Мне не нравится, как все складывается.”

Пессимистичные утверждения:

  • “Я не уверен(а), что у нас что-то получится.”
  • “Вряд ли это закончится хорошо.”
  • “Кажется, это будет провал.”

Жалобы и нытье:

  • “Почему все всегда не так, как я хочу?”
  • “Я постоянно в какой-то заднице.”
  • “Почему мне всегда так не везет?”

Критика или осуждение без конструктивного предложения:

  • “Ты опять все испортил(а).”
  • “Почему ты не можешь делать вещи нормально?”
  • “Это не получится, потому что ты всегда ошибаешься.”

Неправомерные обобщения:

  • “Все всегда идет не так.”
  • “Никто не понимает, что я чувствую.”
  • “В этой жизни все всегда против меня.”

Негативные прогнозы:

  • “Это точно не сработает.”
  • “Не думаю, что что-то изменится.”
  • “Скорее всего, все закончится плохо.”

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

Ответь одним словом: ‘конфликт’ или ‘нет’

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

Prompt

 {“role”: “user”, “content”: f”Твоя задача — определить, негативно или конфликтно ли следующее сообщение. Примеры сообщений, которые подразумевают конфликт: Твоя задача — определить, негативно или конфликтно ли следующее сообщение. Примеры сообщений, которые подразумевают конфликт: Оскорбления и унижения: Ты никогда ничего не добьешься! Ты совсем тупой/тупая, как можно было так сделать? С тобой невозможно разговаривать, ты вообще не понимаешь, о чем идет речь! Обвинения без доказательств: Ты всегда все портишь! Ты опять меня предал/предала! Ты специально это сделал(а), чтобы мне навредить! Грубые, высокомерные или агрессивные замечания: Как ты вообще смеешь со мной разговаривать таким тоном? Тебе нужно больше думать, прежде чем говорить. Ты мне надоел(а), уйди из моего пути. Манипуляции или угрозы: Если ты не сделаешь, как я сказал(а), я больше с тобой не буду разговаривать. Ты меня сильно расстраиваешь, если так будет продолжаться, мы с тобой точно поссоримся. Неправомерные обобщения и стереотипы: Все мужчины такие идиоты! Женщины всегда лгут. Ты как и все люди, всегда ищешь повод для ссоры. Пренебрежительные или саркастические замечания: Ну конечно, ты же всегда знаешь, как все делать. Отлично, ты снова все испортил(а), как обычно. Игнорирование и обесценивание чувств другого человека: Ты так переживаешь по пустякам. Это не проблема, забудь об этом. Почему ты так реагируешь, никто другой так не делает. Примеры сообщений, которые считаются негативными: Выражение недовольства или разочарования: Мне не нравится, как ты это сделал. Я уже устал(а) от всего этого. Мне не нравится, как все складывается. Пессимистичные утверждения: Я не уверен(а), что у нас что-то получится. Вряд ли это закончится хорошо. Кажется, это будет провал. Жалобы и нытье: Почему все всегда не так, как я хочу? Я постоянно в какой-то заднице. Почему мне всегда так не везет? Критика или осуждение без конструктивного предложения: Ты опять все испортил(а). Почему ты не можешь делать вещи нормально? Это не получится, потому что ты всегда ошибаешься. Неправомерные обобщения: Все всегда идет не так. Никто не понимает, что я чувствую. В этой жизни все всегда против меня. Негативные прогнозы: Это точно не сработает. Не думаю, что что-то изменится. Скорее всего, все закончится плохо. Мат — не всегда негативное или конфликтное сообщение. Если человек использует маты, но в контексте беседы и сообщения не видно злости и агрессии, такое сообщение считать конфликтным не надо. Ответь одним словом: ‘конфликт’ или ‘нет’.\n\”{text}\””}

Когда код будет готов, его нужно протестировать, а затем разместить на сервере. За это придется платить около 450 рублей в месяц. Если платить не хотите, можно запустить бота локально на своем ПК, но в этом случае бот будет работать только когда включен ПК и когда вы запустите бота.

Кроме того, если запустить бота локально, он будет работать только через смену локации. Причина — OpenAI заблокировала доступ к своим продуктам жителям России и Беларуси. Без смены локации запрос не будет отправляться на сервера OpenAI и не будет обрабатываться.

Шаг 3. Тестируем бота

Чтобы выдать права, добавьте бота в чат и кликните на его иконку правой кнопкой мыши → «Изменить права».

Тестировать бота лучше локально на ПК: это быстрее, чем разворачивать его на сервере. Я покажу принцип работы на примере Windows, на Mac все работает аналогично.

Сначала нам нужно скачать актуальную версию Python. Для этого перейдите по ссылке.

В открывшемся окне установщика отметьте галочкой пункт «Add Python to PATH». Это важно, чтобы запускать Python из командной строки.

Нажмите «Install Now» и дождитесь окончания установки. По завершении нажмите «Close».

Нажмите кнопку «Пуск» (в левом нижнем углу экрана).

После установки откройте проводник файлов и на диске C создайте папку mybot.

Затем откройте текстовый редактор (например, «Блокнот» или «Notepad++»). И вставьте в него код бота. Сохраните этот файл в кодировке UTF-8 и поместите в папку mybot.

Затем откройте поиск в Windows и введите cmd — запустите приложение.

В открывшемся окне командной строки введите:

python --version

И нажмите Enter. Если вы увидите что-то вроде Python 3.x.x, значит Python успешно установлен.

Далее в командной строке введите этот запрос:

cd C:\mybot

Теперь вы будете работать внутри этой папки.

Установка библиотек

В командной строке, введите:

pip install python-telegram-bot==20.3 openai

Нажмите Enter. Произойдет загрузка и установка пакетов. Дождитесь окончания установки. Когда увидите сообщение типа Successfully installed …, значит всё успешно установлено.

Запуск бота

В командной строке введите:

python bot.py

Нажмите Enter.

Если нет ошибок, бот просто начнёт анализировать сообщения в чате, в который он добавлен. Вы будете видеть такие строки:

Если бот работает и проблем нет (а их быть не должно), можно размещать его на сервере. А если проблемы будут, копируйте описание ошибок и показывайте нейронке. Она поправит код.

Шаг 4. Размещаем бота на сервере

Для этого нужно купить самый дешевый VPS сервер. Самое главное при покупке — арендовать сервер европейской страны. Если купите VPS с российским IP, бот не будет работать.

Я рекомендую провайдера Timeweb, потому что там недорогие цены и хорошая поддержка.

После регистрации переходим в раздел «Облачные сервисы» и жмем на «Добавить».

Выбираем версию Ubuntu 22.04.

И самый дешевый сервер с локацией вне России. Я выбрал Нидерланды.

Выбираем «Публичный IP».

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

Другие параметры можно не менять. Когда все будет готово, кликайте на «Заказать».

Содержание бота обойдется в 500 рублей в месяц. Подключить его можно будет к десятку чатов одновременно.

Шаг 5. Настраиваем сервер

После оплаты нужно будет подождать 10 минут, пока сервер установится.

После этого кликните на сервер, перед вами откроется панель управления.

Здесь можно отслеживать нагрузку на сервер. Но нас интересует вкладка «Доступ» и root-пароль. Его нужно скопировать.

Теперь переходим на вкладку «Консоль». В консоли мы будем настраивать сервер. Чтобы открыть консоль на весь экран, кликните на соответствующую иконку.

Сначала нам нужно подключиться к серверу. Для этого в строке login пишем root и кликаем enter.

А в строку Password комбинацией клавиш Ctrl + V вставляем root-пароль.

А затем повторите по шагам всю инструкцию ниже. Просто копируйте мой код и вставляйте его в командную строку.

  1. Обновите систему:
sudo apt update && sudo apt upgrade -y

2. Установите Python и pip:

sudo apt install python3 python3-pip -y

3. Установите менеджер виртуальных окружений:

sudo apt install python3-venv -y

4. Создайте директорию для вашего бота:

mkdir mybot
cd mybot

5. Создайте виртуальное окружение:

python3 -m venv venv

6. Активируйте виртуальное окружение:

source venv/bin/activate

7. Установите необходимые библиотеки:

pip install python-telegram-bot openai

8. Создайте файл для вашего бота:

nano bot.py

9. Вставьте код вашего бота в этот файл. Используйте код, который мы сгенерировали ранее.

10. Сохраните файл и выйдите из редактора (Ctrl+X, затем Y, затем Enter).

11. Запустите бота в новой screen-сессии:

python3 bot.py

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

Читайте также:

1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
mike_myatov
1 год назад

пишет при получении сообщения в чате ошибку:

2025-01-31 05:33:35,787 – __main__ – ERROR – Ошибка при анализе сообщения: 429 Client Error: Too Many Requests for url: https://api.openai.com/v1/chat/completions

Последний раз редактировалось 1 год назад mike_myatov ем