Як я зробив бота, який сам шукає та оцінює фріланс-замовлення на Freelancehunt
Я фрілансер. Знаю це відчуття: відкриваєш стрічку Freelancehunt, оновлюєш вручну кожні кілька хвилин, бо хороші проєкти розбирають за лічені хвилини. Пропустивши момент і замість замовлення з адекватним бюджетом і двома конкурентами, тобі лишається щось із двадцятьма відгуками вже на старті.
За кілька місяців я порахував, скільки відгуків залишив і скільки з них відповіли. Понад сто заявок, і майже нуль відповідей. Не тому, що відгуки були поганими, а тому, що я щоразу опинявся одним із останніх у черзі. Замовник фізично не доходив до мого повідомлення, воно губилося серед перших двадцяти. Це й доконало мене остаточно: проблема була не в тому, що я пишу, а в тому, коли я це роблю.
Перша версія: просто не пропускати
Ідея була проста. Скрипт раз на кілька хвилин тягне RSS Freelancehunt, порівнює з тим, що вже бачив, і кидає нове мені в Telegram. Ніякого інтелекту, просто фільтр за ключовими словами в назві.
Пропускати нове я перестав. Але фільтр за словами або пропускав цікаве, бо в назві не було потрібного терміна, або ловив забагато шуму. Ключове слово «Python» збігається і з вакансією мрії, і з «потрібен фрілансер зі знанням Python для верстки на WordPress».
Додаю штучний інтелект
Далі логічний крок: замість збігу за словами, реальна оцінка. Кожне нове замовлення разом із моїм профілем (навички, бажаний бюджет, що я точно не хочу робити) я почав передавати в Claude і просити оцінити, наскільки це підходить, які адекватні ціна й термін, чи варто відповідати взагалі, і одразу згенерувати чернетку відгуку.
Це змінило все. Замість «ще одна вакансія з ключовим словом» я почав отримувати конкретну заявку з оцінкою, приблизною ціною і готовим текстом відгуку. Лишалося натиснути «Відправити». Час від «побачив» до «відповів» скоротився з хвилин до секунд. Окремо додав врахування кількості вже поданих відгуків: замовлення з хорошим бюджетом і двома конкурентами явно цінніше за таке саме, але з двадцятьма.
Я тоді подумав, що саме цього бракувало біржі весь час: не просто списку заявок, а нормальної пріоритизації. Freelancehunt показує все підряд, а який сенс дивитися на заявку, де вже двадцять відгуків і бюджет занижений вдвічі.
Технічні граблі
Кілька речей, що здавалися дрібницями, а виявилися реальними проблемами.
Спочатку я тягнув дані через керований браузер, бо так простіше було обійти захист від ботів. Ціна цього рішення: зайві сорок мегабайт у застосунку, крихкість (будь-яка зміна вёрстки сайту ламала парсер) і дивні баги на машинах користувачів, які я не міг відтворити у себе. Переписав на офіційний API Freelancehunt. Застосунок схуд удвічі, надійність зросла в рази.
Окрема історія з упаковкою в один exe-файл. Він розпаковується у тимчасову теку і чистить її після кожного запуску. Перша версія зберігала конфіг поруч із кодом, і при кожному перезапуску користувач втрачав налаштування. Один із перших тестувальників написав мені щось на кшталт: «Слухай, а воно точно нормально зберігає? Я вчора ввечері все налаштував, а сьогодні відкрив, і профіль знову пустий, ніби я щойно встановив програму». Причину я шукав два вечори, а виправлення зайняло одну змінену константу шляху.
Ще один випадок: назвав тестовий .exe-файл із дужками в імені. Вікно застосунку відкривалося і лишалося білим, порожнім, наче зависло. Виявилося, що WebView2 просто не може завантажити ресурси з такого шляху. Годину я був певен, що зламав щось у коді.
Ліцензування і чому бекенд важливіший за код
Коли вирішив ділитися застосунком з іншими, постала проблема: кожному користувачу потрібен власний ключ до ШІ, а це і незручно, і неможливо проконтролювати витрати.
Переніс усі виклики ШІ на власний сервер. Клієнт більше не має ключа взагалі, він авторизується ліцензійним ключем, підписаним криптографічно і перевіреним навіть без інтернету. Сервер робить запит до ШІ моїм коштом, з добовим лімітом на тариф.
Зараз розв’язалася проблема з піратством. Ключ прив’язується до конкретного пристрою при першій реальній дії, Сервер це перевіряє на кожному запиті. Обійти можна, тільки якщо взагалі не користуватися основною функцією застосунку, а тоді який сенс.
Розширення на інші джерела
Одне джерело замовлень — це вразливість. Якщо Freelancehunt змінить щось в API чи ляже на годину, застосунок замовкає повністю. Додав ще два джерела: публічні Telegram-канали із замовленнями і Freelancer.com. Кожне джерело — окрема функція, зламане не валить решту.
Продакшн і найцікавіший баг з усіх
Коли переносив бекенд із власного ноутбука на постійний сервер, Telegram-бот раптом почав зависати без жодної помилки в логах. Просто перестав відповідати. Статус процесу «живий», повідомлень нуль.
Причина виявилася дивною. Хостинг-провайдер прописує IPv6-адресу на мережевому інтерфейсі, але реальний маршрут по ній не працює. Python спочатку намагається підключитись саме по IPv6, і зависає на рівні встановлення з’єднання, ще до того, як спрацює будь-який таймаут у коді. Вимкнувши IPv6 на сервері повністю, я позбувся проблеми назавжди. Написав про це в лог просто для себе, щоб за півроку не наступити на ті самі граблі.
Що в підсумку
Весь застосунок, від першого скрипту на вихідних до сервера з ліцензуванням і автооновленням, я писав повністю сам, з нуля. Без команди, без інвестицій, вечорами й вихідними. Зараз це застосунок для Windows з ліцензуванням, автооновленням і кількома джерелами замовлень, кожне з яких оцінюється через ШІ.
Якщо тобі теж набридло вручну оновлювати стрічку, застосунок називається GigRadarly, і я продовжую його розвивати.
Немає коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів