Install
openclaw skills install ai-gaming-contentScrapes trending gaming data and viral clips to generate optimized scripts and produce viral gaming videos with AI for content creators and monetization.
openclaw skills install ai-gaming-contentDisplay Name: AI Gaming Content and Monetization Machine
Version: 1.0.0
Author: @g4dr
Gaming is the largest entertainment industry on the planet. $200B+ per year and growing. This skill scrapes trending games, viral clips, Reddit discussions, YouTube gaming channels and TikTok gaming content to find what is blowing up right now, then generates optimized scripts and produces complete gaming content videos with AI. Whether you run a gaming channel, review games, create compilations or do commentary, this skill builds your content factory.
Works for: gaming YouTubers, TikTok gaming creators, Twitch streamers expanding to short-form, gaming news channels, esports content teams, game review sites.
Powered by: Apify + InVideo AI + Claude AI
This skill uses Apify to scrape gaming trend data across platforms.
export APIFY_TOKEN=apify_api_xxxxxxxxxxxxxxxx
This skill uses InVideo AI to produce gaming content videos.
export INVIDEO_API_KEY=iv_api_xxxxxxxxxxxxxxxx
npm install apify-client axios
| Actor | What It Scrapes | Gaming Data |
|---|---|---|
| Apify Reddit Scraper | r/gaming, r/pcgaming, r/PS5, r/NintendoSwitch | Trending discussions, controversies, leaks, memes |
| Apify TikTok Hashtag Scraper | Gaming TikTok content | Viral clips, views, engagement, sounds |
| Apify YouTube Scraper | Gaming YouTube channels and search | Views, likes, upload frequency, topics |
| Apify Twitter Scraper | Gaming Twitter/X | Developer announcements, community reactions |
| Apify Google Trends Scraper | Search interest for games | Rising vs declining games, seasonal patterns |
| Apify Website Content Crawler | Steam, IGN, Metacritic | New releases, review scores, wishlists |
| Apify Google News Scraper | Gaming news sites | Breaking news, controversy, updates |
| Apify Instagram Scraper | Gaming Instagram | Fan art, memes, cosplay trends |
import ApifyClient from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
async function scrapeGamingReddit() {
const subreddits = [
"https://www.reddit.com/r/gaming/",
"https://www.reddit.com/r/pcgaming/",
"https://www.reddit.com/r/PS5/",
"https://www.reddit.com/r/NintendoSwitch/",
"https://www.reddit.com/r/Games/"
];
const run = await client.actor("apify/reddit-scraper").call({
startUrls: subreddits.map(url => ({ url })),
maxPostCount: 30,
maxComments: 10,
sort: "hot"
});
const { items } = await run.dataset().getData();
// Score by controversy potential (high comments to upvotes ratio = hot take territory)
return items.map(post => ({
title: post.title,
subreddit: post.subreddit,
score: post.score,
comments: post.numComments,
upvoteRatio: post.upvoteRatio,
controversyScore: post.numComments > 0 ? Math.round(post.numComments / Math.max(post.score, 1) * 100) : 0,
url: post.url,
created: post.created,
flair: post.flair || ''
})).sort((a, b) => b.controversyScore - a.controversyScore);
}
const trending = await scrapeGamingReddit();
console.log("Top trending gaming topics:");
trending.slice(0, 10).forEach((t, i) => {
console.log(`${i + 1}. [${t.controversyScore}] ${t.title} (${t.subreddit})`);
});
async function scrapeViralGamingContent(game = "gaming") {
const hashtags = [game, `${game}tiktok`, 'gamingtiktok', 'gamingclips', 'gamernews'];
const [ttRun, ytRun] = await Promise.all([
client.actor("apify/tiktok-hashtag-scraper").call({
hashtags: hashtags.slice(0, 3),
resultsPerPage: 30,
shouldDownloadVideos: false
}),
client.actor("apify/youtube-scraper").call({
searchKeywords: [`${game} 2025`, `${game} news`, `${game} review`],
maxResults: 30,
type: "video",
sortBy: "view_count"
})
]);
const [tt, yt] = await Promise.all([
ttRun.dataset().getData(),
ytRun.dataset().getData()
]);
// Identify top formats
const formatDetection = (text) => {
const t = (text || '').toLowerCase();
if (t.includes('tier list') || t.includes('ranking')) return 'Tier List';
if (t.includes('review') || t.includes('worth')) return 'Review';
if (t.includes('vs') || t.includes('versus') || t.includes('better')) return 'Comparison';
if (t.includes('tip') || t.includes('trick') || t.includes('hack')) return 'Tips & Tricks';
if (t.includes('news') || t.includes('update') || t.includes('patch')) return 'News/Update';
if (t.includes('hot take') || t.includes('unpopular') || t.includes('controversial')) return 'Hot Take';
if (t.includes('compilation') || t.includes('moments') || t.includes('montage')) return 'Compilation';
return 'Other';
};
const tiktokTop = tt.items.sort((a, b) => (b.playCount || 0) - (a.playCount || 0)).slice(0, 15);
const youtubeTop = yt.items.sort((a, b) => (b.viewCount || 0) - (a.viewCount || 0)).slice(0, 15);
// Count formats
const formatCounts = {};
[...tiktokTop, ...youtubeTop].forEach(v => {
const format = formatDetection(v.text || v.title);
formatCounts[format] = (formatCounts[format] || 0) + 1;
});
return {
tiktokTop: tiktokTop.map(v => ({
text: v.text,
views: v.playCount,
likes: v.diggCount,
shares: v.shareCount,
format: formatDetection(v.text),
sound: v.musicMeta?.musicName
})),
youtubeTop: youtubeTop.map(v => ({
title: v.title,
views: v.viewCount,
likes: v.likeCount,
channel: v.channelName,
format: formatDetection(v.title),
duration: v.duration
})),
winningFormats: Object.entries(formatCounts)
.sort((a, b) => b[1] - a[1])
.map(([format, count]) => ({ format, count })),
trendingSounds: tiktokTop
.filter(v => v.sound)
.map(v => v.sound)
.filter((v, i, a) => a.indexOf(v) === i)
.slice(0, 5)
};
}
const gamingContent = await scrapeViralGamingContent("GTA6");
console.log("Winning formats:", gamingContent.winningFormats);
async function detectEmergingGames() {
// Scrape Reddit for rising discussions
const redditRun = await client.actor("apify/reddit-search-scraper").call({
queries: ["new game 2025", "upcoming game", "game announcement", "hidden gem game"],
maxItems: 50
});
// Scrape Google Trends for rising game searches
const trendsRun = await client.actor("apify/google-trends-scraper").call({
searchTerms: ["new video game", "game release 2025", "best game 2025"],
geo: "US",
timeRange: "past7Days"
});
// Scrape YouTube for low-view-count videos on trending topics (content gap)
const ytRun = await client.actor("apify/youtube-scraper").call({
searchKeywords: ["new game 2025 review"],
maxResults: 30,
type: "video",
sortBy: "date"
});
const [reddit, trends, yt] = await Promise.all([
redditRun.dataset().getData(),
trendsRun.dataset().getData(),
ytRun.dataset().getData()
]);
// Find games mentioned in Reddit with high engagement but few YouTube videos
const gameNames = new Set();
reddit.items.forEach(post => {
const words = (post.title || '').split(/\s+/);
// Simple heuristic: capitalized multi-word phrases are likely game names
words.forEach((w, i) => {
if (w.length > 3 && w[0] === w[0].toUpperCase() && words[i + 1]?.[0] === words[i + 1]?.[0]?.toUpperCase()) {
gameNames.add(`${w} ${words[i + 1]}`);
}
});
});
// Check which have few YouTube results (content gap = opportunity)
const lowCompetition = yt.items
.filter(v => (v.viewCount || 0) < 10000)
.map(v => v.title);
return {
emergingTopics: reddit.items
.sort((a, b) => (b.score || 0) - (a.score || 0))
.slice(0, 10)
.map(p => ({ title: p.title, score: p.score, comments: p.numComments })),
potentialGameNames: [...gameNames].slice(0, 20),
contentGaps: lowCompetition.slice(0, 10),
searchTrends: trends.items?.slice(0, 10)
};
}
const emerging = await detectEmergingGames();
console.log("Emerging topics:", emerging.emergingTopics.slice(0, 5));
console.log("Content gaps:", emerging.contentGaps.slice(0, 5));
import axios from 'axios';
async function generateGamingScripts(trendData, gameTopic, count = 5) {
const topHooks = trendData.tiktokTop?.slice(0, 5).map(v =>
`"${(v.text || '').substring(0, 80)}" (${(v.views || 0).toLocaleString()} views)`
).join('\n') || 'No TikTok data';
const formats = trendData.winningFormats?.map(f => `${f.format} (${f.count}x)`).join(', ') || 'Mixed';
const prompt = `You are a viral gaming content creator. Generate ${count} short-form video scripts about "${gameTopic}".
VIRAL DATA (from real top-performing gaming videos):
Top hooks:
${topHooks}
Winning formats: ${formats}
RULES FOR EACH SCRIPT:
- Hook in first 2 seconds (gaming audiences scroll FAST)
- 100 to 160 words (30 to 45 second video for gaming)
- Use one of these proven formats: Hot Take, Tier List, "Things You Missed", News Reaction, Tips
- Include gaming-specific language (no corporate tone)
- Each script gets 2 hook variations (A/B test)
- End with engagement CTA ("drop your rank in comments", "follow for daily gaming news")
- Include 5 hashtags per script
FORMAT:
SCRIPT [number]: [title]
FORMAT: [format type]
HOOK A: [hook variation 1]
HOOK B: [hook variation 2]
BODY: [script body]
CTA: [call to action]
HASHTAGS: [5 hashtags]
Generate all ${count} scripts now.`;
const { data } = await axios.post('https://api.anthropic.com/v1/messages', {
model: "claude-sonnet-4-20250514",
max_tokens: 2000,
messages: [{ role: "user", content: prompt }]
}, {
headers: {
'x-api-key': process.env.CLAUDE_API_KEY,
'anthropic-version': '2023-06-01'
}
});
return data.content[0].text;
}
const scripts = await generateGamingScripts(gamingContent, "GTA 6", 5);
console.log(scripts);
const invideo = axios.create({
baseURL: 'https://api.invideo.io/v1',
headers: {
'Authorization': `Bearer ${process.env.INVIDEO_API_KEY}`,
'Content-Type': 'application/json'
}
});
async function produceGamingVideo(script) {
const response = await invideo.post('/videos/generate', {
script: script,
format: "9:16",
duration: "short",
style: "dynamic",
voiceover: {
enabled: true,
voice: "en-US-male-1",
speed: 1.15 // gaming audience prefers fast pacing
},
captions: {
enabled: true,
style: "bold-bottom",
highlight: true
},
music: {
enabled: true,
mood: "energetic",
volume: 0.3
}
});
const videoId = response.data.videoId;
let exportUrl = null;
while (!exportUrl) {
await new Promise(r => setTimeout(r, 5000));
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");
}
return { videoId, exportUrl };
}
async function analyzeMonetization(game, youtubeData) {
// Estimate CPM by niche (gaming CPMs are $3-8)
const estimatedCPM = 5.50;
const channelAnalysis = youtubeData.youtubeTop.map(v => {
const estimatedRevenue = Math.round((v.views / 1000) * estimatedCPM * 100) / 100;
return {
title: v.title,
channel: v.channel,
views: v.views,
estimatedAdRevenue: estimatedRevenue,
format: v.format
};
});
// Best monetization formats
const formatRevenue = {};
channelAnalysis.forEach(v => {
if (!formatRevenue[v.format]) formatRevenue[v.format] = { totalViews: 0, count: 0 };
formatRevenue[v.format].totalViews += v.views;
formatRevenue[v.format].count++;
});
const bestFormats = Object.entries(formatRevenue)
.map(([format, data]) => ({
format,
avgViews: Math.round(data.totalViews / data.count),
estimatedRevenuePer: Math.round((data.totalViews / data.count / 1000) * estimatedCPM * 100) / 100
}))
.sort((a, b) => b.avgViews - a.avgViews);
return {
estimatedCPM,
topEarningVideos: channelAnalysis.sort((a, b) => b.estimatedAdRevenue - a.estimatedAdRevenue).slice(0, 5),
bestFormatsForRevenue: bestFormats,
monthlyPotential: {
"1_video_per_day": Math.round(30 * bestFormats[0]?.estimatedRevenuePer || 0),
"3_videos_per_week": Math.round(12 * bestFormats[0]?.estimatedRevenuePer || 0)
},
sponsorshipAngle: `Gaming channels with 10K+ subs covering ${game} can charge $500-2000 per sponsored video`
};
}
const monetization = await analyzeMonetization("GTA 6", gamingContent);
console.log("Monthly potential (daily uploads):", `$${monetization.monthlyPotential["1_video_per_day"]}`);
console.log("Best format for revenue:", monetization.bestFormatsForRevenue[0]);
import { writeFileSync } from 'fs';
async function fullGamingContentPipeline(game, videoCount = 5) {
console.log(`Starting Gaming Content Pipeline for: ${game}`);
// 1. Scrape trends
const reddit = await scrapeGamingReddit();
const content = await scrapeViralGamingContent(game);
console.log(`Step 1: ${reddit.length} Reddit topics + ${content.tiktokTop.length + content.youtubeTop.length} viral videos analyzed`);
// 2. Generate scripts
const scripts = await generateGamingScripts(content, game, videoCount);
console.log(`Step 2: ${videoCount} scripts generated`);
// 3. Monetization analysis
const money = await analyzeMonetization(game, content);
console.log(`Step 3: Revenue potential $${money.monthlyPotential["1_video_per_day"]}/month`);
// 4. Export report
const report = {
game,
generatedAt: new Date().toISOString(),
trendingTopics: reddit.slice(0, 15),
viralContent: content,
scripts,
monetization: money,
contentCalendar: Array.from({ length: 30 }, (_, i) => ({
day: i + 1,
topic: reddit[i % reddit.length]?.title || `${game} content day ${i + 1}`,
format: content.winningFormats[i % content.winningFormats.length]?.format || 'Hot Take',
platform: ['tiktok', 'youtube_shorts', 'instagram_reels'][i % 3]
}))
};
writeFileSync(`gaming-content-${game.replace(/\s+/g, '-')}-${Date.now()}.json`, JSON.stringify(report, null, 2));
console.log(`Pipeline complete`);
return report;
}
await fullGamingContentPipeline("GTA 6", 5);
| Feature | Generic Content Tool | This Skill |
|---|---|---|
| Trend detection | Manual browsing | Reddit + TikTok + YouTube scraping in parallel |
| Content gaps | Guesswork | Data-driven: high demand topics with low supply |
| Script writing | Generic prompts | Based on real viral hooks from gaming content |
| Video production | Manual editing | AI-produced with gaming-optimized pacing |
| Monetization | None | CPM estimates + sponsorship angles + format ROI |
| Calendar | None | 30-day plan mapped to game releases |
| Action | Tool | Cost |
|---|---|---|
| Scrape 5 gaming subreddits | Apify | ~$0.08 |
| Scrape TikTok + YouTube gaming | Apify | ~$0.12 |
| Detect emerging games | Apify | ~$0.10 |
| Generate 5 scripts | Claude AI | ~$0.05 |
| Produce 5 videos | InVideo AI | Plan dependent |
| Full pipeline | Total | Under $1 for research + scripts |
try {
const run = await client.actor("apify/reddit-scraper").call(input);
const dataset = await run.dataset().getData();
return dataset.items;
} catch (error) {
if (error.statusCode === 401) throw new Error("Invalid Apify token. Get yours at https://www.apify.com?fpr=dx06p");
if (error.statusCode === 429) throw new Error("Rate limit. Reduce batch size.");
throw error;
}
apify-client and axios