Všetky projekty

Hobby2025

Vacancy Scraper Bot

Telegram bot, ktorý zbiera pracovné ponuky a stáže z azerbajdžanských portálov a zverejňuje ich v kanáloch.

Zdroje
HelloJob.az · Tecrube.az
Príkazy
7
Kanály
Test + Prod
Databáza
MongoDB

01Prehľad

Bot nahrádza ručné kopírovanie ponúk do Telegram kanálov. Admini spustia zber, skontrolujú, čo sa nazbieralo, a zverejňujú po dávkach - najprv v testovacom kanáli, potom v produkčnom.

02Architektúra

Tenká vrstva príkazov stojí nad službami na zber pre jednotlivé zdroje a modelmi Mongoose. Každý príkaz prechádza middlewarom len pre adminov.

Telegram

Admin chat

/scrap /send /list /log

Kanály

Test a produkcia

Bot

Autentifikačný middleware

Whitelist ALLOWED_USERS

Smerovač príkazov

Jeden modul na príkaz

Spracovanie správ

Formátovanie podľa zdroja

Scrapery

Zdroj 1

HelloJob.az

Zdroj 2

Tecrube.az

Nástroje

Axios + Cheerio, Puppeteer

Dáta

Job

Pracovné ponuky

Intern

Stáže

ScrapeInfo

Posledný beh pre každý zdroj

03Komponenty

Služby na zber

Extrahujú ponuky

  • Axios + Cheerio pre statické HTML, Puppeteer pre stránky renderované JavaScriptom.
  • Každý zdroj vracia rovnaký tvar: názov, odkaz, firma, dátum a popis.

Publikovanie

Riadené doručenie

  • /send zverejní ďalších 10 neodoslaných ponúk alebo jednu konkrétnu podľa id.
  • Formát správ sa líši podľa zdroja (napr. dátum začiatku a konca pri stážach).

04Ako to funguje

  1. 1

    /scrap

    Admin vyberie zdroj; scraper stiahne a spracuje stránku s ponukami.

  2. 2

    Deduplikácia

    Každá ponuka sa vyhľadá podľa odkazu; ukladajú sa len nové.

  3. 3

    Záznam

    ScrapeInfo uloží čas posledného behu pre štatistiky /start.

  4. 4

    /send test

    Dávka ide na kontrolu do testovacieho kanála.

  5. 5

    /send prod

    Tá istá dávka sa zverejní; /log ukáže, čo bolo odoslané.

05Technické detaily

Idempotentný zber

Odkaz je prirodzený kľúč ponuky. Opakovaný zber nikdy nevytvorí duplikáty, takže admini môžu zbierať, koľkokrát chcú.

services/scraper_model_1.jsjs
let addedCount = 0;
for (const job of jobs) {
  const exists = await Job.findOne({ link: job.link });
  if (!exists) {
    await Job.create(job);
    addedCount++;
  }
}

await ScrapeInfo.findOneAndUpdate(
  { sourceId: 1 },
  { lastScrapedAt: new Date() },
  { upsert: true, new: true },
);

06Návrhové rozhodnutia

Len pre adminov už z návrhu

Whitelist middleware chráni každý príkaz, takže bot môže bezpečne fungovať vo verejných kanáloch.

Zdroje ako konfigurácia

Zdroje sa registrujú cez konfiguráciu prostredia, takže nový web znamená pridať jeden modul scrapera.

Najprv test, potom produkcia

Dva kanály umožňujú kontrolu pred zverejnením bez samostatného administračného rozhrania.

07Technológie

Runtime
Node.jsExpressnode-telegram-bot-api
Zber dát
AxiosCheerioPuppeteer
Dáta
MongoDBMongoose

Ďalšia prípadová štúdia

Aments Storefront

E-shop v Next.js so serverovým renderovaním a prísnou dátovou architektúrou Route → Query → Mapper → UI.