Apify Actor: TikTok Legal Competitors Monitor

Технічна реалізація для моніторингу конкурентів кожні 4 години

Playwright TikTok API Automated Monitoring

Цільові конкуренти

@advokat_vasilevska

Військове право, ВЛК консультації

tiktok.com/@advokat_vasilevska

@advokat_lyubov_karpiuk

Юридичні консультації

tiktok.com/@advokat_lyubov_karpiuk

@primus_partners

Корпоративне право

tiktok.com/@primus_partners

Технічна архітектура

Компоненти системи

  • Apify Actor (Node.js)
  • Playwright Browser Automation
  • Cron Scheduler (4-year intervals)
  • Data Storage (Apify Dataset)
  • Webhook Notifications

Параметри збору

  • Інтервал: Кожні 4 години
  • Глибина: Останні 20 відео
  • Фільтр: Мін. 1000 переглядів
  • Ключові слова: ВЛК, військове право
  • Формат даних: JSON/CSV

Основний код Apify Actor

Файл: main.js

// Apify Actor для моніторингу TikTok конкурентів const Apify = require('apify'); const { playwright } = require('playwright'); // Конфігурація для юридичної ніші const LEGAL_CONFIG = { competitors: [ 'advokat_vasilevska', 'advokat_lyubov_karpiuk', 'primus_partners' ], keywords: ['ВЛК', 'військовий адвокат', 'оскарження'], minViews: 1000, maxVideos: 20 }; Apify.main(async () => { const input = await Apify.getInput(); const requestQueue = await Apify.openRequestQueue(); // Додаємо запити для кожного конкурента for (const account of LEGAL_CONFIG.competitors) { await requestQueue.addRequest({ url: `https://www.tiktok.com/@${account}`, userData: { account, platform: 'tiktok' } }); } const crawler = new Apify.PlaywrightCrawler({ requestQueue, launchContext: { launchOptions: { headless: true, args: ['--no-sandbox'] } }, handlePageFunction: scrapeTikTokProfile }); await crawler.run(); });

Playwright Scraper функція

// Функція для скрапінгу TikTok профілю async function scrapeTikTokProfile({ page, request }) { const { account } = request.userData; try { // Переходимо на сторінку користувача await page.goto(request.url, { waitUntil: 'networkidle', timeout: 30000 }); // Чекаємо завантаження відео await page.waitForSelector('[data-e2e="user-post-item"]', { timeout: 15000 }); // Скролимо для завантаження більше відео await autoScroll(page, 3); // Витягуємо дані відео const videos = await page.evaluate((config) => { const videoElements = document.querySelectorAll('[data-e2e="user-post-item"]'); const videos = []; videoElements.forEach((video, index) => { if (index >= config.maxVideos) return; const link = video.querySelector('a[href*="/video/"]')?.href; const viewsText = video.querySelector('[data-e2e="video-views"]')?.textContent || '0'; const desc = video.querySelector('[data-e2e="video-desc"]')?.textContent || ''; const views = parseInt(viewsText.replace(/[^0-9]/g, '')) || 0; // Фільтруємо по переглядах та ключових словах if (views >= config.minViews) { const hasLegalContent = config.keywords.some(keyword => desc.toLowerCase().includes(keyword.toLowerCase()) ); videos.push({ account: config.account, url: link, views: views, description: desc.trim(), hasLegalContent: hasLegalContent, scrapedAt: new Date().toISOString(), videoId: link?.split('/').pop() }); } }); return videos; }, { ...LEGAL_CONFIG, account }); // Зберігаємо дані await Apify.pushData({ account: account, videosCount: videos.length, videos: videos, scrapedAt: new Date().toISOString() }); console.log(`Scraped ${videos.length} videos from @${account}`); } catch (error) { console.error(`Error scraping @${account}:`, error); } } // Автоскрол для завантаження контенту async function autoScroll(page, scrolls = 3) { for (let i = 0; i < scrolls; i++) { await page.evaluate('window.scrollTo(0, document.body.scrollHeight)'); await page.waitForTimeout(2000); } }

Конфігурація package.json

{ "name": "tiktok-legal-competitors-monitor", "version": "1.0.0", "description": "TikTok competitor monitoring for legal niche", "main": "main.js", "scripts": { "start": "node main.js", "test": "echo \"No tests specified\"" }, "dependencies": { "apify": "^3.0.0", "playwright": "^1.40.0", "playwright-chromium": "^1.40.0" }, "author": "ПРАВОВИЙ ЗАХИСТ ДНІПРО", "license": "MIT" }

Input Schema (INPUT_SCHEMA.json)

{ "title": "TikTok Legal Competitors Monitor", "type": "object", "schemaVersion": 1, "properties": { "competitors": { "title": "TikTok Competitors", "type": "array", "description": "List of TikTok usernames to monitor", "default": [ "advokat_vasilevska", "advokat_lyubov_karpiuk", "primus_partners" ], "editor": "stringList" }, "maxVideos": { "title": "Max Videos Per Account", "type": "integer", "default": 20, "minimum": 1, "maximum": 100 }, "minViews": { "title": "Minimum Views Filter", "type": "integer", "default": 1000 }, "keywords": { "title": "Legal Keywords", "type": "array", "default": ["ВЛК", "військовий адвокат", "оскарження"], "editor": "stringList" } }, "required": ["competitors"] }

Інструкції розгортання

1. Створення Apify Actor

# Створити новий актор в Apify Console npm install -g apify-cli apify login apify create tiktok-legal-monitor

2. Налаштування планувальника

Створити планувальник в Apify Console:

  • Cron expression: 0 */4 * * * (кожні 4 години)
  • Timezone: Europe/Kiev
  • Max run time: 30 minutes

3. Webhook інтеграція

// Додати в main.js для сповіщень const webhook = 'https://hooks.slack.com/your-webhook'; await fetch(webhook, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: `TikTok monitoring completed: ${totalVideos} new videos found` }) });

Метрики продуктивності

~5 хв
Час виконання
60+ відео
За один запуск
$0.5-2
Вартість за запуск
6x/день
Частота моніторингу

Додаткові функції

Фільтрація за ключовими словами

// AI-фільтрація контенту const analyzeContent = async (description) => { const legalKeywords = [ 'ВЛК', 'військово-лікарська комісія', 'оскарження ВЛК', 'військовий адвокат', 'звільнення за станом здоров\'я', 'медичне обстеження', 'категорія придатності' ]; const relevanceScore = legalKeywords.reduce((score, keyword) => { return description.toLowerCase().includes(keyword.toLowerCase()) ? score + 1 : score; }, 0); return { isRelevant: relevanceScore > 0, relevanceScore: relevanceScore, matchedKeywords: legalKeywords.filter(k => description.toLowerCase().includes(k.toLowerCase()) ) }; };

Порівняльний аналіз

// Аналіз ефективності контенту const analyzePerformance = (videos) => { const stats = videos.reduce((acc, video) => { acc.totalViews += video.views; acc.avgViews = acc.totalViews / videos.length; if (video.views > acc.maxViews) { acc.maxViews = video.views; acc.topVideo = video; } return acc; }, { totalViews: 0, avgViews: 0, maxViews: 0, topVideo: null }); return { accountPerformance: stats, insights: generateInsights(stats), recommendations: generateRecommendations(stats) }; };

Безпека та комплаєнс

Заходи безпеки

  • Rotating User Agents
  • IP Rotation через проксі
  • Rate limiting (2-3 сек між запитами)
  • Headless browser mode
  • Error handling and retries

Правові обмеження

  • Тільки публічні дані
  • Дотримання robots.txt
  • Моніторинг, не копіювання
  • Конкурентна розвідка
  • GDPR compliance

Аналіз вартості

Компонент Частота Вартість за місяць ROI
Apify Actor (Basic) 180 запусків/місяць $15-30 +1200%
Playwright Browser ~15 годин/місяць $10-20 +800%
Data Storage ~10GB/місяць $2-5
ЗАГАЛОМ 24/7 моніторинг $27-55 +900%

Порівняння: Ручний моніторинг 3 конкурентів займе 2-3 години/день = $1200+/місяць. Автоматизація коштує $30-50/місяць = економія 96%!