Бот просматривает общие ленты проектов 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 и включите в нем сообщения.
- В настройках API сообщества создайте ключ доступа с правом на сообщения.
- Напишите сообществу любое сообщение от своего аккаунта. Без этого сообщество не сможет начать личный диалог.
- Узнайте числовой ID своего пользователя VK.
- В настройках сообщества откройте Сообщения → Настройки для бота и включите Возможности ботов. Без этого VK отклоняет сообщения с клавиатурой.
- Откройте Работа с 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 или другое дополнительное подтверждение, автоматический вход приостанавливается до восстановления парольного входа.
- Не ставьте интервал меньше минуты: это повышает риск антибот-ограничений площадок.