Spaces:
Paused
Paused
Update index.js
Browse files
index.js
CHANGED
|
@@ -34,6 +34,8 @@ const { exec } = require('child_process');
|
|
| 34 |
const writeFileAsync = promisify(fs.writeFile);
|
| 35 |
const execPromise = promisify(exec);
|
| 36 |
const youtube = google.youtube({ version: 'v3', auth: 'AIzaSyBPkpdJEGtAHebbaP3_CcA1_urfMFfeLLg' });
|
|
|
|
|
|
|
| 37 |
|
| 38 |
|
| 39 |
|
|
@@ -986,6 +988,143 @@ app.post("/cobalt", async (req, res) => {
|
|
| 986 |
ββββββββββββββββββββββββββββββ
|
| 987 |
*********************/
|
| 988 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 989 |
// Fungsi untuk ping website
|
| 990 |
async function pingWebsite() {
|
| 991 |
const browser = await puppeteer.launch({
|
|
|
|
| 34 |
const writeFileAsync = promisify(fs.writeFile);
|
| 35 |
const execPromise = promisify(exec);
|
| 36 |
const youtube = google.youtube({ version: 'v3', auth: 'AIzaSyBPkpdJEGtAHebbaP3_CcA1_urfMFfeLLg' });
|
| 37 |
+
const bodyParser = require('body-parser');
|
| 38 |
+
app.use(bodyParser.json());
|
| 39 |
|
| 40 |
|
| 41 |
|
|
|
|
| 988 |
ββββββββββββββββββββββββββββββ
|
| 989 |
*********************/
|
| 990 |
|
| 991 |
+
|
| 992 |
+
|
| 993 |
+
|
| 994 |
+
async function downloadImageTw(url) {
|
| 995 |
+
const randomFilename = generateRandomName(10) + '.png';
|
| 996 |
+
const tmpFilePath = path.join(tempDir, randomFilename);
|
| 997 |
+
const writer = fs.createWriteStream(tmpFilePath);
|
| 998 |
+
const response = await axios({
|
| 999 |
+
url,
|
| 1000 |
+
method: 'GET',
|
| 1001 |
+
responseType: 'stream',
|
| 1002 |
+
});
|
| 1003 |
+
response.data.pipe(writer);
|
| 1004 |
+
return new Promise((resolve, reject) => {
|
| 1005 |
+
writer.on('finish', () => resolve(tmpFilePath));
|
| 1006 |
+
writer.on('error', reject);
|
| 1007 |
+
});
|
| 1008 |
+
}
|
| 1009 |
+
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
| 1010 |
+
|
| 1011 |
+
|
| 1012 |
+
async function generateFakeTweet(inputData) {
|
| 1013 |
+
const browser = await puppeteer.launch({
|
| 1014 |
+
headless: true,
|
| 1015 |
+
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
| 1016 |
+
});
|
| 1017 |
+
const page = await browser.newPage();
|
| 1018 |
+
await page.setUserAgent("Mozilla/5.0 (Linux; Android 10; SM-G965U Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.141 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/420.0.0.32.61;]");
|
| 1019 |
+
|
| 1020 |
+
// Navigate to the target website
|
| 1021 |
+
await page.goto('https://tweethunter.io/fake-tweet-generator', { waitUntil: 'domcontentloaded' });
|
| 1022 |
+
|
| 1023 |
+
// Input tweet body
|
| 1024 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.css-79elbk > div > textarea', inputData.body);
|
| 1025 |
+
|
| 1026 |
+
// Upload profile picture (example, replace with your file path)
|
| 1027 |
+
const profilePicInput = await page.$('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.css-k008qs > div.css-x7nhqj > input[type=file]');
|
| 1028 |
+
if (inputData.profilePic) {
|
| 1029 |
+
let pp = await downloadImageTw(inputData.profilePic)
|
| 1030 |
+
await profilePicInput.uploadFile(pp);
|
| 1031 |
+
await delay(3000);
|
| 1032 |
+
await fs.unlinkSync(pp);
|
| 1033 |
+
}
|
| 1034 |
+
|
| 1035 |
+
// Input name
|
| 1036 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.css-k008qs > div.css-6vtjga > div.chakra-editable.css-9bb4dk > div.css-126r5rm > input', inputData.name);
|
| 1037 |
+
|
| 1038 |
+
// Input username
|
| 1039 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.css-k008qs > div.css-6vtjga > div.chakra-editable.css-94sw6d > div.css-t5wett > input', inputData.username);
|
| 1040 |
+
|
| 1041 |
+
// Upload optional image (replace with file path)
|
| 1042 |
+
const optionalImageInput = await page.$('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.css-13jo6jh > input[type=file]');
|
| 1043 |
+
if (inputData.optionalImage) {
|
| 1044 |
+
let opsi = await downloadImageTw(inputData.optionalImage)
|
| 1045 |
+
await optionalImageInput.uploadFile(opsi);
|
| 1046 |
+
await delay(3000)
|
| 1047 |
+
await fs.unlinkSync(opsi)
|
| 1048 |
+
}
|
| 1049 |
+
|
| 1050 |
+
// Input date
|
| 1051 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.css-154a0dp > div.chakra-editable.css-1r4ohtm > div > input', inputData.date);
|
| 1052 |
+
|
| 1053 |
+
// Input views
|
| 1054 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.css-154a0dp > div.css-100478 > div > div > input', inputData.views);
|
| 1055 |
+
|
| 1056 |
+
// Input retweets
|
| 1057 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.chakra-wrap.css-8ywm5v > ul > div:nth-child(1) > div > input', inputData.retweets);
|
| 1058 |
+
|
| 1059 |
+
// Input quotes
|
| 1060 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.chakra-wrap.css-8ywm5v > ul > div:nth-child(2) > div > input', inputData.quotes);
|
| 1061 |
+
|
| 1062 |
+
// Input likes
|
| 1063 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.chakra-wrap.css-8ywm5v > ul > div:nth-child(3) > div > input', inputData.likes);
|
| 1064 |
+
|
| 1065 |
+
// Input bookmarks
|
| 1066 |
+
await page.type('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-1c0llw > div > div > div.chakra-wrap.css-8ywm5v > ul > div:nth-child(4) > div > input', inputData.bookmarks);
|
| 1067 |
+
|
| 1068 |
+
// Deselect SVG centang (for checkbox)
|
| 1069 |
+
await page.evaluate(() => {
|
| 1070 |
+
const centang = document.querySelector('#menu-button-\\:ro\\: > svg');
|
| 1071 |
+
if (centang) {
|
| 1072 |
+
centang.remove();
|
| 1073 |
+
}
|
| 1074 |
+
});
|
| 1075 |
+
|
| 1076 |
+
// Select theme (e.g., Light)
|
| 1077 |
+
await page.click(`#radio-\\:${inputData.theme}\\:`); // Dynamic theme selection
|
| 1078 |
+
|
| 1079 |
+
// Wait for the result image to appear
|
| 1080 |
+
await page.waitForSelector('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-0 > div > div > img');
|
| 1081 |
+
|
| 1082 |
+
// Get the result image as base64
|
| 1083 |
+
const resultBase64 = await page.$eval('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-0 > div > div > img', (img) => {
|
| 1084 |
+
return img.src;
|
| 1085 |
+
});
|
| 1086 |
+
|
| 1087 |
+
|
| 1088 |
+
|
| 1089 |
+
// Close the browser
|
| 1090 |
+
await browser.close();
|
| 1091 |
+
|
| 1092 |
+
|
| 1093 |
+
return resultBase64; // Return the base64 string of the image
|
| 1094 |
+
}
|
| 1095 |
+
|
| 1096 |
+
|
| 1097 |
+
// Rute untuk menerima data melalui query string (GET)
|
| 1098 |
+
app.get('/faketw', async (req, res) => {
|
| 1099 |
+
const inputData = {
|
| 1100 |
+
body: req.query.body || 'This is a fake tweet body!',
|
| 1101 |
+
profilePic: req.query.profilePic || 'https://raw.githubusercontent.com/LingMoen/COLAB/refs/heads/main/SKABIDI/SKADI_003.jpg',
|
| 1102 |
+
name: req.query.name || 'Skadi π½',
|
| 1103 |
+
username: req.query.username || '@Skabidi',
|
| 1104 |
+
optionalImage: req.query.optionalImage || 'https://raw.githubusercontent.com/LingMoen/COLAB/refs/heads/main/SKABIDI/SKADI_008.jpg',
|
| 1105 |
+
date: req.query.date || '2024-11-19T06:27',
|
| 1106 |
+
views: req.query.views || '1000',
|
| 1107 |
+
retweets: req.query.retweets || '200',
|
| 1108 |
+
quotes: req.query.quotes || '50',
|
| 1109 |
+
likes: req.query.likes || '1500',
|
| 1110 |
+
bookmarks: req.query.bookmarks || '500',
|
| 1111 |
+
theme: req.query.theme || 'r7' // Light theme
|
| 1112 |
+
};
|
| 1113 |
+
|
| 1114 |
+
try {
|
| 1115 |
+
const base64Result = await generateFakeTweet(inputData);
|
| 1116 |
+
res.setHeader('Content-Type', 'image/png');
|
| 1117 |
+
const imageData = base64Result.split(',')[1]; // Pisahkan data base64 dari headernya
|
| 1118 |
+
const buffer = Buffer.from(imageData, 'base64'); // Convert ke buffer
|
| 1119 |
+
res.send(buffer); // Mengirimkan buffer gambar sebagai respons
|
| 1120 |
+
} catch (error) {
|
| 1121 |
+
res.status(500).send('Error generating fake tweet: ' + error.message);
|
| 1122 |
+
}
|
| 1123 |
+
});
|
| 1124 |
+
|
| 1125 |
+
|
| 1126 |
+
|
| 1127 |
+
/*******************************/
|
| 1128 |
// Fungsi untuk ping website
|
| 1129 |
async function pingWebsite() {
|
| 1130 |
const browser = await puppeteer.launch({
|