Бот для поиска объявлений на Авито — просто и удобно
Этот 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_id | BIGINT | Уникальный идентификатор Telegram |
username | VARCHAR | Имя пользователя Telegram |
created_at | TIMESTAMP | Дата и время создания записи |
2. search_filters
Хранит фильтры поиска, заданные пользователями:
Поле | Тип | Описание |
---|---|---|
id | INT | Уникальный ID фильтра |
user_id | BIGINT | ID пользователя Telegram (внешний ключ) |
keyword | VARCHAR | Ключевое слово для поиска |
max_price | INT | Максимальная цена |
region | VARCHAR | Регион поиска (например, “novosibirsk”) |
created_at | TIMESTAMP | Дата создания |
initialized | TINYINT | Флаг инициализации фильтра (используется в логике) |
3. ads
Хранит найденные объявления:
Поле | Тип | Описание |
---|---|---|
id | INT | Уникальный ID объявления |
title | TEXT | Название объявления |
price | INT | Цена объявления |
url | TEXT | Ссылка на объявление (уникальна) |
location | TEXT | Местоположение |
posted_at | TIMESTAMP | Дата добавления в базу |
is_sent | TINYINT | Отправлено ли объявление пользователю |
filter_id | INT | ID фильтра, по которому найдено объявление |
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-бота.
Как пользоваться ботом
- Запускаете бота и добавляете свои фильтры поиска (ключевые слова, цену, регион).
- Каждые 10 минут бот ищет новые объявления по вашим фильтрам.
- Новые объявления автоматически присылаются вам в чат Telegram.
- Вы всегда в курсе актуальных предложений, не тратя время на мониторинг сайта вручную.
Итог
Проект облегчает процесс поиска нужных товаров и услуг на Avito с автоматическим уведомлением в Telegram. Это значительно экономит время и позволяет не упустить выгодные предложения.
Удачных покупок и выгодных находок!