Пост

Бот для поиска объявлений на Авито — просто и удобно

Этот Telegram-бот поможет вам легко и быстро находить новые объявления на Авито по вашим интересам. Просто добавьте фильтры с нужными параметрами, и бот будет регулярно проверять сайт, присылая вам только свежие объявления.


Используемые технологии

  • Node.js — серверная платформа для запуска бота и парсера.
  • MariaDB — реляционная база данных для хранения пользователей, фильтров и объявлений.
  • Puppeteer — библиотека для управления браузером Chrome, используется для парсинга Avito.
  • node-cron — планировщик задач для периодического запуска проверки новых объявлений.
  • node-telegram-bot-api — библиотека для работы с Telegram Bot API.
  • dotenv — для удобного управления конфигурационными переменными из .env файла.

Установка и настройка окружения

Системные зависимости

Для корректной работы Puppeteer требуется установить ряд библиотек:

1
2
3
4
5
sudo apt update && sudo apt install -y \
libnss3 libatk-bridge2.0-0 libatk1.0-0 libcups2 libdrm2 libxcomposite1 libxdamage1 \
libxrandr2 libgbm1 libasound2 libpangocairo-1.0-0 libxshmfence1 libpango-1.0-0 \
libx11-xcb1 libxcb-dri3-0 libxss1 libgtk-3-0 libx11-6 libxext6 libxfixes3 \
ca-certificates fonts-liberation libappindicator3-1 lsb-release xdg-utils wget

Установка Node.js и npm

1
2
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs npm

Инициализация проекта и установка зависимостей

1
2
npm init -y
npm install node-telegram-bot-api puppeteer mysql2 dotenv node-cron

Структура базы данны

База данных avitobot содержит 3 основные таблицы:


1. users

Хранит информацию о пользователях Telegram:

ПолеТипОписание
telegram_idBIGINTУникальный идентификатор Telegram
usernameVARCHARИмя пользователя Telegram
created_atTIMESTAMPДата и время создания записи

2. search_filters

Хранит фильтры поиска, заданные пользователями:

ПолеТипОписание
idINTУникальный ID фильтра
user_idBIGINTID пользователя Telegram (внешний ключ)
keywordVARCHARКлючевое слово для поиска
max_priceINTМаксимальная цена
regionVARCHARРегион поиска (например, “novosibirsk”)
created_atTIMESTAMPДата создания
initializedTINYINTФлаг инициализации фильтра (используется в логике)

3. ads

Хранит найденные объявления:

ПолеТипОписание
idINTУникальный ID объявления
titleTEXTНазвание объявления
priceINTЦена объявления
urlTEXTСсылка на объявление (уникальна)
locationTEXTМестоположение
posted_atTIMESTAMPДата добавления в базу
is_sentTINYINTОтправлено ли объявление пользователю
filter_idINTID фильтра, по которому найдено объявление
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE users (
  telegram_id BIGINT PRIMARY KEY,
  username VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE search_filters (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id BIGINT,
  keyword VARCHAR(255),
  max_price INT,
  region VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  initialized TINYINT DEFAULT 0,
  FOREIGN KEY (user_id) REFERENCES users(telegram_id) ON DELETE CASCADE
);

CREATE TABLE ads (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title TEXT,
  price INT,
  url TEXT UNIQUE,
  location TEXT,
  posted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  is_sent TINYINT DEFAULT 0,
  filter_id INT,
  FOREIGN KEY (filter_id) REFERENCES search_filters(id) ON DELETE CASCADE
);

Конфигурация окружения

Создайте файл .env с переменными:

1
2
3
4
5
TELEGRAM_TOKEN=ваш_токен_бота
DB_HOST=localhost
DB_USER=пользователь
DB_PASSWORD=ваш_пароль_базы
DB_NAME=avitobot

Описание основных модулей

# bot/index.js

  • Инициализирует Telegram-бота с использованием node-telegram-bot-api и токена из .env.
  • Поддерживает хранение состояния пользователей (userStates) и таймингов последней обработки запросов (lastHandled) для предотвращения повторных действий.
  • Импортирует функции работы с базой данных из db/queries и парсер объявлений из parser/scraper.

Основные функции и обработчики

  • startHandler
    Регистрирует нового пользователя и приветствует с основным меню.

  • helpHandler
    Отправляет список доступных команд и краткую инструкцию.

  • addFilterHandler
    Добавляет фильтр по ключевому слову, максимальной цене и региону, проверяя формат и предотвращая частые повторы.

  • checkAdsHandler
    Для каждого фильтра пользователя запускает парсер Avito, получает новые объявления, проверяет наличие в базе и отправляет новые объявления в чат.

  • myFiltersHandler
    Показывает пользователю список его текущих фильтров с ключевыми словами, регионами и ценами.

  • handleDeleteFilterStep1
    Отправляет пользователю список фильтров с кнопками для выбора фильтра на удаление.

  • handleShowAllAdsStep1
    Отправляет пользователю список фильтров с кнопками для просмотра всех объявлений по выбранному фильтру.

Обработка callback-запросов из inline-кнопок

  • При удалении фильтра — удаляет запись из базы и обновляет сообщение.
  • При показе объявлений — выводит все объявления по фильтру с форматированием и ограничением по длине сообщения.

Обработка текстовых сообщений

  • Если пользователь в состоянии ввода фильтра (awaiting_filter_input), парсит и добавляет фильтр.
  • Обрабатывает нажатия по кнопкам основного меню:
    • Добавить фильтр
    • Проверить объявления
    • Мои фильтры
    • Удалить фильтр
    • Показать все объявления

Клавиатура меню

  • Кнопки с основными действиями для удобного управления фильтрами и объявлениями.

parser/scraper.js

  • Использует Puppeteer для парсинга сайта Avito.
  • Принимает ключевое слово, максимальную цену и регион.
  • Загружает страницу с результатами поиска.
  • Извлекает информацию о каждом объявлении: название, цену, ссылку, локацию.
  • При необходимости переходит на страницу объявления для уточнения данных.
  • Возвращает список объявлений, подходящих под фильтр.

db/connection.js

  • Создает пул соединений с MariaDB для эффективного доступа к базе.

db/queries.js

Содержит функции для:

  • Добавления пользователя.
  • Добавления нового фильтра.
  • Получения фильтров.
  • Проверки существования объявления.
  • Сохранения объявления в базу.
  • Удаления фильтра.
  • Получения объявлений по фильтру.

cron/job.js

  • Запускает проверку фильтров каждые 10 минут.
  • Для каждого фильтра запускает парсер и получает новые объявления.
  • Проверяет, есть ли объявление в базе.
  • Если объявления новые — сохраняет их и отправляет пользователю через Telegram-бота.

Как пользоваться ботом

  1. Запускаете бота и добавляете свои фильтры поиска (ключевые слова, цену, регион).
  2. Каждые 10 минут бот ищет новые объявления по вашим фильтрам.
  3. Новые объявления автоматически присылаются вам в чат Telegram.
  4. Вы всегда в курсе актуальных предложений, не тратя время на мониторинг сайта вручную.

Итог

Проект облегчает процесс поиска нужных товаров и услуг на Avito с автоматическим уведомлением в Telegram. Это значительно экономит время и позволяет не упустить выгодные предложения.

Удачных покупок и выгодных находок!

Скачать бота

Авторский пост защищен лицензией CC BY 4.0 .