Apify Actor: TikTok Legal Competitors Monitor
Технічна реалізація для моніторингу конкурентів кожні 4 години
Playwright
TikTok API
Automated Monitoring
Технічна архітектура
Компоненти системи
- 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
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 функція
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
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 інтеграція
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`
})
});
Метрики продуктивності
$0.5-2
Вартість за запуск
6x/день
Частота моніторингу
Додаткові функції
Фільтрація за ключовими словами
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%!