Поиск Подрядчика

Поиск Подрядчика

@contractor-finderproductivity

Поиск и сравнение подрядчиков на Profi.ru, Авито Услуги, Яндекс.Услуги и YouDo. Поиск исполнителей на всех площадках, сравнение рейтингов, цен, отзывов и времени отклика. Включает анализ фото портфолио, проверку репутации, обнаружение мошенничества, оценку стоимости и автоматизированную связь с персонализированными сообщениями.

0 установокПубличный

SKILL.md

Поиск подрядчиков — Contractor Finder

Поиск исполнителей и подрядчиков одновременно на четырёх крупнейших российских сервисах: Profi.ru, Avito Услуги, Яндекс.Услуги и YouDo. Агрегация результатов, дедупликация, скоринг по рейтингам и ценам, проверка репутации, анализ портфолио.

Обзор

Четыре платформы покрывают ~85% рынка частных услуг в России:

ПлатформаДоля рынкаОсобенности
Profi.ru~35%Крупнейший маркетплейс услуг, рейтинги, верификация, портфолио
Avito Услуги~30%Встроен в крупнейший классифайд, много исполнителей, отзывы с покупок
Яндекс.Услуги~15%Экосистема Яндекса, проверенные мастера, быстрые ответы
YouDo~10%Быстрые задачи, аукцион цен, исполнители с подтверждёнными навыками

Стратегия: Параллельный поиск по всем платформам, дедупликация (один исполнитель часто на нескольких площадках), скоринг и ранжирование по комплексной оценке.

Установка browser-use

Для работы этого навыка необходим browser-use.

Если browser-use не установлен — активируй навык browser-use и следуй его инструкциям. Он автоматически установит Python, pip и browser-use для твоей платформы.

Пока идёт установка, скажи: «Настраиваю поиск, это займёт пару минут...» НЕ показывай пользователю команды, ошибки или технические детали.

Когда использовать

  • Пользователь ищет подрядчика для ремонта, сантехника, электрика, уборку и т.д.
  • Пользователь хочет «найти хорошего мастера» или «сравнить цены на услуги»
  • Пользователь дал ссылку на профиль исполнителя и хочет проверить его репутацию
  • Пользователь хочет оценить стоимость работ до начала поиска
  • Пользователь просит «забронировать мастера» или «написать исполнителю»
  • Пользователь хочет проверить портфолио и качество работ подрядчика

Сбор требований у пользователя

Перед поиском уточни:

  1. Тип услуги — что именно нужно сделать (ремонт, сантехника, электрика, уборка и т.д.)
  2. Город / район — где нужны работы
  3. Бюджет — примерная сумма или диапазон
  4. Срочность — когда нужно начать (срочно, на этой неделе, в течение месяца)
  5. Объём работ — масштаб задачи (косметический ремонт vs капитальный, одна розетка vs вся проводка)
  6. Особые требования — лицензии, допуски, опыт с конкретными материалами, язык общения
  7. Предпочтения — рейтинг от скольки, наличие портфолио, верифицированный исполнитель

Категории услуг и типичные цены

КатегорияURL-slug (Profi/Avito)Типичная ценаЕдиница
Ремонт квартирremont, remont-kvartir3 000 – 15 000₽/м²
Сантехникаsantekhnik, santekhnika1 500 – 5 000₽/вызов
Электрикаelektrik, elektrika1 500 – 4 000₽/точка
Уборкаuborka, uborka-kvartir1 500 – 4 000₽/раз
Переездpereezd, pereezd-perevozki3 000 – 15 000₽/раз
Покраскаpokraska, kraska500 – 1 500₽/м²
Мебель на заказmebel-na-zakaz, mebelВарьируется₽/проект
Маникюр / красотаmanikyur, krasota-zdorove1 500 – 5 000₽/сеанс
Репетиторrepititor800 – 3 000₽/час
Юристyurist2 000 – 10 000₽/консультация
Бухгалтерbukhgalter3 000 – 15 000₽/месяц
Дизайнерdizayner3 000 – 20 000₽/проект
Фотографfotograf3 000 – 30 000₽/съёмка
Ландшафтlandshaftnyy-dizayn500 – 3 000₽/м²
Кондиционерыustanovka-konditsionerov5 000 – 15 000₽/единица
Окна / остеклениеustanovka-okon5 000 – 25 000₽/окно
Отоплениеotoplenie3 000 – 10 000₽/точка
Сборка мебелиsborka-mebeli1 500 – 5 000₽/единица
Грузчикиgruzchiki300 – 800₽/час
IT-услугиkompyuternaya-pomoshch500 – 3 000₽/вызов

Платформа 1: Profi.ru

Крупнейший маркетпллейс услуг в России. Хорошие фильтры, рейтинги, портфолио, верификация мастеров.

URL-структура

ДействиеURL
Категорияhttps://profi.ru/{category}/
Поискhttps://profi.ru/search/?q={query}&location={city}
Профиль мастераhttps://profi.ru/profile/{id}/
Отзывы мастераhttps://profi.ru/profile/{id}/otzyvy/
Портфолиоhttps://profi.ru/profile/{id}/portfolio/

Параметры поиска

ПараметрОписаниеПример
qПоисковый запрос (URL-encoded)q=сантехник+замена+трубы
locationГородlocation=Москва
sortСортировкаsort=rating, sort=price_asc, sort=price_desc
pageСтраницаpage=1

Извлечение данных через eval

# Список мастеров на странице поиска
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[data-testid=\"master-card\"], .master-card, [class*=\"SearchResults\"] [class*=\"card\"], [class*=\"search-result\"]')).slice(0,10).map(el => ({name: el.querySelector('[class*=\"name\"], [class*=\"title\"], a[class*=\"link\"]')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"], [class*=\"Rating\"]')?.textContent?.trim(), reviews: el.querySelector('[class*=\"review\"], [class*=\"count\"]')?.textContent?.trim(), price: el.querySelector('[class*=\"price\"], [class*=\"Price\"], [class*=\"rate\"]')?.textContent?.trim(), verified: el.querySelector('[class*=\"verified\"], [class*=\"badge\"], [class*=\"confirm\"]') ? 'Да' : 'Нет', description: el.querySelector('[class*=\"description\"], [class*=\"about\"], p')?.textContent?.trim()?.substring(0, 200), link: el.querySelector('a[href*=\"/profile/\"]')?.href})))"

Селекторы Profi.ru

ЭлементCSS селектор
Карточка мастера[data-testid="master-card"], .master-card, [class*="SearchResults"] [class*="card"]
Имя[class*="name"], [class*="title"], a[class*="link"]
Рейтинг[class*="rating"], [class*="Rating"], [class*="stars"]
Количество отзывов[class*="review"], [class*="count"]
Цена / ставка[class*="price"], [class*="Price"], [class*="rate"]
Значок верификации[class*="verified"], [class*="badge"], [class*="confirm"]
Описание[class*="description"], [class*="about"], p
Ссылка на профильa[href*="/profile/"]
Портфолио фото[class*="portfolio"] img, [class*="gallery"] img
Время ответа[class*="response"], [class*="reply"]

Профиль мастера — детальное извлечение

# Открыть профиль
browser-use --headed open "https://profi.ru/profile/{id}/"
sleep 3

# Полная информация о мастере
browser-use eval "JSON.stringify({name: document.querySelector('h1, [class*=\"name\"]')?.textContent?.trim(), rating: document.querySelector('[class*=\"rating\"], [class*=\"Rating\"]')?.textContent?.trim(), reviews: document.querySelector('[class*=\"review-count\"], [class*=\"reviewsCount\"]')?.textContent?.trim(), price: document.querySelector('[class*=\"price\"], [class*=\"rate\"]')?.textContent?.trim(), verified: document.querySelector('[class*=\"verified\"]') ? 'Да' : 'Нет', responseTime: document.querySelector('[class*=\"response\"], [class*=\"reply\"]')?.textContent?.trim(), description: document.querySelector('[class*=\"about\"], [class*=\"description\"]')?.textContent?.trim()?.substring(0, 500), portfolioCount: document.querySelectorAll('[class*=\"portfolio\"] img, [class*=\"gallery\"] img').length, completedTasks: document.querySelector('[class*=\"completed\"], [class*=\"tasks\"]')?.textContent?.trim()})"

Отзывы

# Перейти к отзывам
browser-use --headed open "https://profi.ru/profile/{id}/otzyvy/"
sleep 3

# Извлечь последние 10 отзывов
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"review\"], [class*=\"Review\"], [class*=\"feedback\"]')).slice(0,10).map(el => ({rating: el.querySelector('[class*=\"stars\"], [class*=\"rating\"]')?.textContent?.trim(), text: el.querySelector('[class*=\"text\"], [class*=\"body\"], [class*=\"content\"]')?.textContent?.trim()?.substring(0, 300), author: el.querySelector('[class*=\"author\"], [class*=\"name\"]')?.textContent?.trim(), date: el.querySelector('[class*=\"date\"]')?.textContent?.trim()})))"

Особенности Profi.ru

  • Рейтинг из 5 звёзд, основан на подтверждённых отзывах
  • «Проверенный мастер» — верификация документов и телефонов
  • «Быстрый ответ» — отвечает в течение 30 минут
  • Цены часто указаны как «от X ₽» — уточняй у мастера
  • Портфолио — загруженные мастером фото выполненных работ
  • Часть функций доступна только авторизованным пользователям

Платформа 2: Avito Услуги

Крупнейший классифайд России с разделом услуг. Много исполнителей, но хуже модерируемых.

URL-структура

ДействиеURL
Категорияhttps://www.avito.ru/{city}/uslugi/{category}
Поискhttps://www.avito.ru/{city}/uslugi?q={query}
Объявление исполнителяhttps://www.avito.ru/{city}/uslugi/{slug}-{id}
ОтзывыНа странице объявления (внизу)

Параметры поиска

ПараметрОписаниеПример
qПоисковый запросq=электрик
priceMinМинимальная ценаpriceMin=1000
priceMaxМаксимальная ценаpriceMax=5000
sortСортировкаsort=price, sort=date, sort=rating
pageСтраницаpage=1
userID продавцаuser=12345678

Популярные города (slug для URL)

ГородSlug
Москваmoskva
Санкт-Петербургsankt-peterburg
Новосибирскnovosibirsk
Екатеринбургekaterinburg
Казаньkazan
Краснодарkrasnodar
Нижний Новгородnizhniy_novgorod
Самараsamara
Ростов-на-Донуrostov-na-donu
Челябинскchelyabinsk

Извлечение данных через eval

ВАЖНО: Avito имеет агрессивную антибот-защиту. Минимизируй количество вызовов state. Используй eval для извлечения данных.

# Список объявлений на странице поиска
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[data-marker=\"item\"], [class*=\"iva-item\"]')).slice(0,10).map(el => ({name: el.querySelector('[itemprop=\"name\"], [class*=\"title\"], h3, a[class*=\"link\"]')?.textContent?.trim(), price: el.querySelector('[class*=\"price\"], [itemprop=\"price\"], meta[content]')?.getAttribute('content') || el.querySelector('[class*=\"price\"]')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"], [class*=\"stars\"]')?.textContent?.trim(), reviews: el.querySelector('[class*=\"review\"], [class*=\"count\"]')?.textContent?.trim(), location: el.querySelector('[class*=\"geo\"], [class*=\"location\"]')?.textContent?.trim(), date: el.querySelector('[class*=\"date\"]')?.textContent?.trim(), link: el.querySelector('a[itemprop=\"url\"], a[href*=\"/uslugi/\"]')?.href})))"

Селекторы Avito Услуги

ЭлементCSS селектор
Карточка объявления[data-marker="item"], [class*="iva-item"]
Название[itemprop="name"], [class*="title"], h3
Цена[class*="price"], [itemprop="price"]
Рейтинг[class*="rating"], [class*="stars"]
Количество отзывов[class*="review"], [class*="count"]
Геолокация[class*="geo"], [class*="location"]
Дата публикации[class*="date"]
Ссылкаa[itemprop="url"], a[href*="/uslugi/"]
«На сайте с»[class*="registration"], [class*="member-since"]
Фото[class*="photo"] img, [class*="image"] img

Страница объявления — детальное извлечение

# Открыть объявление
browser-use --headed open "https://www.avito.ru/{city}/uslugi/{slug}-{id}"
sleep 4

# Полная информация
browser-use eval "JSON.stringify({name: document.querySelector('h1, [class*=\"title\"]')?.textContent?.trim(), price: document.querySelector('[class*=\"price\"], [class*=\"Price\"]')?.textContent?.trim(), rating: document.querySelector('[class*=\"rating\"], [class*=\"stars\"]')?.textContent?.trim(), reviews: document.querySelector('[class*=\"review-count\"], [class*=\"count\"]')?.textContent?.trim(), description: document.querySelector('[class*=\"description\"], [class*=\"descriptionText\"]')?.textContent?.trim()?.substring(0, 500), memberSince: document.querySelector('[class*=\"registration\"], [class*=\"member\"]')?.textContent?.trim(), responseRate: document.querySelector('[class*=\"response\"], [class*=\"reply\"]')?.textContent?.trim(), location: document.querySelector('[class*=\"geo\"]')?.textContent?.trim(), photos: Array.from(document.querySelectorAll('[class*=\"photo\"] img, [class*=\"gallery\"] img, [class*=\"image\"] img')).slice(0,5).map(i => i.src)}))"

Особенности Avito Услуги

  • Агрессивная антибот-защита: минимизируй количество state-вызовов, используй eval
  • Если появилась капча — попроси пользователя пройти её вручную в headed-режиме
  • «На сайте с» — дата регистрации, важна для оценки надёжности
  • Рейтинг основан на отзывах покупателей
  • Много дублей — один исполнитель может иметь несколько объявлений
  • Цены часто не указаны — «Цена не указана» или «Договорная»

Платформа 3: Яндекс.Услуги

Сервис от Яндекса с верифицированными мастерами. Хорошая интеграция с экосистемой.

URL-структура

ДействиеURL
Главнаяhttps://uslugi.yandex.ru/
Категорияhttps://uslugi.yandex.ru/{category}
Поискhttps://uslugi.yandex.ru/search?text={query}&location={city}
Профиль исполнителяhttps://uslugi.yandex.ru/profile/{id}

Параметры поиска

ПараметрОписаниеПример
textПоисковый запросtext=сантехник
locationГородlocation=Москва
pageСтраницаpage=1
sortСортировкаsort=rating, sort=price

Извлечение данных через eval

# Список исполнителей
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"search-result\"], [class*=\"SearchResult\"], [class*=\"executor\"], [data-testid*=\"card\"]')).slice(0,10).map(el => ({name: el.querySelector('[class*=\"name\"], [class*=\"title\"], h3')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"], [class*=\"Rating\"]')?.textContent?.trim(), reviews: el.querySelector('[class*=\"review\"], [class*=\"count\"]')?.textContent?.trim(), price: el.querySelector('[class*=\"price\"], [class*=\"Price\"]')?.textContent?.trim(), responseTime: el.querySelector('[class*=\"response\"], [class*=\"reply\"]')?.textContent?.trim(), verified: el.querySelector('[class*=\"verified\"], [class*=\"badge\"]') ? 'Да' : 'Нет', link: el.querySelector('a[href*=\"/profile/\"]')?.href})))"

Селекторы Яндекс.Услуги

ЭлементCSS селектор
Карточка результата[class*="search-result"], [class*="SearchResult"], [data-testid*="card"]
Имя[class*="name"], [class*="title"], h3
Рейтинг[class*="rating"], [class*="Rating"]
Количество отзывов[class*="review"], [class*="count"]
Цена[class*="price"], [class*="Price"]
Время ответа[class*="response"], [class*="reply"]
Значок верификации[class*="verified"], [class*="badge"]
Ссылка на профильa[href*="/profile/"]
Фото работ[class*="portfolio"] img, [class*="gallery"] img

Особенности Яндекс.Услуги

  • «Проверенный Яндексом» — верификация документов
  • Быстрый ответ — среднее время ответа по данным Яндекса
  • Цены часто указаны как «от X ₽/час»
  • Хорошие отзывы — модерация строже, чем на Avito
  • Меньше исполнителей, чем на Profi.ru, но качество выше
  • Для полной информации может потребоваться авторизация

Платформа 4: YouDo

Маркетплейс для быстрых задач. Исполнители соревнуются ценой.

URL-структура

ДействиеURL
Главнаяhttps://youdo.com/
Категорияhttps://youdo.com/{category}/
Поискhttps://youdo.com/search?text={query}
Профиль исполнителяhttps://youdo.com/profile/{id}

Категории YouDo

SlugКатегория
remont-kvartirРемонт квартир
santekhnikaСантехника
elektrikaЭлектрика
uborkaУборка
pereezdПереезд
sborka-mebeliСборка мебели
konditsioneryКондиционеры
oknaОкна
remont-bytovoy-tekhnikiРемонт бытовой техники
kompyuternaya-pomoshchКомпьютерная помощь

Извлечение данных через eval

# Список исполнителей
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"user-card\"], [class*=\"profile-card\"], [class*=\"executor\"], [class*=\"search-item\"]')).slice(0,10).map(el => ({name: el.querySelector('[class*=\"name\"], [class*=\"title\"]')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"], [class*=\"stars\"]')?.textContent?.trim(), completedTasks: el.querySelector('[class*=\"completed\"], [class*=\"tasks-count\"]')?.textContent?.trim(), reviews: el.querySelector('[class*=\"review\"], [class*=\"count\"]')?.textContent?.trim(), price: el.querySelector('[class*=\"price\"], [class*=\"rate\"]')?.textContent?.trim(), link: el.querySelector('a[href*=\"/profile/\"]')?.href})))"

Селекторы YouDo

ЭлементCSS селектор
Карточка исполнителя[class*="user-card"], [class*="profile-card"], [class*="executor"]
Имя[class*="name"], [class*="title"]
Рейтинг[class*="rating"], [class*="stars"]
Выполненные задачи[class*="completed"], [class*="tasks-count"]
Отзывы[class*="review"], [class*="count"]
Цена[class*="price"], [class*="rate"]
Ссылка на профильa[href*="/profile/"]

Особенности YouDo

  • «Выполненные задачи» — главный показатель опыта
  • Цену часто не указывают — она формируется в чате
  • Больше подходит для разовых задач, чем для крупных проектов
  • Исполнители соревнуются за задачу — можно получить несколько предложений
  • Меньше детализации профиля, чем на Profi.ru

Workflow 1: Поиск подрядчика

Шаг 1: Сбор требований

Уточни у пользователя:

  • Тип услуги (ремонт, сантехника, электрика и т.д.)
  • Город и район
  • Бюджет (диапазон)
  • Срочность
  • Объём работ
  • Особые требования

Шаг 2: Подготовка

# Закрыть все предыдущие сессии
browser-use close --all
sleep 1

Шаг 3: Поиск на Profi.ru

# Открыть поиск Profi.ru
browser-use --headed open "https://profi.ru/search/?q=ЗАПРОС&location=ГОРОД"
sleep 4

# Закрыть cookie-баннер если есть
browser-use state
# Если баннер: browser-use click "Принять" или browser-use click "Согласен"

# Извлечь результаты
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[data-testid=\"master-card\"], .master-card, [class*=\"SearchResults\"] [class*=\"card\"]')).slice(0,10).map(el => ({name: el.querySelector('[class*=\"name\"], [class*=\"title\"]')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"]')?.textContent?.trim(), reviews: el.querySelector('[class*=\"review\"], [class*=\"count\"]')?.textContent?.trim(), price: el.querySelector('[class*=\"price\"], [class*=\"rate\"]')?.textContent?.trim(), verified: el.querySelector('[class*=\"verified\"], [class*=\"badge\"]') ? 'Да' : 'Нет', link: el.querySelector('a[href*=\"/profile/\"]')?.href})))"

Шаг 4: Поиск на Avito Услуги

browser-use --headed open "https://www.avito.ru/ГОРОД/uslugi?q=ЗАПРОС"
sleep 4

# Извлечь результаты (минимум state-вызовов!)
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[data-marker=\"item\"], [class*=\"iva-item\"]')).slice(0,10).map(el => ({name: el.querySelector('[itemprop=\"name\"], [class*=\"title\"]')?.textContent?.trim(), price: el.querySelector('[class*=\"price\"]')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"]')?.textContent?.trim(), reviews: el.querySelector('[class*=\"review\"]')?.textContent?.trim(), link: el.querySelector('a[itemprop=\"url\"]')?.href})))"

Шаг 5: Поиск на Яндекс.Услуги

browser-use --headed open "https://uslugi.yandex.ru/search?text=ЗАПРОС&location=ГОРОД"
sleep 4

# Извлечь результаты
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"search-result\"], [class*=\"SearchResult\"], [data-testid*=\"card\"]')).slice(0,10).map(el => ({name: el.querySelector('[class*=\"name\"], [class*=\"title\"]')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"]')?.textContent?.trim(), reviews: el.querySelector('[class*=\"review\"]')?.textContent?.trim(), price: el.querySelector('[class*=\"price\"]')?.textContent?.trim(), link: el.querySelector('a[href*=\"/profile/\"]')?.href})))"

Шаг 6: Поиск на YouDo

browser-use --headed open "https://youdo.com/search?text=ЗАПРОС"
sleep 4

# Извлечь результаты
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"user-card\"], [class*=\"profile-card\"]')).slice(0,10).map(el => ({name: el.querySelector('[class*=\"name\"]')?.textContent?.trim(), rating: el.querySelector('[class*=\"rating\"]')?.textContent?.trim(), completedTasks: el.querySelector('[class*=\"completed\"]')?.textContent?.trim(), link: el.querySelector('a[href*=\"/profile/\"]')?.href})))"

Шаг 7: Агрегация и дедупликация

Собери все результаты в один список. Проверь на дубликаты:

  1. По имени — один и тот же мастер на разных площадках
  2. По телефону — если виден в нескольких профилях
  3. По фото — одна и та же фотография профиля

При обнаружении дубликата — объединяй данные из всех площадок в одну карточку.

Шаг 8: Скоринг

Рассчитай оценку для каждого исполнителя:

КритерийВесКак оценивать
Рейтинг30%(рейтинг / 5) * 100 — баллы от 0 до 100
Количество отзывов20%min(отзывы / 50, 1) * 100 — максимум при 50+ отзывах
Соответствие цене20%Насколько цена вписывается в бюджет пользователя
Время ответа15%< 30 мин = 100, < 1 час = 80, < 3 часа = 60, > 3 часов = 40
Верификация15%Верифицирован на платформе = 100, нет = 30

Итоговый балл = 0.30 * рейтинг_балл + 0.20 * отзывы_балл + 0.20 * цена_балл + 0.15 * ответ_балл + 0.15 * верификация_балл

Шаг 9: Вывод результатов

Покажи топ-10 исполнителей в таблице:

НАЙДЕНЫ ПОДРЯДЧИКИ: [тип услуги] в [город]
Поиск: Profi.ru, Avito Услуги, Яндекс.Услуги, YouDo

+----+------------------+------------+---------+--------+-----------+--------+
| #  | Имя              | Рейтинг    | Отзывы  | Цена   | Ответ     | Площ.  |
+----+------------------+------------+---------+--------+-----------+--------+
| 1  | Иванов А.С.      | 4.9 (*)    | 127     | от 3000| < 30 мин  | Profi  |
| 2  | Петров В.М.      | 4.8 (*)    | 89      | от 2500| < 1 час   | Avito  |
| 3  | Сидоров К.Н.     | 4.7 (*)    | 203     | от 3500| < 30 мин  | Profi+ |
+----+------------------+------------+---------+--------+-----------+--------+
(*) — верифицированный исполнитель
Profi+ — найден на нескольких площадках (дедуплицирован)

Показаны топ-3 из 47 найденных.
Для полного списка скажи «покажи всех».
Для детальной информации скажи «подробнее о #1».

Workflow 2: Анализ портфолио

Шаг 1: Открыть профиль

# По ссылке от пользователя
browser-use --headed open "URL_ПРОФИЛЯ"
sleep 4

# Или по имени — сначала найти через поиск
browser-use --headed open "https://profi.ru/search/?q=ИМЯ+ФАМИЛИЯ"
sleep 4

Шаг 2: Извлечь фото портфолио

# Получить URL всех фото в портфолио
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"portfolio\"] img, [class*=\"gallery\"] img, [class*=\"work-sample\"] img, [class*=\"photo\"] img')).slice(0,20).map(img => ({src: img.src, alt: img.alt || ''})))"

Шаг 3: Анализ каждого фото

Для каждого фото используй image_analysis:

image_analysis:
  imageSource: [URL фото]
  prompt: "Оцени качество выполненной работы на этом фото. Определи: качество материалов, аккуратность исполнения, соответствует ли заявленной категории услуг. Оцени от 1 до 10. Укажи: что сделано хорошо, что можно улучшить."

Шаг 4: Сводная оценка портфолио

АНАЛИЗ ПОРТФОЛИО: [Имя исполнителя]
Площадка: [Profi.ru / Avito / Яндекс.Услуги / YouDo]
Фото проанализировано: [N] из [M]

Средняя оценка качества: X.X / 10

Распределение:
- Отлично (8-10): N фото (XX%)
- Хорошо (6-7): N фото (XX%)
- Средне (4-5): N фото (XX%)
- Плохо (1-3): N фото (XX%)

Сильные стороны:
- [конкретные наблюдения]

Слабые стороны:
- [конкретные наблюдения]

Вердикт: [Высокое / Среднее / Низкое] качество работ.
Рекомендация: [стоит нанимать / с осторожностью / не рекомендуется]

Workflow 3: Проверка репутации

Шаг 1: Поиск отзывов

# Поиск отзывов через web_search
web_search "ИМЯ_ИСПОЛНИТЕЛЯ отзывы ГОРОД"
web_search "ИМЯ_ИСПОЛНИТЕЛЯ мошенчик обман ГОРОД"
web_search "ИМЯ_ИСПОЛНИТЕЛЯ Profi.ru Avito отзывы"

Шаг 2: Проверка на сайтах отзывов

# Прочитать страницу отзывов
web_reader "https://otzovik.com/search/?q=ИМЯ_ИСПОЛНИТЕЛЯ"
web_reader "https://irecommend.ru/search?query=ИМЯ_ИСПОЛНИТЕЛЯ"

Шаг 3: Проверка через web_search

# Поиск жалоб
web_search "ИМЯ_ИСПОЛНИТЕЛЯ жалоба Роспотребнадзор"
web_search "ИМЯ_ИСПОЛНИТЕЛЯ суд иск некачественные услуги"

# Поиск на форумах
web_search "ИМЯ_ИСПОЛНИТЕЛЯ forum отзыв опыт"

Шаг 4: Сводка репутации

ПРОВЕРКА РЕПУТАЦИИ: [Имя исполнителя]

Отзывы на площадках:
- Profi.ru: X.X (N отзывов)
- Avito: X.X (N отзывов)
- Яндекс.Услуги: X.X (N отзывов)
- YouDo: X.X (N отзывов)

Внешние источники:
- otzovik.com: [найдено / не найдено]
- irecommend.ru: [найдено / не найдено]
- Форумы: [найдено / не найдено]

Красные флаги:
- [список или «Не обнаружено»]

Частая похвала:
- [топ-3 позитивных темы в отзывах]

Общий настрой отзывов: [Положительный / Смешанный / Отрицательный]

Рекомендация: [Высокая надёжность / Средняя / Есть риски / Не рекомендуется]

Workflow 4: Связь и бронирование

Шаг 1: Генерация сообщения

Составь персонализированное сообщение на основе требований пользователя:

Здравствуйте, [Имя мастера]!

Меня интересует [тип услуги]. Детали:
- Адрес: [район/адрес]
- Объём работ: [описание]
- Желаемые сроки: [когда]
- Бюджет: [диапазон]

Подскажите, когда сможете посмотреть объект и оценить стоимость?

Шаг 2: Навигация к форме связи

# Открыть профиль исполнителя
browser-use --headed open "URL_ПРОФИЛЯ"
sleep 4

# Найти кнопку связи
browser-use state
# Или через eval:
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('button, a')).filter(el => /написать|связаться|заказать|сообщение|заказать/i.test(el.textContent)).map(el => ({text: el.textContent.trim(), tag: el.tagName})))"

Шаг 3: Заполнение формы

# Кликнуть кнопку связи
browser-use click "text=Написать"

# Заполнить сообщение
browser-use type "Здравствуйте, ..."

# Заполнить телефон (ТОЛЬКО если пользователь разрешил!)
# НИКОГДА не вводи телефон/email без явного подтверждения пользователя

Шаг 4: Подтверждение перед отправкой

КРИТИЧЕСКОЕ ПРАВИЛО: Никогда не отправляй сообщение без подтверждения пользователя!

ГОТОВО К ОТПРАВКЕ:

Кому: [Имя мастера] на [Платформа]
Сообщение:
---
[текст сообщения]
---

Отправить? (Да / Нет / Изменить)

Только после ответа «Да» — нажимай кнопку отправки.

Шаг 5: Отправка

browser-use click "text=Отправить"
sleep 2
browser-use state

Шаг 6: Отслеживание отправленных запросов

Храни список отправленных запросов в контексте:

SENT_INQUIRIES:
1. [Имя мастера] | [Платформа] | [Дата] | [Статус: отправлено/ответ получен]
2. [Имя мастера] | [Платформа] | [Дата] | [Статус: отправлено/ожидает]

Workflow 5: Оценка стоимости услуг

Шаг 1: Сбор рыночных цен

# Поиск текущих цен
web_search "ремонт квартир цена ГОРОД 2026 за м²"
web_search "стоимость услуг электрика ГОРОД 2026"
web_search "[тип услуги] расценки прайс ГОРОД"

Шаг 2: Чтение прайс-листов

# Прочитать страницу с ценами
web_reader "https://profi.ru/ГОРОД/remont/kalkulyator/"
web_reader "https://uslugi.yandex.ru/calc/[категория]"

Шаг 3: Сравнение с предложением подрядчика

ОЦЕНКА СТОИМОСТИ: [тип услуги] в [город]

Рыночный диапазон:
- Минимум: X XXX ₽
- Среднее: X XXX ₽
- Максимум: X XXX ₽

Предложение подрядчика: X XXX ₽

Позиция на рынке: [Ниже рынка / В пределах нормы / Выше рынка]

Если значительно ниже рынка:
ВНИМАНИЕ: Цена значительно ниже рыночной. Возможные причины:
- Недостаточный опыт
- Скрытые доплаты
- Некачественные материалы
Рекомендация: уточните, что включено в стоимость

Если значительно выше рынка:
Проверьте, что входит в стоимость:
- Материалы
- Гарантия
- Уборка после работ
- Срочность

Шаг 4: Факторы, влияющие на цену

ФакторВлияние на цену
Срочность (сегодня/завтра)+20-50%
Выходные / праздники+20-30%
Центр города+10-20%
Высотные работы+30-100%
Демонтаж старого+15-30%
Вывоз мусора+5-15%
Гарантия на работы+10-20%
Закупка материалов подрядчиком+10-25% (наценка)

JavaScript Eval-сниппеты

Универсальные проверки

# Сколько результатов на странице?
browser-use eval "document.querySelectorAll('[class*=\"card\"], [class*=\"item\"], [class*=\"result\"]').length"

# Название первого результата
browser-use eval "document.querySelector('[class*=\"name\"], [class*=\"title\"], h3')?.textContent?.trim()"

# Рейтинг первого результата
browser-use eval "document.querySelector('[class*=\"rating\"], [class*=\"stars\"]')?.textContent?.trim()"

# Есть ли кнопка для связи?
browser-use eval "!!document.querySelector('button, a')?.textContent?.match(/написать|связаться|заказать/i)"

# Закрыть модальное окно
browser-use eval "document.querySelector('[class*=\"modal\"], [class*=\"popup\"]')?.querySelector('[class*=\"close\"], [aria-label=\"Закрыть\"]')?.click()"

Profi.ru — детальное извлечение

# Полная карточка мастера
browser-use eval "const c = document.querySelector('[class*=\"card\"]'); JSON.stringify({name: c?.querySelector('[class*=\"name\"]')?.textContent?.trim(), rating: c?.querySelector('[class*=\"rating\"]')?.textContent?.trim(), reviews: c?.querySelector('[class*=\"count\"]')?.textContent?.trim(), price: c?.querySelector('[class*=\"price\"]')?.textContent?.trim(), link: c?.querySelector('a')?.href})"

# Время ответа
browser-use eval "document.querySelector('[class*=\"response\"], [class*=\"reply\"]')?.textContent?.trim()"

# Портфолио — количество фото
browser-use eval "document.querySelectorAll('[class*=\"portfolio\"] img').length"

# Все отзывы на странице
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"review\"]')).slice(0,10).map(r => r.textContent?.trim()?.substring(0, 200)))"

Avito — детальное извлечение (с оглядкой на антибот)

# Цена из мета-данных
browser-use eval "document.querySelector('[itemprop=\"price\"]')?.getAttribute('content') || document.querySelector('[class*=\"price\"]')?.textContent?.trim()"

# Дата регистрации продавца
browser-use eval "document.querySelector('[class*=\"registration\"], [class*=\"member-since\"]')?.textContent?.trim()"

# Количество объявлений у продавца
browser-use eval "document.querySelector('[class*=\"count\"], [class*=\"total\"]')?.textContent?.match(/\\d+/)?.[0]"

# Все фото в объявлении
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"photo\"] img, [class*=\"gallery\"] img')).slice(0,10).map(i => i.src))"

Яндекс.Услуги — детальное извлечение

# Статус верификации
browser-use eval "document.querySelector('[class*=\"verified\"], [class*=\"badge\"], [class*=\"confirm\"]')?.textContent?.trim() || 'Не верифицирован'"

# Диапазон цен
browser-use eval "JSON.stringify({min: document.querySelector('[class*=\"price-min\"]')?.textContent?.trim(), max: document.querySelector('[class*=\"price-max\"]')?.textContent?.trim(), text: document.querySelector('[class*=\"price\"]')?.textContent?.trim()})"

# Категории услуг мастера
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"category\"], [class*=\"tag\"]')).map(c => c.textContent?.trim()))"

YouDo — детальное извлечение

# Выполненные задачи
browser-use eval "document.querySelector('[class*=\"completed\"]')?.textContent?.match(/\\d+/)?.[0]"

# Рейтинг и отзывы
browser-use eval "JSON.stringify({rating: document.querySelector('[class*=\"rating\"]')?.textContent?.trim(), reviews: document.querySelector('[class*=\"review-count\"]')?.textContent?.trim()})"

# Навыки / специализации
browser-use eval "JSON.stringify(Array.from(document.querySelectorAll('[class*=\"skill\"], [class*=\"tag\"]')).map(s => s.textContent?.trim()))"

Обнаружение мошенничества

При анализе профилей проверяй на красные флаги:

ПризнакОписаниеУровень риска
Слишком низкая ценаЦена на 50%+ ниже рынкаВысокий
Нет отзывовНи одного отзыва при «большом опыте»Средний
Требует предоплату 100%Просит полную оплату до начала работВысокий
Нет реального адресаТолько «выезд по городу», без офисаНизкий
Недавняя регистрацияАккаунт создан менее месяца назадСредний
Одинаковые отзывыТекст отзывов шаблонный или идентичныйВысокий
Нет портфолиоПри «10+ лет опыта» нет фото работСредний
Давление срочностью«Только сегодня», «Цена действует 1 час»Высокий
Отказ от договораНе хочет оформлять договорВысокий
Только наличныеОтказ от безналичной оплатыСредний

Проверка подозрительного подрядчика

# Поиск информации о мошенничестве
web_search "ИМЯ_ИСПОЛНИТЕЛЯ мошенник обман"
web_search "ИМЯ_ИСПОЛНИТЕЛЯ кидалово отзывы"
web_search "НОМЕР_ТЕЛЕФОНА мошенник услуги"

При обнаружении высокого риска — предупреди пользователя:

ВНИМАНИЕ: Обнаружены красные флаги!

Подрядчик: [Имя]
Площадка: [Название]

Красные флаги:
- [список обнаруженных признаков]

Рекомендация: НЕ НАНИМАТЬ без дополнительной проверки.
Если решите продолжить:
1. Не вносите предоплату более 30%
2. Оформите письменный договор
3. Зафиксируйте объём работ и сроки
4. Сделайте фото объекта до начала работ

Правила: state vs eval

Делай state

  • Первый раз при работе с каждой площадкой (определить структуру)
  • Когда eval возвращает неожиданный результат (DOM изменился)
  • При навигации на новую страницу (поиск -> профиль)
  • Когда нужно найти индекс элемента для click
  • При появлении модальных окон

НЕ делай state

  • Для получения цены (используй eval)
  • Для получения имени (используй eval)
  • Для проверки загрузки страницы (используй eval)
  • Для извлечения списков (используй eval)
  • Между одинаковыми операциями на одной странице
  • ОСОБЕННО на Avito — антибот-защита реагирует на частые state-вызовы

Быстрые eval-проверки вместо state

# Загрузились результаты?
browser-use eval "document.querySelectorAll('[class*=\"card\"], [class*=\"item\"]').length > 0"

# Цена первого результата
browser-use eval "document.querySelector('[class*=\"price\"]')?.textContent?.trim()"

# Название первого результата
browser-use eval "document.querySelector('[class*=\"name\"], [class*=\"title\"]')?.textContent?.trim()?.substring(0, 100)"

# Есть ли модальное окно?
browser-use eval "!!document.querySelector('[class*=\"modal\"], [class*=\"popup\"]')"

Правила безопасности

Никогда не делай

  1. НЕ отправляй формы без подтверждения пользователя — всегда показывай текст и спрашивай «Отправить?»
  2. НЕ вводи телефон/email пользователя автоматически — только после явного разрешения
  3. НЕ сохраняй платёжные данные — никаких реквизитов карт
  4. НЕ нажимай «Оплатить» или «Забронировать» (если это требует оплаты) без подтверждения
  5. НЕ авторизуйся от имени пользователя — если нужна авторизация, попроси пользователя войти вручную

Всегда делай

  1. Всегда закрывай браузер после завершения: browser-use close --all
  2. Всегда используй --headed режим — пользователь должен видеть что происходит
  3. Закрывай модальные окна перед любыми действиями на странице
  4. Обрабатывай одну площадку за раз — не открывай несколько вкладок
  5. Проверяй на капчу и проси пользователя пройти вручную при необходимости

Формат вывода для compartir

Результаты поиска можно показать в формате для шаринга:

НАЙДЕНО С AGENTHERE.RU

Подрядчики: [тип услуги] в [город]
Дата: [Сегодня]

Топ-5 по рейтингу:

1. [Имя] | 4.9 (*) | 127 отзывов | от 3 000 ₽
   Площадки: Profi.ru, Яндекс.Услуги
   Специализация: [описание]
   Ответ: < 30 мин

2. [Имя] | 4.8 | 89 отзывов | от 2 500 ₽
   Площадки: Avito
   Специализация: [описание]
   Ответ: < 1 час

...

Рыночная цена: 2 000 — 8 000 ₽
Лучшее соотношение цена/качество: #[N]

agenthere.ru — ваш AI-ассистент для поиска подрядчиков

Обработка ошибок

ПроблемаРешение
CAPTCHA на AvitoПодожди 30-60 сек, обнови. Попроси пользователя пройти вручную в headed-режиме
Пустые результаты на площадкеУпрости запрос, попробуй другую формулировку, расширь географию
Страница не загружаетсяУвеличь sleep до 5-6 сек. Тяжёлые SPA. Проверь интернет.
Селекторы не работаютСделай browser-use state для актуальной DOM-структуры. Селекторы меняются.
Модальное окно блокируетЗакрой через eval: document.querySelector('[class*="close"]')?.click() или Escape
Сессия завислаbrowser-use close --all, начни заново
Цены не отображаютсяМногие исполнители не указывают цену. Это нормально — укажи «Цена по запросу»
Дубликаты в результатахДедуплицируй по имени и номеру телефона. Объедини данные с разных площадок.
Профиль недоступенОбъявление может быть снято. Перейди к следующему результату.
Авторизация требуетсяПопроси пользователя войти вручную в открытом браузере
Anti-bot на AvitoМинимизируй state-вызовы, делай паузы между действиями 3-5 сек
Яндекс.Услуги показывает мало результатовПопробуй другую формулировку запроса или категорию напрямую
YouDo не загружает списокYouDo тяжёлый SPA — подожди 5 сек. Проверь через eval наличие элементов
Некорректные символы в URLКодируй кириллицу: encodeURI('сантехник')%D1%81%D0%B0%D0%BD%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA
Element not found после навигацииDOM перерисовался — сделай state заново для свежих индексов

Оптимизация для повторных запросов

Если пользователь ищет несколько подрядчиков подряд:

  1. Не закрывай браузер между поисками — переходи по новому URL
  2. Используй один профиль для сохранения авторизации: browser-use --profile "contractor-search"
  3. Кешируй структуру DOM — если площадка не обновлялась, селекторы те же
  4. Группируй запросы — если 3+ категории, спрашивай «Искать все сразу или по очереди?»
  5. Сохраняй контекст — предыдущие результаты могут помочь с дедупликацией

Cleanup

# Закрыть текущую вкладку
browser-use close

# Закрыть ВСЕ сессии (использовать после завершения работы)
browser-use close --all

Советы

  1. Всегда close --all первым — старые сессии — причина зависаний
  2. Жди 4-5 секунд после навигации — все площадки тяжёлые SPA
  3. Проверяй модалки перед любыми действиями — особенно на Avito
  4. Используй eval вместо state — eval в 10 раз быстрее и не забивает контекст
  5. Дедуплицируй — хороший мастер часто на 2-3 площадках
  6. Проверяй репутацию — даже при высоком рейтинге на площадке, гугли отзывы
  7. Сравнивай с рынком — слишком низкая цена = красный флаг
  8. Никогда не отправляй сообщения без подтверждения пользователя
  9. Анализируй портфолио через image_analysis — фото говорят больше отзывов
  10. Начинай с Profi.ru — там больше данных и лучше фильтрация

Комментарии (0)

Войдите, чтобы оставить комментарий

Загрузка комментариев...

Поиск Подрядчика