Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Бот для парсинга объявлений с API в NocoDB и Telegram

Linux и DevOps

Автоматизация парсинга объявлений облегчает поиск и мониторинг объектов: коммерческой недвижимости, автомобилей, товаров. Ниже описан процесс построения бота, который получает данные из API, фильтрует их в n8n, сохраняет в NocoDB и отправляет уведомления в Telegram.

1. Источник данных: API объявлений

API возвращает данные в формате JSON и поддерживает фильтрацию по категориям, цене, городу и другим параметрам. Пример запроса:

GET https://ads-api.ru/main/api?user=EMAIL&token=TOKEN&category_id=7&city=Москва&limit=100

Основные параметры:

  • category_id — категория (например, коммерческая недвижимость);
  • q — поиск по заголовку;
  • price1 / price2 — фильтр по цене;
  • city — города;
  • withcoords — объявления с координатами;
  • is_actual — актуальность (11, 1, 0).

2. Обработка данных в n8n

2.1. Задачи в n8n

  • Получение данных из API.
  • Разворачивание JSON в массив объявлений.
  • Удаление дубликатов по id.
  • Подготовка данных для NocoDB и Telegram.

2.2. Пример кода для разборки данных

Используется в узле Function для разворачивания массива и фильтрации:

// Получаем все входные данные
const items = $input.all();
let results = [];

// Проверяем: объявления могут быть в поле data или сразу в объекте
for (const item of items) {
  if (Array.isArray(item.json.data)) {
    results.push(...item.json.data);
  } else {
    results.push(item.json);
  }
}

// Убираем дубликаты по ID
const seen = new Set();
const unique = results.filter(ad => {
  if (!ad.id) return false;
  if (seen.has(ad.id)) return false;
  seen.add(ad.id);
  return true;
});

// Возвращаем ID и заголовок
return unique.map(ad => ({
  json: {
    id: ad.id,
    title: ad.title
  }
}));

3. Сохранение в NocoDB

3.1. Актуальная вставка через v2 API

В версии v2 нет отдельного метода для bulk insert. Отправляется массив объектов через POST /records:

POST https://example.com/api/v2/tables/{tableId}/records
Content-Type: application/json
xc-auth: {API_TOKEN}

[
  { "id": 123, "title": "Объявление 1" },
  { "id": 456, "title": "Объявление 2" }
]

3.2. Пакетная вставка

Для стабильной работы API разбивайте данные на пакеты по 50–100 записей:

function chunkArray(arr, size) {
  const res = [];
  for (let i = 0; i < arr.length; i += size) {
    res.push(arr.slice(i, i + size));
  }
  return res;
}

const ads = $input.all().map(i => i.json);
return chunkArray(ads, 50).map(batch => ({ json: { records: batch } }));

Каждый пакет отправляется в HTTP Request node методом POST.

4. Отправка сообщений в Telegram

4.1. Форматирование текста

Пример форматированного сообщения с HTML-разметкой:

🏢 <b>Офис, 500 м²</b>
💵 300 000 ₽ в месяц
🌎 Москва, ул. Пушкина, 10
🔗 https://site.ru/item/12345

Описание помещения, обрезанное до 600 символов...

Источник: avito.ru

4.2. Фото-заглушка

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

https://upload.wikimedia.org/wikipedia/commons/9/9a/Нет_фото.png

4.3. Ограничения Telegram

  • Лимит — не более ~30 сообщений в секунду.
  • При отправке фото с подписью рекомендуется задержка 3–5 секунд между сообщениями.
  • При ошибке Too Many Requests используйте заголовок retry_after для паузы.

5. Ключевые слова для фильтрации

Для выделения подходящих объектов используйте ключевые слова:

офис, помещение свободного назначения, здание...

Слова можно применять в фильтрах API или перед сохранением в NocoDB.

Заключение

Комбинация API, n8n и NocoDB позволяет автоматизировать сбор и отправку объявлений без сложных скриптов. Такой бот гибко масштабируется: подходит для коммерческой недвижимости, транспорта или любых других категорий, где требуется быстрая обработка новых данных.

Оцените статью
ctrllife.ru
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x