Back

Tiktok Stalk

62 views
reyzzz Code by: @reyzzz

Description

Sebuah script untuk melakukan Stalking terhadap akun Tiktok secara otomatis. Script ini dirancang untuk mengekstrak informasi akun yang memudahkan Stalking ke suatu akun. Script ini juga dirancang agar mudah di modifikasi serta mudah digunakan. Data yang akan didapatkan : - username - nickname - bio - apakah akun private atau tidak - waktu pembuatan akun - kapan terakhir kali nickname diubah - language - secUid - profile picture - like - followers - following - friend, dll. cara penggunaan : node tt-stalk.js misalnya saja : node tt-stalk.js puan_maharaniri Terimakasih telah menggunakan script ini, semoga bermanfaat. Bila ada kekurangan pada script atau bila ada salah kata saat saya mendeskripsikan script ini, mohon dimaafkan. Scrape by : Reyy ( SeBerryLW )

Features

Code (javascript)

tt-stalk.js
/* besok aja ( SeBerryLW ) */
/* url : tiktok.com */
/* toktok stalk */
/* cara mahu pakai :
node namafile.js puan_maharaniri
 */

const axios = require('axios');

const bentar_ngambil_dulu = async (input_le) => {
    const cukuruk = `${Math.floor(Math.random() * 255) + 1}.${Math.floor(Math.random() * 255) + 1}.${Math.floor(Math.random() * 255) + 1}.${Math.floor(Math.random() * 255) + 1}`;
    const prikitiww = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';

    try {
        const url = `https://www.tiktok.com/@${input_le}`;
        
        const headers = {
            'User-Agent': prikitiww,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'en-US,en;q=0.5',
            'Accept-Encoding': 'gzip, deflate, br',
            'DNT': '1',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
            'Sec-Fetch-Dest': 'document',
            'Sec-Fetch-Mode': 'navigate',
            'Sec-Fetch-Site': 'none',
            'Cache-Control': 'max-age=0',
            'X-Forwarded-For': cukuruk,
            'X-Real-IP': cukuruk,
        };

        console.log('Kejap...');
        const response = await axios.get(url, { 
            headers, 
            timeout: 10000
        });
        
        const html_content = response.data;
        
        if (!html_content) {
            console.log('struktur web toktok mungkin berubah');
            return null;
        }

        const universal_data_pattern = /<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__" type="application\/json">(.*?)<\/script>/s;
        const universal_match = html_content.match(universal_data_pattern);

        if (!universal_match) {
            console.log('data universal ga ketemu');
            return null;
        }

        try {
            const universal_data = JSON.parse(universal_match[1]);
            
            let user_info = {};
            
            if (universal_data.__DEFAULT_SCOPE__) {
                user_info = universal_data.__DEFAULT_SCOPE__['webapp.user-detail']?.userInfo || {};
            }
            
            if (!user_info || Object.keys(user_info).length === 0) {
                const default_scope = universal_data['__DEFAULT_SCOPE__'] || universal_data;
                for (const key in default_scope) {
                    if (key.includes('user') || key.includes('detail')) {
                        console.log('Key found:', key);
                        user_info = default_scope[key]?.userInfo || {};
                        if (Object.keys(user_info).length > 0) break;
                    }
                }
            }

            const user_data = user_info.user || {};
            const stats_data = user_info.stats || {};
            const stats_v2_data = user_info.statsV2 || {};

            if (Object.keys(user_data).length === 0) {
                console.log('waduh ga ketemu jirrr');
                return null;
            }

            let signature = user_data.signature?.trim() || "";
            if (!signature) {
                signature = "No bio yet";
            }

            const format_timestamp = (timestamp) => {
                if (!timestamp) return "Unknown";
                try {
                    const days = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"];
                    const dt = new Date(timestamp * 1000);
                    const day_name = days[dt.getDay()];
                    const formatted_date = `${dt.getDate().toString().padStart(2, '0')}-${(dt.getMonth() + 1).toString().padStart(2, '0')}-${dt.getFullYear()} ${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}`;
                    return `${timestamp} (${day_name}, ${formatted_date})`;
                } catch {
                    return String(timestamp);
                }
            };

            const ini_respon = {
                id: user_data.id,
                shortId: user_data.shortId,
                uniqueId: user_data.uniqueId,
                nickname: user_data.nickname,
                nickNameModifyTime: format_timestamp(user_data.nickNameModifyTime),
                signature: signature,
                createTime: format_timestamp(user_data.createTime),
                verified: user_data.verified,
                privateAccount: user_data.privateAccount,
                region: user_data.region,
                language: user_data.language,
                secUid: user_data.secUid,
                avatarLarger: user_data.avatarLarger,
                avatarMedium: user_data.avatarMedium,
                avatarThumb: user_data.avatarThumb,
                stats: {
                    followerCount: stats_data.followerCount,
                    followingCount: stats_data.followingCount,
                    heart: stats_data.heart,
                    heartCount: stats_data.heartCount,
                    videoCount: stats_data.videoCount,
                    diggCount: stats_data.diggCount,
                    friendCount: stats_data.friendCount
                },
                statsV2: {
                    followerCount: stats_v2_data.followerCount,
                    followingCount: stats_v2_data.followingCount,
                    heart: stats_v2_data.heart,
                    heartCount: stats_v2_data.heartCount,
                    videoCount: stats_v2_data.videoCount,
                    diggCount: stats_v2_data.diggCount,
                    friendCount: stats_v2_data.friendCount
                }
            };

            return ini_respon;
            
        } catch (error) {
            console.log('error parsing json :', error.message);
            return null;
        }
        
    } catch (error) {
        console.log('Error request:', error.message);
        return null;
    }
};

const main = async () => {
    const username = process.argv[2];
    
    if (!username) {
        console.log('usage : node namafile.js <username>');
        console.log('contoh : node namafile.js puan_maharaniri');
        return;
    }

    console.log(`Ngambil data : @${username}`);
    
    const result = await bentar_ngambil_dulu(username);
    
    if (result) {
        console.log('\n=== ini hasilnya ===');
        console.log(JSON.stringify(result, null, 2));
    } else {
        console.log('gagal, kenapa dah');
    }
};

main();