КОД ИНТЕГРАЦИИ — Node.js
1. Зависимости
npm install node-cron axios dotenv pg redis node-telegram-bot-api
2. Конфиг хэштегов (динамически из БД)
// hashtags.config.js — загружается из PostgreSQL + обновляется через UI
const GROUPS = {
download_signals: ['downloadthisapp','tryit','linkinbio','mustdownload',...],
ai_apps: ['aiapp','aifilter','aivideo','chatgptapp',...],
viral_signals: ['tiktokmademebuyit','viralapp','gamechangerapp',...],
};
async function getActiveHashtags(priority) {
const { rows } = await db.query(
'SELECT tag FROM hashtags WHERE active=true AND priority=$1', [priority]
);
return rows.map(r => r.tag);
}
3. Планировщик + получение share_url (ссылка на видео)
async function fetchByHashtag(hashtag) {
const token = await getToken();
const { data } = await axios.post(
'https://open.tiktokapis.com/v2/research/video/query/',
{
query: { and: [{ operation: 'IN', field_name: 'hashtag_name',
field_values: [hashtag] }] },
start_date: daysAgo(1), end_date: today(),
max_count: 100, sort_type: '0',
// share_url — это прямая ссылка на TikTok видео!
fields: 'id,create_time,like_count,view_count,share_count,hashtag_names,video_description,share_url'
},
{ headers: { Authorization: `Bearer ${token}` } }
);
return data.data.videos;
}
// Построить URL на Discover по хэштегу:
const ttDiscoverUrl = tag => `https://www.tiktok.com/discover/${encodeURIComponent(tag)}`;
const ttSearchUrl = tag => `https://www.tiktok.com/search?q=%23${encodeURIComponent(tag)}`;
4. Анализатор — определение упоминаний приложений
const APP_SIGNALS = [
/app store/i, /play store/i, /download.*app/i, /link in bio/i,
/#(\w+app)\b/, /try.*app/i, /this app/i, /free app/i,
/must.*download/i, /you need this/i, /game changer/i,
];
function scoreVideo(video) {
const text = `${video.video_description} ${video.hashtag_names.join(' ')}`;
const score = APP_SIGNALS.filter(p => p.test(text)).length;
const velocity = video.view_count / hoursSince(video.create_time);
return { ...video, score, velocity,
tiktokUrl: video.share_url, // прямая ссылка на видео
discoverUrl: ttDiscoverUrl(video.hashtag_names[0]),
};
}
async function analyze(videos) {
return videos.map(scoreVideo)
.filter(v => v.score > 0)
.sort((a,b) => b.velocity - a.velocity);
}
5. Telegram-алерт со ссылкой на TikTok
async function checkVelocity(apps) {
for (const app of apps) {
if (app.velocity > 50_000) {
await bot.sendMessage(CHAT_ID,
`🔥 *ВЗРЫВ ТРЕНДА*\n\n` +
`Хэштег: \`${app.hashtag_names[0]}\`\n` +
`Views/h: ${app.velocity.toLocaleString()}\n` +
`Лайков: ${app.like_count.toLocaleString()}\n\n` +
`[▶ Видео на TikTok](${app.share_url})\n` +
`[🔍 Discover по тегу](${app.discoverUrl})`,
{ parse_mode: 'Markdown' }
);
}
}
}