84 lines
3.1 KiB
JavaScript
84 lines
3.1 KiB
JavaScript
|
// import required modules (npm install axios)
|
||
|
const fs = require('fs');
|
||
|
const axios = require('axios');
|
||
|
const path = require('path');
|
||
|
|
||
|
// set variables such as API and where the html file is stored
|
||
|
const API_KEY = 'YOUR_YOUTUBE_DATA_API_KEY'; // Replace with your actual YouTube Data API key
|
||
|
const htmlFilePath = path.join('/var/www/html', 'index.html'); // Set the file path to /var/www/html/index.html (or any other path you want, directory path and file name must be seperate in brackets)
|
||
|
|
||
|
|
||
|
// inital math by "SpiritAxolotl" on GitHub (https://github.com/SpiritAxolotl)
|
||
|
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTVWXYZ0123456789-_".split("");
|
||
|
const randomChar = () => {
|
||
|
return chars[Math.floor(Math.random() * chars.length)];
|
||
|
};
|
||
|
const xRandomChars = (n) => {
|
||
|
let out = "";
|
||
|
for (let i = 0; i < n; i++)
|
||
|
out += randomChar();
|
||
|
return out;
|
||
|
};
|
||
|
|
||
|
// Create URL from above math, post it to YouTube API using a GET request and check if the video is public and embeddable.
|
||
|
const checkUrl = async (videoId) => {
|
||
|
const url = `https://www.googleapis.com/youtube/v3/videos?id=${videoId}&key=${API_KEY}&part=status`;
|
||
|
try {
|
||
|
const response = await axios.get(url);
|
||
|
if (response.data.items && response.data.items.length > 0) {
|
||
|
const videoStatus = response.data.items[0].status;
|
||
|
// Check if the video is public and embeddable
|
||
|
if (videoStatus.embeddable && videoStatus.privacyStatus === 'public') {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
// If the bot is rate limited, produce an error message and wait for a while, otherwise continue
|
||
|
} catch (error) {
|
||
|
console.error('Error checking video ID:', error.message);
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
// print message in console listing each URL generated and if it is valid or not for debugging purposes.
|
||
|
const generateAndCheckUrl = async () => {
|
||
|
while (true) {
|
||
|
const videoId = xRandomChars(11);
|
||
|
const url = `https://youtu.be/${videoId}`;
|
||
|
const isValid = await checkUrl(videoId);
|
||
|
if (isValid) {
|
||
|
console.log(`Valid URL: ${url}`);
|
||
|
appendToHtmlFile(url);
|
||
|
} else {
|
||
|
console.log(`Invalid URL: ${url}`);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
// print message in console if the URL is appended to the HTML file or if an error occurs for debugging purposes.
|
||
|
const appendToHtmlFile = (url) => {
|
||
|
const linkHtml = `<a href="${url}" target="_blank">${url}</a><br>\n`;
|
||
|
fs.appendFile(htmlFilePath, linkHtml, (err) => {
|
||
|
if (err) {
|
||
|
console.error('Error writing to HTML file:', err);
|
||
|
} else {
|
||
|
console.log('URL appended to HTML file:', url);
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Initialize HTML file with basic structure and a header
|
||
|
fs.writeFile(htmlFilePath, '<!DOCTYPE html><html><head><title>Valid YouTube URLs</title></head><body>\n<h1>Valid Public YouTube URLs</h1>\n<p>for any concerns, contact rei@reiyua.lol\n<p>Valid URLs will be listed below:</p>\n', (err) => {
|
||
|
if (err) {
|
||
|
console.error('Error initializing HTML file:', err);
|
||
|
} else {
|
||
|
generateAndCheckUrl();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Ensure HTML file is properly closed with a </body> and </html> on process exit
|
||
|
process.on('exit', () => {
|
||
|
fs.appendFileSync(htmlFilePath, '</body></html>');
|
||
|
});
|
||
|
|
||
|
process.on('SIGINT', () => {
|
||
|
process.exit();
|
||
|
});
|