Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Automates real-time TikTok and Instagram scraping, detects hashtag surges, and uses AI to generate trend-based scripts, videos, and hashtag alerts.
Automates real-time TikTok and Instagram scraping, detects hashtag surges, and uses AI to generate trend-based scripts, videos, and hashtag alerts.
This item's current download entry is known to bounce back to a listing or homepage instead of returning a package file.
Use the source page and any available docs to guide the install because the item currently does not return a direct package file.
I tried to install a skill package from Yavira, but the item currently does not return a direct package file. Inspect the source page and any extracted docs, then tell me what you can confirm and any manual steps still required.
I tried to upgrade a skill package from Yavira, but the item currently does not return a direct package file. Compare the source page and any extracted docs with my current installation, then summarize what changed and what manual follow-up I still need.
This skill builds a fully automated trend monitoring pipeline that: Scrapes TikTok and Instagram in real-time using Apify Sends trend data into Claude (via OpenClaw) for AI analysis Automatically generates content ideas, video scripts, and hashtag explosion alerts Produces ready-to-publish short videos via InVideo AI The result: you know what's trending before everyone else β and you already have the content ready. π Apify: https://www.apify.com/?fpr=dx06p π InVideo: https://invideo.sjv.io/TBB
Scrape TikTok hashtags, sounds, and viral posts every few hours via Apify Scrape Instagram Reels and trending hashtags in parallel Detect hashtag explosions β sudden spikes in post volume or engagement Send raw trend data to Claude for instant AI-powered analysis Auto-generate content ideas, angles, and hooks based on detected trends Write complete video scripts tailored to the trending topic Produce the video automatically via InVideo AI Alert via webhook, Slack, or email when a trend is breaking
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β TREND RADAR PIPELINE β β β β ββββββββββββ ββββββββββββ ββββββββββββββββββββββββ β β β Apify βββββΆβ Trend βββββΆβ Claude / OpenClaw β β β β Scraper β β Detector β β AI Analysis Engine β β β βTikTok + β β(spike β β β β β βInstagram β βdetection)β β β’ Content ideas β β β ββββββββββββ ββββββββββββ β β’ Script generation β β β β β’ Hashtag insights β β β ββββββββββββ¬ββββββββββββ β β β β β βββββββββββββββββββββΌβββββββββββββ β β β InVideo AI β β β β Auto Video Production β β β β (script β MP4 in minutes) β β β βββββββββββββββββββββ¬βββββββββββββ β β β β β βββββββββββββββββββββΌβββββββββββββ β β β ALERTS & OUTPUT β β β β Slack / Email / Webhook / CMS β β β ββββββββββββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Sign up at https://www.apify.com/?fpr=dx06p Go to Settings β Integrations Copy your token: export APIFY_TOKEN=apify_api_xxxxxxxxxxxxxxxx
Sign up at https://invideo.sjv.io/TBB Go to Settings β API / Developer Settings Copy your key: export INVIDEO_API_KEY=iv_api_xxxxxxxxxxxxxxxx
Get your Claude API key from your OpenClaw or Anthropic account Store it: export CLAUDE_API_KEY=sk-ant-xxxxxxxxxxxxxxxx
npm install apify-client axios node-cron
import ApifyClient from 'apify-client'; const apify = new ApifyClient({ token: process.env.APIFY_TOKEN }); // Define hashtags to monitor const WATCHED_HASHTAGS = [ "viral", "trending", "fyp", "lifehack", "productivity", "ai", "money", "fitness" ]; async function scrapeTikTokTrends() { const run = await apify.actor("apify/tiktok-hashtag-scraper").call({ hashtags: WATCHED_HASHTAGS, resultsPerPage: 50, shouldDownloadVideos: false }); const { items } = await run.dataset().getData(); return items.map(item => ({ platform: "tiktok", hashtag: item.hashtag, postCount: item.viewCount, likes: item.diggCount, shares: item.shareCount, comments: item.commentCount, description: item.text, author: item.authorMeta?.name, createdAt: item.createTime, url: item.webVideoUrl })); } async function scrapeInstagramTrends() { const run = await apify.actor("apify/instagram-hashtag-scraper").call({ hashtags: WATCHED_HASHTAGS, resultsLimit: 50 }); const { items } = await run.dataset().getData(); return items.map(item => ({ platform: "instagram", hashtag: item.hashtags?.[0] || "unknown", likes: item.likesCount, comments: item.commentsCount, description: item.caption, author: item.ownerUsername, createdAt: item.timestamp, url: item.url })); } async function scrapeAllPlatforms() { const [tiktok, instagram] = await Promise.all([ scrapeTikTokTrends(), scrapeInstagramTrends() ]); return [...tiktok, ...instagram]; }
// In-memory baseline (use a database like Redis for production) const baseline = {}; function detectExplosions(currentData) { const alerts = []; // Group by hashtag and calculate engagement scores const grouped = currentData.reduce((acc, post) => { if (!acc[post.hashtag]) acc[post.hashtag] = { posts: 0, totalLikes: 0, platforms: new Set() }; acc[post.hashtag].posts++; acc[post.hashtag].totalLikes += post.likes || 0; acc[post.hashtag].platforms.add(post.platform); return acc; }, {}); for (const [hashtag, stats] of Object.entries(grouped)) { const prev = baseline[hashtag] || { posts: 0, totalLikes: 0 }; const growthRate = prev.posts > 0 ? ((stats.posts - prev.posts) / prev.posts) * 100 : 100; // Alert if posts grew more than 40% since last check if (growthRate > 40) { alerts.push({ hashtag, growthRate: Math.round(growthRate), currentPosts: stats.posts, previousPosts: prev.posts, totalLikes: stats.totalLikes, platforms: [...stats.platforms], detectedAt: new Date().toISOString(), severity: growthRate > 100 ? "EXPLOSIVE" : "RISING" }); } // Update baseline baseline[hashtag] = stats; } return alerts.sort((a, b) => b.growthRate - a.growthRate); }
import axios from 'axios'; async function analyzeWithClaude(trendData, explosionAlerts) { const prompt = ` You are a viral content strategist. Analyze these trending social media data and provide actionable output. ## TRENDING DATA (last scrape) ${JSON.stringify(trendData.slice(0, 20), null, 2)} ## EXPLOSION ALERTS ${JSON.stringify(explosionAlerts, null, 2)} Respond ONLY in this exact JSON format, no preamble: { "topTrends": [ { "hashtag": "#example", "whyItsTrending": "brief explanation", "targetAudience": "who this appeals to", "contentAngle": "unique angle to take on this trend" } ], "contentIdeas": [ { "title": "video title idea", "hashtag": "#hashtag", "hook": "first 3 seconds script", "format": "tutorial | reaction | storytime | list | pov", "estimatedViralPotential": "high | medium | low", "reasoning": "why this would perform well" } ], "urgentAlerts": [ { "hashtag": "#hashtag", "message": "alert message", "recommendedAction": "what to do right now", "windowOfOpportunity": "estimated hours before trend peaks" } ], "bestTimeToPost": "recommendation based on trend timing" } `; const response = await axios.post( 'https://api.anthropic.com/v1/messages', { model: "claude-opus-4-5", max_tokens: 2000, messages: [{ role: "user", content: prompt }] }, { headers: { 'x-api-key': process.env.CLAUDE_API_KEY, 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json' } } ); const raw = response.data.content[0].text; const clean = raw.replace(/```json|```/g, '').trim(); return JSON.parse(clean); }
const invideo = axios.create({ baseURL: 'https://api.invideo.io/v1', headers: { Authorization: `Bearer ${process.env.INVIDEO_API_KEY}` } }); async function produceVideo(script) { // Start generation const { data } = await invideo.post('/videos/generate', { script: script.fullScript, format: "9:16", duration: "short", style: "dynamic", voiceover: { enabled: true, voice: "en-US-female-1", speed: 1.1 }, captions: { enabled: true, style: "bold-bottom", highlight: true }, music: { enabled: true, mood: "upbeat", volume: 0.25 }, cta: { enabled: true, text: script.cta, position: "bottom" } }); const videoId = data.videoId; // Poll until ready let exportUrl = null; while (!exportUrl) { await new Promise(r => setTimeout(r, 6000)); const status = await invideo.get(`/videos/${videoId}/status`); if (status.data.state === "completed") exportUrl = status.data.exportUrl; if (status.data.state === "failed") throw new Error("Video generation failed"); console.log(` Video progress: ${status.data.progress}%`); } return { videoId, exportUrl, script }; }
async function sendAlert(alert, analysis) { const payload = { text: `π¨ *TREND ALERT: ${alert.hashtag}* β ${alert.severity}`, blocks: [ { type: "section", text: { type: "mrkdwn", text: `*π ${alert.hashtag}* grew *${alert.growthRate}%* in the last check\n` + `Platforms: ${alert.platforms.join(', ')}\n` + `Window: ${analysis.urgentAlerts?.[0]?.windowOfOpportunity || 'Act now'}` } }, { type: "section", text: { type: "mrkdwn", text: `*π‘ Recommended action:*\n${analysis.urgentAlerts?.[0]?.recommendedAction || 'Create content immediately'}` } } ] }; // Send to Slack webhook if (process.env.SLACK_WEBHOOK_URL) { await axios.post(process.env.SLACK_WEBHOOK_URL, payload); } // Or send to any custom webhook if (process.env.ALERT_WEBHOOK_URL) { await axios.post(process.env.ALERT_WEBHOOK_URL, { type: "trend_explosion", alert, analysis, timestamp: new Date().toISOString() }); } }
import cron from 'node-cron'; async function runTrendRadar() { console.log(`\nπ Trend Radar scan started at ${new Date().toISOString()}`); try { // 1 β Scrape all platforms console.log(" [1/5] Scraping TikTok & Instagram..."); const trendData = await scrapeAllPlatforms(); console.log(` β ${trendData.length} posts collected`); // 2 β Detect explosions console.log(" [2/5] Detecting explosions..."); const alerts = detectExplosions(trendData); console.log(` β ${alerts.length} alerts detected`); // 3 β AI analysis console.log(" [3/5] Analyzing with Claude..."); const analysis = await analyzeWithClaude(trendData, alerts); console.log(` β ${analysis.contentIdeas?.length} content ideas generated`); // 4 β Auto-generate scripts for top 2 ideas console.log(" [4/5] Generating video scripts..."); const topIdeas = analysis.contentIdeas?.slice(0, 2) || []; const scripts = await Promise.all( topIdeas.map(idea => generateVideoScript(idea, JSON.stringify(analysis.topTrends))) ); console.log(` β ${scripts.length} scripts written`); // 5 β Produce videos console.log(" [5/5] Producing videos with InVideo..."); const videos = await Promise.all(scripts.map(produceVideo)); console.log(` β ${videos.length} videos ready`); // 6 β Send alerts if (alerts.length > 0) { await sendAlert(alerts[0], analysis); console.log(" β Alerts sent"); } // Final report return { scannedAt: new Date().toISOString(), postsAnalyzed: trendData.length, explosionAlerts: alerts, contentIdeas: analysis.contentIdeas, videos: videos.map(v => ({ title: v.script.title, url: v.exportUrl })), bestTimeToPost: analysis.bestTimeToPost }; } catch (err) { console.error("Radar error:", err.message); throw err; } } // Schedule: run every 4 hours automatically cron.schedule('0 */4 * * *', () => { runTrendRadar().then(report => { console.log("\nπ RADAR REPORT:", JSON.stringify(report, null, 2)); }); }); // Also run immediately on startup runTrendRadar();
# .env APIFY_TOKEN=apify_api_xxxxxxxxxxxxxxxx INVIDEO_API_KEY=iv_api_xxxxxxxxxxxxxxxx CLAUDE_API_KEY=sk-ant-xxxxxxxxxxxxxxxx # Optional alerts SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx/xxx/xxx ALERT_WEBHOOK_URL=https://your-app.com/webhooks/trends
{ "scannedAt": "2025-02-25T10:00:00Z", "postsAnalyzed": 400, "explosionAlerts": [ { "hashtag": "#aitools", "severity": "EXPLOSIVE", "growthRate": 187, "platforms": ["tiktok", "instagram"], "windowOfOpportunity": "4β8 hours" } ], "contentIdeas": [ { "title": "5 AI tools that replaced my entire team", "hashtag": "#aitools", "hook": "I fired my team. Here's what I replaced them with.", "format": "list", "estimatedViralPotential": "high" } ], "videos": [ { "title": "5 AI tools that replaced my entire team", "url": "https://cdn.invideo.io/exports/iv_xxx.mp4" } ], "bestTimeToPost": "Post within the next 3 hours while the trend is rising" }
Run the radar every 2β4 hours β trends peak fast and fade within 24β48h Monitor 8β15 hashtags max per run to stay within Apify free tier Always produce content within the rising phase β never wait for the peak Use node-cron for local scheduling or Apify Schedules for cloud automation Store baseline data in Redis or a database for accurate spike detection in production Pipe the video URLs directly into your social media scheduler (Buffer, Later, etc.)
Apify account β https://www.apify.com/?fpr=dx06p InVideo account β https://invideo.sjv.io/TBB Claude / OpenClaw API key Node.js 18+ Optional: Slack workspace for real-time alerts Optional: Social media scheduler (Buffer, Later) for auto-publishing
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.