Spaces:
Paused
Paused
Update index.js
Browse files
index.js
CHANGED
|
@@ -991,136 +991,71 @@ app.post("/cobalt", async (req, res) => {
|
|
| 991 |
|
| 992 |
|
| 993 |
|
| 994 |
-
async function
|
| 995 |
-
|
| 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 |
-
|
| 1021 |
-
|
| 1022 |
-
|
| 1023 |
-
|
| 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 |
-
|
| 1060 |
-
|
|
|
|
|
|
|
|
|
|
| 1061 |
|
| 1062 |
-
|
| 1063 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1064 |
|
| 1065 |
-
|
| 1066 |
-
|
| 1067 |
|
| 1068 |
-
|
| 1069 |
-
|
| 1070 |
-
|
| 1071 |
-
|
| 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 |
-
await delay(5000)
|
| 1083 |
-
|
| 1084 |
-
// Get the result image as base64
|
| 1085 |
-
const resultBase64 = await page.$eval('#__next > main > div.css-1a1quzv > div.css-rgogwv > div > div.css-1x69bgs > div.css-0 > div > div > img', (img) => {
|
| 1086 |
-
return img.src;
|
| 1087 |
-
});
|
| 1088 |
-
|
| 1089 |
-
|
| 1090 |
-
|
| 1091 |
-
// Close the browser
|
| 1092 |
-
await browser.close();
|
| 1093 |
-
|
| 1094 |
-
|
| 1095 |
-
return resultBase64; // Return the base64 string of the image
|
| 1096 |
}
|
| 1097 |
|
| 1098 |
|
| 1099 |
// Rute untuk menerima data melalui query string (GET)
|
| 1100 |
-
app.get('/
|
| 1101 |
-
|
| 1102 |
-
|
| 1103 |
-
profilePic: req.query.profilePic || 'https://raw.githubusercontent.com/LingMoen/COLAB/refs/heads/main/SKABIDI/SKADI_003.jpg',
|
| 1104 |
-
name: req.query.name || 'Skadi 🚽',
|
| 1105 |
-
username: req.query.username || '@Skabidi',
|
| 1106 |
-
optionalImage: req.query.optionalImage || 'https://raw.githubusercontent.com/LingMoen/COLAB/refs/heads/main/SKABIDI/SKADI_008.jpg',
|
| 1107 |
-
date: req.query.date || '2024-11-19T06:27',
|
| 1108 |
-
views: req.query.views || '1000',
|
| 1109 |
-
retweets: req.query.retweets || '200',
|
| 1110 |
-
quotes: req.query.quotes || '50',
|
| 1111 |
-
likes: req.query.likes || '1500',
|
| 1112 |
-
bookmarks: req.query.bookmarks || '500',
|
| 1113 |
-
theme: req.query.theme || 'r7' // Light theme
|
| 1114 |
-
};
|
| 1115 |
-
|
| 1116 |
try {
|
| 1117 |
-
const base64Result = await
|
| 1118 |
-
res.
|
| 1119 |
-
const imageData = base64Result.split(',')[1]; // Pisahkan data base64 dari headernya
|
| 1120 |
-
const buffer = Buffer.from(imageData, 'base64'); // Convert ke buffer
|
| 1121 |
-
res.send(buffer); // Mengirimkan buffer gambar sebagai respons
|
| 1122 |
} catch (error) {
|
| 1123 |
-
res.status(500).send(
|
| 1124 |
}
|
| 1125 |
});
|
| 1126 |
|
|
|
|
| 991 |
|
| 992 |
|
| 993 |
|
| 994 |
+
async function spankbang_search(keyword) {
|
| 995 |
+
const browser = await puppeteer.launch({
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 996 |
headless: true,
|
| 997 |
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
| 998 |
});
|
| 999 |
const page = await browser.newPage();
|
| 1000 |
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;]");
|
| 1001 |
|
| 1002 |
+
try {
|
| 1003 |
+
await page.goto(`https://id.spankbang.com/s/${keyword}`, {
|
| 1004 |
+
waitUntil: "domcontentloaded"
|
| 1005 |
+
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1006 |
|
| 1007 |
+
const ageCheckSelector = "#age_check_yes";
|
| 1008 |
+
if (await page.$(ageCheckSelector)) {
|
| 1009 |
+
await page.click(ageCheckSelector);
|
| 1010 |
+
await page.waitForNavigation({ waitUntil: "domcontentloaded" });
|
| 1011 |
+
}
|
| 1012 |
|
| 1013 |
+
const scrapedData = await page.evaluate(() => {
|
| 1014 |
+
const elements = document.querySelectorAll("#search_v2 > div.results.results_search > div:nth-child(1) > div > div");
|
| 1015 |
+
const data = [];
|
| 1016 |
+
|
| 1017 |
+
elements.forEach((element) => {
|
| 1018 |
+
data.push({
|
| 1019 |
+
title: element.querySelector("a")?.getAttribute("title")?.trim() ||
|
| 1020 |
+
element.querySelector("div > div.name-and-menu-wrapper > p > a")?.innerText.trim() ||
|
| 1021 |
+
"N/A",
|
| 1022 |
+
metadata: {
|
| 1023 |
+
hd: element.querySelector("a > span.video-badge.h")?.innerText.trim() || "Un HD",
|
| 1024 |
+
duration: element.querySelector("a > span.video-badge.l")?.innerText.trim() || "0m",
|
| 1025 |
+
views: element.querySelector("div > div.uploader-and-stats-wrapper > div > span.v")?.innerText.trim() || "0",
|
| 1026 |
+
likesPercentage: element.querySelector("div > div.uploader-and-stats-wrapper > div > span.r")?.innerText.trim() || "0%",
|
| 1027 |
+
date: element.querySelector("div > div.uploader-and-stats-wrapper > div > span.d")?.innerText.trim() || "0 years"
|
| 1028 |
+
},
|
| 1029 |
+
link: element.querySelector("a")?.href || "N/A",
|
| 1030 |
+
img: element.querySelector("a > picture > img")?.src || "N/A",
|
| 1031 |
+
img_data: element.querySelector("a > picture > img")?.getAttribute("data-src") || "N/A",
|
| 1032 |
+
preview: element.querySelector("a > picture > img")?.getAttribute("data-preview") || "N/A"
|
| 1033 |
+
});
|
| 1034 |
+
});
|
| 1035 |
+
|
| 1036 |
+
return data;
|
| 1037 |
+
});
|
| 1038 |
|
| 1039 |
+
await browser.close();
|
| 1040 |
+
return scrapedData;
|
| 1041 |
|
| 1042 |
+
} catch (error) {
|
| 1043 |
+
console.error("Error during scraping:", error.message);
|
| 1044 |
+
await browser.close();
|
| 1045 |
+
return [];
|
|
|
|
| 1046 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1047 |
}
|
| 1048 |
|
| 1049 |
|
| 1050 |
// Rute untuk menerima data melalui query string (GET)
|
| 1051 |
+
app.get('/spankbang/search', async (req, res) => {
|
| 1052 |
+
const { query } = req.query;
|
| 1053 |
+
if (!query) return res.status(400).json({ error: 'Parameter query is required' });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1054 |
try {
|
| 1055 |
+
const base64Result = await spankbang_search(query);
|
| 1056 |
+
res.json(base64Result); // Mengirimkan buffer gambar sebagai respons
|
|
|
|
|
|
|
|
|
|
| 1057 |
} catch (error) {
|
| 1058 |
+
res.status(500).send(error);
|
| 1059 |
}
|
| 1060 |
});
|
| 1061 |
|