@kelvdra/scraper
Version:
A simple scraper by kelvdra.
218 lines (195 loc) • 6.78 kB
JavaScript
const axios = require('axios');
const cheerio = require('cheerio');
async function githubStalk(user) {
try {
const { data } = await axios.get(`https://api.github.com/users/${user}`);
const hasil = {
username: data.login,
name: data.name,
bio: data.bio,
id: data.id,
nodeId: data.node_id,
profile_pic: data.avatar_url,
html_url: data.html_url,
type: data.type,
admin: data.site_admin,
company: data.company,
blog: data.blog,
location: data.location,
email: data.email,
public_repo: data.public_repos,
public_gists: data.public_gists,
followers: data.followers,
following: data.following,
created_at: data.created_at,
updated_at: data.updated_at
};
return {
status: true,
creator: '@kelvdra/scraper',
results: hasil
};
} catch (err) {
return {
status: false,
message: err.response?.data?.message || 'Pengguna tidak ditemukan atau terjadi kesalahan.'
};
}
}
async function tiktokStalk(username) {
try {
const response = await axios.get(`https://www.tiktok.com/@${username}?_t=ZS-8tHANz7ieoS&_r=1`, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
},
});
const html = response.data;
const $ = cheerio.load(html);
const scriptData = $('#__UNIVERSAL_DATA_FOR_REHYDRATION__').html();
const parsedData = JSON.parse(scriptData);
const userDetail = parsedData.__DEFAULT_SCOPE__?.['webapp.user-detail'];
if (!userDetail) {
return {
status: false,
message: 'User tidak ditemukan atau data tidak tersedia.'
};
}
const userInfo = userDetail.userInfo?.user;
const stats = userDetail.userInfo?.stats;
const hasil = {
id: userInfo?.id || null,
username: userInfo?.uniqueId || null,
nama: userInfo?.nickname || null,
avatar: userInfo?.avatarLarger || null,
bio: userInfo?.signature || null,
region: userInfo?.region || 'Tidak diketahui',
verifikasi: userInfo?.verified || false,
totalfollowers: stats?.followerCount || 0,
totalmengikuti: stats?.followingCount || 0,
totaldisukai: stats?.heart || 0,
totalvideo: stats?.videoCount || 0,
totalteman: stats?.friendCount || 0
};
return {
status: true,
creator: '@kelvdra/scraper',
results: hasil
};
} catch (error) {
return {
status: false,
message: error.message || 'Terjadi kesalahan saat mengambil data.'
};
}
}
async function ytStalk(username) {
try {
const { data } = await axios.get(`https://youtube.com/@${username}`);
const $ = cheerio.load(data);
const script = $('script').filter((i, el) => $(el).html().includes('var ytInitialData =')).html();
const jsonData = script.match(/var ytInitialData = (.*?);/);
if (!jsonData || !jsonData[1]) return { status: false, message: "Data tidak ditemukan" };
const parsed = JSON.parse(jsonData[1]);
const tabs = parsed.contents.twoColumnBrowseResultsRenderer.tabs;
const videos = [];
tabs?.[0]?.tabRenderer?.content?.sectionListRenderer?.contents?.forEach(item => {
item.itemSectionRenderer?.contents?.forEach(content => {
const items = content?.shelfRenderer?.content?.horizontalListRenderer?.items || [];
items.forEach(v => {
const vid = v.gridVideoRenderer;
if (vid) {
videos.push({
title: vid.title.simpleText,
published: vid.publishedTimeText?.simpleText,
views: vid.viewCountText?.simpleText,
duration: vid.thumbnailOverlays?.find(o => o.thumbnailOverlayTimeStatusRenderer)?.thumbnailOverlayTimeStatusRenderer?.text?.simpleText,
url: `https://youtube.com/watch?v=${vid.videoId}`,
thumbnail: vid.thumbnail.thumbnails[0].url
});
}
});
});
});
const header = parsed.header?.pageHeaderRenderer;
const meta = parsed.metadata?.channelMetadataRenderer;
return {
status: true,
creator: "@kelvdra/scraper",
username: header?.content?.pageHeaderViewModel?.metadata?.contentMetadataViewModel?.metadataRows?.[0]?.metadataParts?.[0]?.text?.content,
subscribers: header?.content?.pageHeaderViewModel?.metadata?.contentMetadataViewModel?.metadataRows?.[1]?.metadataParts?.[0]?.text?.content,
videos: videos.slice(0, 5),
avatar: header?.content?.pageHeaderViewModel?.image?.decoratedAvatarViewModel?.avatar?.avatarViewModel?.image?.sources?.[0]?.url,
description: meta?.description,
channelUrl: meta?.channelUrl
};
} catch (e) {
return {
status: false,
message: e.message
};
}
}
async function genshinStalk(uid) {
try {
const res = await axios.get(`https://fastrestapis.fasturl.cloud/stalk/genshin/advanced?uid=${uid}`);
return {
status: true,
creator: "@kelvdra/scraper",
results: res.data.result
};
} catch (e) {
return {
status: false,
message: e.message
};
}
}
async function igStalk(user) {
try {
const response = await axios.post(
"https://privatephotoviewer.com/wp-json/instagram-viewer/v1/fetch-profile",
{
find: user,
},
{
headers: {
"Content-Type": "application/json",
Accept: "*/*",
"X-Requested-With": "XMLHttpRequest",
},
}
);
const $ = cheerio.load(response.data.html);
const profilePicture = $("#profile-insta img").attr("src");
const nickname = $(".col-md-8 h4").text().trim();
const username = $(".col-md-8 h5").text().trim();
const posts = $(".col-md-8 .text-center").eq(0).find("strong").text().trim();
const followers = $(".col-md-8 .text-center").eq(1).find("strong").text().trim();
const following = $(".col-md-8 .text-center").eq(2).find("strong").text().trim();
const bio = $(".col-md-8 p").html()?.replace(/<br\s*\/?>/g, "\n").trim();
const hasil = {
profilePicture,
nickname,
username,
posts,
followers,
following,
bio,
};
return {
status: true,
creator: "@kelvdra/scraper",
results: hasil,
};
} catch (e) {
console.error("Error in igStalk:", e.message);
throw e;
}
}
module.exports = {
githubStalk,
tiktokStalk,
ytStalk,
genshinStalk,
igStalk
}