Як я зробив бота, який сам шукає та оцінює фріланс-замовлення на Freelancehunt

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Я фрілансер. Знаю це відчуття: відкриваєш стрічку 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, і я продовжую його розвивати.

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Підписатись на коментарі