AX/T/02 — AX/TUTORIALS
Opublikowano: 4 maj 2026 · 22 min czytania

Jak zautomatyzować sourcing leadów z LinkedIn

Account warming, search-based scraping, AI enrichment, push do HubSpot/Pipedrive. Bez banów i z prawdziwymi rezultatami.

AdvancedPlaywrightTypeScriptOpenAI / Anthropic APIPostgreSQLHubSpot API

LinkedIn jest najtrudniejszym targetem do automatyzacji w 2026. Mają zaawansowane behavioral detection, IP fingerprinting, rate limits per akcja, i agresywne banowanie kont. Ale dobry pipeline tu wygenerowany przebija każde inne źródło B2B.

Ten tutorial pokazuje długoterminowe podejście — nie skrypt który pójdzie raz, dostanie 1000 profili i konto wyląduje na permanent banie po 48h. Pokazujemy infra dla 6-12 miesięcy stabilnego sourcingu.

UWAGA: Naruszenie LinkedIn ToS. Robisz to na własną odpowiedzialność. Stosuj wyłącznie do publicznych danych biznesowych (zgodne z hiQ vs LinkedIn precedensem). Personal data, messages, profile photos = nie ruszaj.

Co potrzebujesz
  • Node.js 20+ lub Python 3.11+
  • Doświadczenie z Playwright (browser contexts, network interception)
  • Dedykowany residential proxy (jeden IP per konto, koniecznie)
  • 1-3 LinkedIn konta — najlepiej kupione lub warmed (nigdy główne firmowe)
  • OpenAI / Anthropic API key dla AI scoring
  • CRM (HubSpot, Pipedrive, lub własna baza)
Kroki
  1. 01

    Account warming — 28-dniowy plan

    Fresh account = instant ban przy automation. Warming to baseline.

    • Tydzień 1: profil setup (zdjęcie, headline, 3-5 jobs history), connection requests 5-10/dzień do real ludzi w branży, like 10-20 postów dziennie
    • Tydzień 2: connection requests 15-20/dzień, komentarze pod postami (2-3 dziennie), 1 post od siebie
    • Tydzień 3: 20-30 connections, 5+ komentarzy, własne posty 2-3/tydz, DM do nowych connections
    • Tydzień 4: stabilizacja na safe max — można zaczynać automation

    Warming RĘCZNY — nie ma sensu automatyzować warming, to defeat the purpose. 15 min/dzień przez 28 dni.

  2. 02

    Browser fingerprint per konto

    LinkedIn śledzi browser fingerprint. Każde konto MUSI mieć stały, unikalny fingerprint przez cały czas użytkowania. Używamy playwright-extra + custom fingerprint:

    // fingerprint/store.ts
    import { chromium } from 'playwright-extra';
    import stealth from 'puppeteer-extra-plugin-stealth';
    chromium.use(stealth());
    
    const accountFingerprints = {
      'account-01': {
        userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...',
        viewport: { width: 1440, height: 900 },
        locale: 'pl-PL',
        timezoneId: 'Europe/Warsaw',
        proxy: 'http://user:pass@proxy-pl-1.smartproxy.com:7000',
      },
      // ... per account
    };
    
    export async function launchForAccount(accountId) {
      const fp = accountFingerprints[accountId];
      const browser = await chromium.launch({
        headless: true,
        proxy: { server: fp.proxy },
      });
      const context = await browser.newContext({
        userAgent: fp.userAgent,
        viewport: fp.viewport,
        locale: fp.locale,
        timezoneId: fp.timezoneId,
        storageState: `./storage/${accountId}.json`, // persistent cookies
      });
      return { browser, context };
    }

    storageState trzyma session cookies — żeby nie logować się za każdym razem (logowanie = trigger).

  3. 03

    Search-based scraping z rate limits

    Sales Navigator search → lista profili. Każda akcja ma rate limit. Bezpieczne thresholdy (2026):

    • Profile views: 80-100/dzień (300+ = ban warning)
    • Connection requests: 80-100/tydz (zmiana od 2023, było 100/dzień)
    • Search queries: 30-50/dzień
    • Message sends: 30-50/dzień do connections
    const RATE_LIMITS = {
      profileViews: { max: 80, window: '24h' },
      connectionRequests: { max: 80, window: '7d' },
      searchQueries: { max: 30, window: '24h' },
    };
    
    async function checkAndScrapeProfile(accountId, profileUrl) {
      if (!await canPerform(accountId, 'profileViews')) {
        logger.info({ accountId, action: 'skip', reason: 'rate_limit' });
        return null;
      }
      // ... actual scrape
      await recordAction(accountId, 'profileViews');
    }

    Distribute work przez multiple accounts — 3 konta × 80 profili/dzień = 240/dzień bez ryzyka.

  4. 04

    Human-like behavior — losowe pauzy, scroll, mouse

    Bot który robi page.goto → page.locator.click → next co 2 sekundy = oczywisty bot. Symulujemy człowieka:

    async function humanVisit(page, url) {
      await page.goto(url, { waitUntil: 'domcontentloaded' });
      await sleep(rand(1500, 3500)); // initial pause
      // Random scroll
      for (let i = 0; i < rand(2, 5); i++) {
        await page.evaluate(`window.scrollBy(0, ${rand(200, 600)})`);
        await sleep(rand(800, 2000));
      }
      // Random mouse movement
      await page.mouse.move(rand(100, 1300), rand(100, 700), { steps: rand(10, 25) });
      await sleep(rand(500, 1500));
      // Reading time on profile
      await sleep(rand(8000, 25000)); // 8-25s per profile
    }

    Per profil: 15-40 sekund (vs <2s u naiwnego bota). 80 profili dziennie zajmie 30-60 min wall-clock. To OK — automation nie musi być instant.

  5. 05

    AI scoring i CRM push

    Surowe profile = noise. Filter przez LLM żeby zostawić tylko ICP fit:

    import Anthropic from '@anthropic-ai/sdk';
    const client = new Anthropic();
    
    async function scoreProfile(profile) {
      const response = await client.messages.create({
        model: 'claude-3-5-sonnet-latest',
        max_tokens: 256,
        messages: [{
          role: 'user',
          content: `ICP: B2B SaaS, 50-200 employees, founder/CRO/Head of Sales.
            Profile:
            ${JSON.stringify(profile)}
            
            Score 0-10 for ICP fit. Reply with JSON: {"score": N, "reason": "..."}`,
        }],
      });
      return JSON.parse(response.content[0].text);
    }

    Push do HubSpot tylko score >=7. HubSpot API:

    async function pushToHubSpot(profile, score) {
      await fetch('https://api.hubapi.com/crm/v3/objects/contacts', {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${process.env.HUBSPOT_TOKEN}`,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          properties: {
            firstname: profile.firstName,
            lastname: profile.lastName,
            company: profile.company,
            jobtitle: profile.title,
            linkedin_url: profile.url,
            ax_score: score.score,
            ax_score_reason: score.reason,
            lifecyclestage: 'lead',
          }
        }),
      });
    }
Ile to kosztuje uruchomić

Run cost dla 3 kont, 240 profili/dzień (7200/mies):

  • Residential proxy (3 dedykowane IP, ~5GB/mies): $40-60/mies
  • VPS (Hetzner CX32, 4vCPU/8GB — multiple Playwright contexts wymaga RAM): €10/mies
  • Anthropic API (Claude Sonnet, ~200 tokens per profile in/out): ~$15-25/mies za 7200 scoringów
  • HubSpot: $0 (free tier do 1k contacts) lub plan zależnie
  • LinkedIn accounts: $20-50/konto jednorazowo (kupione warmed) lub czas (warming 28 dni)

Total: ~$70-100/mies operating + $60-150 jednorazowo za konta.

Częste pułapki
  • Brak account warming — fresh accounts bannowane w 24-48h. Bez wyjątków.
  • Współdzielony IP między kontami — natychmiastowy trigger. 1 IP per konto, zawsze.
  • Logowanie się za każdym razem — używaj storageState dla persistent cookies.
  • Stałe 5-sekundowe pauzy — bot pattern. Randomize 1.5-3.5s, 8-25s na profilu.
  • Brak monitoringu success rate — gdy LinkedIn zaczyna serwować "you must be a robot" pages, scraper zwraca śmieci nie błędy. Monitor success metrics.
  • Naruszenie GDPR — profile na LinkedIn = personal data. Lawful basis (Art. 6) MUSI być przemyślany. Konsultuj z prawnikiem.
Build yourself czy zlecić?

Powyższe daje 240 ICP-scored leadów/dzień przy bezpiecznej operacji. Skalowanie do 1000+/dzień wymaga: 12+ kont (z osobnymi IP), distributed queue, ML-driven action distribution (zamiast hard limits, predict-driven), dedicated infra dla każdej geo.

Jeśli potrzebujesz tego at scale bez 6-miesięcznego R&D — napisz. Robimy LinkedIn sourcing dla 4 klientów obecnie, 8-osobowa agencja HR robiła z nami 4× swoją normalną pojemność.

Najczęściej zadawane pytania
Czy LinkedIn banuje konta używające automation?
Tak, agresywnie. Fresh accounts dostają permanent ban w 24-48h. Warmed accounts z dedicated IP + human-like behavior trzymają się 6-12 miesięcy. Bez warming + bez rotacji IP = banowane natychmiast. To NIE jest opcja "może się uda".
Ile leadów dziennie mogę bezpiecznie pobrać?
Per konto: 80-100 profile views + 30-50 search queries + 30-50 messages. Z 3 kontami = 240 ICP-scored leadów/dzień. Powyżej 100 profile views per konto pojawia się "you are being too active" warning. Powyżej 300 — temporary restriction. Powyżej 1000 — permanent ban.
Czy automation LinkedIn jest zgodne z ToS?
Nie. LinkedIn ToS zabrania scrapingu, automation, używania nieautoryzowanych narzędzi. Precedens hiQ vs LinkedIn (2022) potwierdza prawo do scrapingu PUBLIC profile data, ale nie chroni przed terminacją konta. Robisz to na własne ryzyko.
Co z GDPR/RODO przy scrapingu LinkedIn?
LinkedIn profile to personal data. Art. 6 GDPR wymaga lawful basis — najczęściej "legitimate interest" (B2B sales). Wymagany: legitimate interest assessment (LIA), opt-out mechanism, data minimization, retention policy. Konsultuj z prawnikiem PRZED uruchomieniem.