Closure-RI commited on
Commit
75bb67c
·
verified ·
1 Parent(s): ca34264

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +48 -113
index.js CHANGED
@@ -991,136 +991,71 @@ app.post("/cobalt", async (req, res) => {
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
- 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('/faketw', async (req, res) => {
1101
- const inputData = {
1102
- body: req.query.body || 'This is a fake tweet body!',
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 generateFakeTweet(inputData);
1118
- res.setHeader('Content-Type', 'image/png');
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('Error generating fake tweet: ' + error.message);
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