Skip to content

Repository files navigation

VK-бот уведомлений о заказах Kwork, FL.ru и Profi.ru

Бот просматривает общие ленты проектов Kwork и FL.ru во всех категориях. Сначала бесплатный локальный фильтр отбирает карточки по широкому набору ключевых слов, затем GigaChat оценивает их по контексту. Подходящие новые проекты отправляются личным сообщением от сообщества VK.

В диалоге постоянно доступна нижняя callback-панель с разделами «Последние проекты», «Настройки», «Статистика» и «Отклики». Нажатия не создают сообщения от имени пользователя, а переключение нижней клавиатуры происходит через сразу удаляемое невидимое сообщение. Навигационные подписи вроде «Выберите действие» и «Настройки уведомлений» в диалог не попадают. Статистика и отклики используют не более одной видимой информационной панели: при переходе старая панель удаляется. В разделе «Последние проекты» находятся отдельные кнопки Kwork, FL.ru и Profi.ru; они повторно загружают текущую выдачу, не меняя историю уже просмотренных проектов. Каждая кнопка показывает последние 5 проектов и запускает для них только AI-оценку. Настройки разделены на источники уведомлений, фильтры проектов, тихие часы и AI-тексты. Для каждой биржи уведомления можно отключить независимо. В VK также настраиваются минимальный AI-балл, минимальный известный бюджет, желательные и исключающие слова. Проекты без указанного бюджета не отбрасываются. Во время тихих часов карточки остаются в очереди и отправляются позже, если проекту ещё нет 24 часов. Значения сохраняются в базе и переживают перезапуск. Статистика показывает число проектов, признанных подходящими после AI-оценки, и отдельное число отклонённых AI за 24 часа, 7 и 30 дней. Кнопка «Очистить чат» в настройках удаляет из диалога старые сообщения бота, не затрагивая сообщения пользователя и локальную историю проектов в базе данных. В статистике отображается дата начала отсчёта, а красная кнопка «Очистить статистику» переносит точку отсчёта на текущий момент, не удаляя историю просмотренных проектов и откликов.

Время публикации выводится без секунд в часовом поясе МСК+2 (UTC+5). Подпись часового пояса в самом сообщении не показывается. Автоматические уведомления отправляются только для проектов не старше 24 часов; старые карточки и карточки без даты молча пропускаются.

У каждой карточки есть изначально серые кнопки «Откликнулся» и «Не подошло». Выбранная кнопка становится зелёной с галочкой или красной с крестиком; повторное нажатие отменяет выбор без отдельного сообщения. Раздел «Отклики» показывает сводные счётчики и до 8 активных откликов в той же панели. Для активного отклика можно отметить «Клиент написал» или «Заказали у другого»; второй вариант убирает проект из активного списка.

Как отбираются проекты

Kwork получает общую выдачу через API мобильного приложения с параметром all, а FL.ru читает общую HTML-ленту заказов /projects/?kind=1 без вакансий и конкурсов. Обе площадки обходятся постранично: максимум 10 страниц или до страницы, на которой все распознанные проекты старше 24 часов.

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

  • сайт, веб, лендинг, интернет-магазин;
  • дизайн, редизайн, интерфейс, UI/UX;
  • Figma, макет, прототип;
  • Tilda и Zero Block.

Фильтр намеренно пропускает сомнительные совпадения: окончательное решение принимает AI по контексту проекта и профилю исполнителя. Категория площадки сохраняется, но не ограничивает выдачу.

Profi.ru использует сохранённый фильтр кабинета специалиста. Поэтому бот получает заказы по услугам аккаунта, а не фильтрует общую ленту по ключевым словам:

  • Landing page
  • Веб-дизайн
  • Макет сайта
  • Создание сайта на Tilda
  • Создание сайтов

Повторяющиеся карточки объединяются по ID проекта, поэтому сообщение придёт один раз.

Настройка VK

  1. Создайте сообщество VK и включите в нем сообщения.
  2. В настройках API сообщества создайте ключ доступа с правом на сообщения.
  3. Напишите сообществу любое сообщение от своего аккаунта. Без этого сообщество не сможет начать личный диалог.
  4. Узнайте числовой ID своего пользователя VK.
  5. В настройках сообщества откройте Сообщения → Настройки для бота и включите Возможности ботов. Без этого VK отклоняет сообщения с клавиатурой.
  6. Откройте Работа с API → Long Poll API и включите Long Poll. Бот автоматически включает события Входящие сообщения и Нажатие на callback-кнопку.

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

Запуск

cp .env.example .env

Заполните в .env:

  • VK_GROUP_TOKEN — ключ сообщества;
  • VK_USER_ID — ваш числовой ID;
  • KWORK_LOGIN и KWORK_PASSWORD — вход в аккаунт Kwork.
  • PROFI_LOGIN и PROFI_PASSWORD — парольный вход в кабинет специалиста Profi.ru.
  • GIGACHAT_CREDENTIALS — ключ авторизации проекта GigaChat API;
  • AI_ENABLED=true — включить AI-фильтрацию и генерацию откликов.

Перед первым AI-запуском отредактируйте config/freelancer_profile.txt: модель использует этот файл как единственный источник сведений о навыках, ограничениях и стиле отклика. Логика отбора и написания отклика хранится отдельно в config/prompts/project_filter.txt и config/prompts/response_writer.txt.

Эти три файла можно менять с телефона в разделе Настройки → AI-тексты. Бот показывает текущий текст и команду замены: отправьте /set profile, /set filter или /set response, а со следующей строки — новый текст. Для текста длиннее одного сообщения VK прикрепите UTF-8 файл .txt к сообщению с нужной командой. Новая версия применяется сразу, предыдущая сохраняется рядом с расширением .bak. В Docker каталог ./config подключён к контейнеру, поэтому изменения не пропадут после его пересоздания. AI_MIN_SCORE задаёт минимальную оценку для отправки проекта в VK (по умолчанию 70 из 100). GIGACHAT_FILTER_MODEL задаёт модель оценки проектов (по умолчанию GigaChat-2 Lite), а GIGACHAT_RESPONSE_MODEL — модель написания откликов (по умолчанию GigaChat-2-Max). Модель явно указывается в каждом запросе, а фактически использованное имя записывается в лог.

Для каждого нового свежего проекта GigaChat 2 Lite сначала возвращает оценку, внутреннюю причину решения и короткое описание задачи клиента для карточки VK. Если Lite после повторов не выдаёт корректный результат, бот один раз переключается на Max. Проекты ниже порога сохраняются в базе, но не отправляются. Отклик заранее не генерируется: GigaChat 2 Max пишет его только после нажатия кнопки «Написать отклик» под карточкой и добавляет три прямые ссылки на реализованные проекты из профиля. Для задач на Tilda используются три последних Tilda-проекта. Бот отправляет чистый текст отдельным сообщением, чтобы его можно было скопировать целиком. Готовый отклик сохраняется в истории проекта. Под ним доступны кнопки «Другой вариант», «Короче», «Деловой», «Более живой» и «Добавить вопрос». Новый вариант заменяет текст в том же сообщении и сохраняется как текущий отклик проекта; каждое нажатие обращается к GigaChat и расходует токены. Карточка не отправляется, пока AI не смог выдать оценку. При временной ошибке API проект остаётся непомеченным и повторно проверяется в следующем цикле. Это исключает появление карточек без краткого описания задачи и не теряет проект после единичного сбоя.

Затем:

docker compose up -d --build
docker compose logs -f bot

Отдельная проверка ключа и защищённого соединения с GigaChat:

docker compose run --rm bot gigachat-check

Локальный запуск без Docker:

python3.12 -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'
freelance-bot

По умолчанию опрос идет раз в 3 минуты. Первый запуск запоминает текущие карточки и ничего не отправляет, чтобы не присылать старые заказы. Для теста можно временно установить SEND_EXISTING_ON_FIRST_RUN=true.

Важные ограничения

  • Kwork не предоставляет официальный публичный API для этой задачи. Используется актуальная неофициальная библиотека, работающая с API мобильного приложения; после изменений Kwork интеграции может понадобиться обновление.
  • FL.ru читается из общей HTML-ленты. После изменений разметки площадки CSS-селекторы парсера могут потребовать обновления.
  • Profi.ru не предоставляет публичный API для такой интеграции. Используется запрос кабинета специалиста с его сохранённым фильтром; после изменений Profi.ru интеграцию может потребоваться обновить. Если сервис запросит SMS или другое дополнительное подтверждение, автоматический вход приостанавливается до восстановления парольного входа.
  • Не ставьте интервал меньше минуты: это повышает риск антибот-ограничений площадок.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages