const axios = require('axios'); const cheerio = require('cheerio'); class ATL { parse_img = function (url) { const urlObj = new URL(url); const params = new URLSearchParams(urlObj.search); return params.get('url'); } hpage = async function () { try { const { data } = await axios.get('https://asiantolick.com/'); const $ = cheerio.load(data); const result = []; $('div#container a.miniatura').each((_, rynn) => { const title = $(rynn).find('span.titulo_video').text().trim(); const total_images = $(rynn).find('div.contar_imagens').text().trim(); const cover = $(rynn).find('img').attr('data-src'); const url = $(rynn).attr('href'); if (title && cover && url) { result.push({ title, total_images, cover: this.parse_img(cover), url }); } }); return result; } catch (error) { throw new Error(error.message); } } search = async function (query) { try { if (!query) throw new Error('Query is required'); const { data } = await axios.get(`https://asiantolick.com/search/${query}`); const $ = cheerio.load(data); const result = []; $('div#container a.miniatura').each((_, rynn) => { const title = $(rynn).find('span.titulo_video').text().trim(); const total_images = $(rynn).find('div.contar_imagens').text().trim(); const cover = $(rynn).find('img').attr('data-src'); const url = $(rynn).attr('href'); if (title && cover && url) { result.push({ title, total_images, cover: this.parse_img(cover), url }); } }); return result; } catch (error) { throw new Error(error.message); } } detail = async function (url) { try { if (!url.includes('asiantolick.com')) throw new Error('Invalid url'); const { data } = await axios.get(url); const $ = cheerio.load(data); const post = $('#post_content article'); const title = post.find('h1').text().trim() || null; const thumbs_up = post.find('#postlike_content #postlike_count').text().trim() || null; const upload_date = post.find('#metadata_qrcode span').eq(1).text().split(':')[1].trim() || null; const total_pics = post.find('#metadata_qrcode span').eq(2).text().split(':')[1].trim() || null; const pic_size = post.find('#metadata_qrcode span').eq(3).text().split(':')[1].trim() || null; const album_size = post.find('#metadata_qrcode span').eq(4).text().split(':')[1].trim() || null; const category = post.find('#categoria_tags_post a[href*="category"]').text().trim() || null; const download_url = post.find('a#download_post').attr('href'); const tags = []; post.find('#categoria_tags_post a[href*="tag"]').each((_, rynn) => { tags.push($(rynn).text().trim()); }); const pics = []; post.find('.spotlight-group div').each((_, rynn) => { const img = $(rynn).find('img').attr('src'); if (img) pics.push(this.parse_img(img)); }); return { title, thumbs_up, upload_date, total_pics, pic_size, album_size, category, tags, pics, download_url }; } catch (error) { throw new Error(error.message); } } } // Usage: const atl = new ATL(); const resp = await atl.detail('https://asiantolick.com/post-1685/school-girl-in-short-skirt-71p'); console.log(resp);