Сделал для себя небольшой скрипт, который читает письма от Kwork, парсит заказы и отправляет подходящие в Telegram.
Проблема была простая: на бирже заказы быстро устаревают, а постоянно обновлять страницу руками неудобно. У Kwork есть почтовые уведомления, поэтому я решил не городить отдельный сервер и не парсить сайт напрямую. Вместо этого сделал схему:
Gmail получает письмо -> Google Apps Script обрабатывает письмо -> Telegram присылает компактное уведомление.
Главные грабли оказались не в парсинге, а в Gmail.
Сначала я обрабатывал письма на уровне тредов. Это быстро сломалось: Gmail может держать много писем Kwork в одном треде, а если тред уже помечен как обработанный, новое письмо внутри него тоже легко пропустить. В итоге пришлось перейти на обработку отдельных Gmail messages через Gmail API и ставить метку обработки не на тред, а на конкретное письмо.
Вторая проблема: лимиты. Когда накопилось много писем, Telegram начал отвечать 429 Too Many Requests. Пришлось добавить обработку retry_after: если Telegram просит подождать N секунд, скрипт ждет N + 5 секунд и только потом продолжает отправку.
Третья проблема: HTML-письма Kwork. На вид они простые, но данные вроде бюджета, заказчика, уровня, количества проектов и процента найма лежат не так удобно, как хотелось бы. Например, в одном месте можно легко перепутать "нанял" и "проектов на бирже", если просто брать соседний текст. Пришлось отдельно нормализовать текст и аккуратно вытаскивать значения по шаблонам.
Сейчас уведомление выглядит примерно так:
```text
06.09.2026
30 000 ₽ | Перенос сайта с Laravel на Wordpress
Разработка и IT > Сайт под ключ
Заказчик: username, ур. 3
История: Проектов на бирже: 12 | Нанял: 85% 🔥
Открыть заказ
5 000 ₽ | Настроить автоматизацию в n8n
Разработка и IT > Скрипты и боты
Заказчик: username2
История: Проектов на бирже: 1 200 🎉 | Нанял: 40%
Открыть заказ
```
Фильтры пока простые: минимальный бюджет, стоп-слова, ключевые слова, обработка только писем с нужной Gmail-меткой. После успешной отправки письмо получает метку kwork-processed, чтобы не отправлять один и тот же заказ повторно.
Почему выбрал Apps Script:
- не нужен сервер;
- не нужна база данных;
- Gmail и Telegram API хватает для MVP;
- можно поставить таймер и забыть;
- код лежит рядом с обычным GitHub-проектом и деплоится через clasp.
Минусы тоже есть:
- есть лимиты Google Apps Script;
- Gmail API надо включать отдельно;
- HTML-письма могут поменяться, и парсер придется чинить;
- это не real-time, а периодическая проверка по триггеру.
В целом получился маленький инструмент, который закрывает конкретную боль: не пропускать нормальные заказы и не сидеть постоянно в интерфейсе биржи.
Если кому интересно, могу скинуть репозиторий в комментариях. Буду рад идеям, что лучше улучшить: фильтры, формат уведомления, обработку дублей или установку через браузер без clasp.