На фриланс-биржах хорошие заказы разбирают в первые минуты. Сидеть с открытой лентой весь день я не могу: работа, учёба. Поэтому написал бота, который делает это за меня и присылает в Telegram только то, на что стоит откликнуться.
Минимальный стек
PHP 8.3 без фреймворков, SQLite, Telegram Bot API и cron на собственном VPS. Никаких очередей и демонов: для задачи «раз в минуту проверить пару страниц» этого более чем достаточно.
Cron запускает сборщик каждую минуту, а flock не даёт двум запускам наложиться, если биржа ответила медленно.
Откуда берутся заказы
Источников два. Первый отдаёт ленту проектов страницей, где данные о заказах лежат JSON-ом прямо внутри HTML. Разбирать вёрстку не нужно, достаточно найти этот JSON и декодировать. Оттуда же приходят бюджет «желаемый — максимальный», число предложений, дата публикации и статистика заказчика: сколько проектов он размещал и какой процент нанял.
Второй источник — RSS. Там меньше данных, зато формат стабильный, а дата берётся из pubDate.
Фильтры: что не стоит уведомления
Самое ценное в боте — не сбор, а отсев. Заказ проходит дальше, только если:
- в нём есть нужные слова (регулярное выражение с основными темами);
- бюджет выше порога, причём у каждого получателя порог свой;
- заказу меньше 48 часов;
- заказчик не слишком придирчив: процент найма выше минимального, а новички помечаются отдельно.
Каждой карточке бот ставит оценку совпадения в процентах, чтобы с первого взгляда было видно, насколько заказ подходит.
Карточки, которые обновляются
Одна из самых полезных вещей: карточка в Telegram живая. Бот хранит в SQLite связку «заказ — сообщение» и в течение нескольких часов после публикации пересчитывает число откликов. Если оно изменилось, карточка редактируется через editMessageText. Видно, что на заказ уже 30 предложений, и можно не тратить время.
Под карточкой кнопки «Интересно / Неинтересно». Отметки копятся, и по ним видно, какие заказы мне на самом деле подходят. Это основа для настройки фильтров.
Надёжность
- Дедупликация. Каждый заказ записывается в SQLite, повторно он не придёт, даже если появится в двух источниках.
- Миграции без фреймворка. При старте бот смотрит
PRAGMA table_infoи добавляет недостающие колонки. Обновление кода не ломает старую базу. - Контроль источников. Если биржа несколько раз подряд не ответила или вернула пустую страницу, бот присылает предупреждение. Иначе «нет новых заказов» и «бот сломался» выглядят одинаково.
Что получилось
Бот работает на моём VPS, у агентства есть отдельный экземпляр с двумя получателями и своими порогами бюджета. Главный вывод: в таких инструментах важнее всего фильтры и понятные уведомления. Собрать данные — полдела, сложнее сделать так, чтобы человек не начал игнорировать бота через неделю.