const axios = require('axios'); class Twitter { constructor() { this.snap = axios.create({ baseURL: 'https://twittermedia.b-cdn.net', headers: { 'accept': '*/*', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7', 'origin': 'https://snaplytics.io', 'referer': 'https://snaplytics.io/', 'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36', } }); } download = async function (url) { try { if (!/^https?:\/\/(www\.)?(twitter\.com|x\.com)\/[a-zA-Z0-9_]+\/status\/\d+(\?.*)?$/.test(url)) throw new Error('Invalid twitter url'); const { data } = await this.snap.get(`/media`, { params: { link: url } }); return Object.fromEntries(Object.entries(data).filter(([key]) => !['cursor'].includes(key))); } catch (error) { console.error(error.message); throw new Error('No result found'); } } search = async function (query, type = 'tweet') { try { const _type = { profile: 'search', tweet: 'tweetsearch' }; if (!query) throw new Error('Query is required'); if (!_type[type]) throw new Error(`Available type: ${Object.keys(_type).join(', ')}`); const { data } = await this.snap.get('/viewer', { params: { data: query, type: _type[type] } }); return Object.fromEntries(Object.entries(data).filter(([key]) => !['cursor'].includes(key))); } catch (error) { console.error(error.message); throw new Error('No result found'); } } profile_info = async function (username) { try { if (!username) throw new Error('Username is required'); const { data } = await this.snap.get('/viewer', { params: { data: username, type: 'profile' } }); return Object.fromEntries(Object.entries(data).filter(([key]) => !['cursor'].includes(key))); } catch (error) { console.error(error.message); throw new Error('No result found'); } } } // Usage: const t = new Twitter(); const resp = await t.search('blue archive'); console.log(resp);