
Isla Chan - Sharing
June 12, 2025 at 11:23 PM
/* *[ Fitur Douyin ]*
Search - Down
Type case
Janlup foll 🐥 https://whatsapp.com/channel/0029VadfVP5ElagswfEltW0L
*/
case 'douyin': {
const axios = require('axios');
const cheerio = require('cheerio');
const qs = require('qs');
const vm = require('vm');
const [subcmd, ...args] = text.split(' ');
const query = args.join(' ').trim();
if (!subcmd) return m.reply(`Gunakan format:\n> *douyin search *\n> *douyin down *`);
if (subcmd.toLowerCase() === 'search') {
if (!query) return m.reply('Masukkan kata kunci pencarian!\nContoh: douyin search fifty fifty');
const DouyinSearchPage = class {
constructor() {
this.baseURL = 'https://so.douyin.com/';
this.defaultParams = {
search_entrance: 'aweme',
enter_method: 'normal_search',
innerWidth: '431',
innerHeight: '814',
reloadNavStart: String(Date.now()),
is_no_width_reload: '1',
keyword: '',
};
this.cookies = {};
this.api = axios.create({
baseURL: this.baseURL,
headers: {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
'accept-language': 'id-ID,id;q=0.9',
'referer': 'https://so.douyin.com/',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36',
}
});
this.api.interceptors.response.use(res => {
const setCookies = res.headers['set-cookie'];
if (setCookies) {
setCookies.forEach(c => {
const [name, value] = c.split(';')[0].split('=');
if (name && value) this.cookies[name] = value;
});
}
return res;
});
this.api.interceptors.request.use(config => {
if (Object.keys(this.cookies).length) {
config.headers['Cookie'] = Object.entries(this.cookies).map(([k, v]) => `${k}=${v}`).join('; ');
}
return config;
});
}
async initialize() {
try {
await this.api.get('/');
return true;
} catch {
return false;
}
}
async search({ query }) {
await this.initialize();
const params = { ...this.defaultParams, keyword: query, reloadNavStart: String(Date.now()) };
const res = await this.api.get('s', { params });
const $ = cheerio.load(res.data);
let scriptWithData = '';
$('script').each((_, el) => {
const text = $(el).html();
if (text.includes('let data =') && text.includes('"business_data":')) {
scriptWithData = text;
}
});
const match = scriptWithData.match(/let\s+data\s*=\s*(\{[\s\S]+?\});/);
if (!match) throw 'Data tidak ditemukan di halaman.';
const dataCode = `data = ${match[1]}`;
const sandbox = {};
vm.createContext(sandbox);
vm.runInContext(dataCode, sandbox);
const awemeInfos = sandbox.data?.business_data
?.map(entry => entry?.data?.aweme_info)
.filter(Boolean);
return awemeInfos;
}
};
try {
const douyin = new DouyinSearchPage();
const results = await douyin.search({ query });
if (!results.length) return m.reply('Tidak ditemukan hasil.');
const message = results.slice(0, 5).map((v, i) => {
return `*${i + 1}.* ${v.desc || 'Tanpa deskripsi'}\n👤: ${v.author?.nickname}\n❤️: ${v.statistics?.digg_count} | 💬: ${v.statistics?.comment_count}\n🔗: https://www.douyin.com/video/${v.aweme_id}`;
}).join('\n\n');
m.reply(message);
} catch (err) {
console.error(err);
m.reply('❌ Gagal mengambil hasil pencarian Douyin.');
}
return;
}
if (subcmd.toLowerCase() === 'down') {
if (!query.startsWith('http')) return m.reply('Masukkan URL Douyin!\nContoh: douyin down https://v.douyin.com/iPX4EBFY/');
async function douyinDownload(url) {
const postData = qs.stringify({
q: url,
lang: 'id',
cftoken: ''
});
const response = await axios.post(
'https://tikvideo.app/api/ajaxSearch',
postData,
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': '*/*',
'X-Requested-With': 'XMLHttpRequest'
}
}
);
if (response.data.status !== 'ok') throw new Error('Gagal mendapatkan data video.');
const html = response.data.data;
const $ = cheerio.load(html);
const results = [];
$('.tik-video').each((i, elem) => {
const title = $(elem).find('.thumbnail .content h3').text().trim();
const duration = $(elem).find('.thumbnail .content p').first().text().trim();
const thumbnail = $(elem).find('.thumbnail img').attr('src');
const downloadLinks = [];
$(elem).find('.dl-action a').each((j, link) => {
downloadLinks.push({
title: $(link).text().trim(),
url: $(link).attr('href')
});
});
results.push({ title, duration, thumbnail, downloadLinks });
});
return results;
}
try {
const results = await douyinDownload(query);
if (!results.length) return m.reply('Video tidak ditemukan atau tidak bisa diambil.');
const video = results[0];
let caption = `*🎬 Judul:* ${video.title}\n*⏱ Durasi:* ${video.duration}\n\n`;
caption += '*🔗 Link Download:*\n';
for (const dl of video.downloadLinks) {
caption += `- ${dl.title}: ${dl.url}\n`;
}
const videoLink = video.downloadLinks.find(dl => /mp4/i.test(dl.title));
const musicLink = video.downloadLinks.find(dl => /mp3/i.test(dl.title));
if (videoLink) {
await conn.sendMessage(m.chat, {
video: { url: videoLink.url },
caption: caption
}, { quoted: m });
} else {
await conn.sendMessage(m.chat, {
image: { url: video.thumbnail },
caption: caption
}, { quoted: m });
}
if (musicLink) {
await conn.sendMessage(m.chat, {
audio: { url: musicLink.url },
mimetype: 'audio/mpeg',
fileName: `${video.title}.mp3`
}, { quoted: m });
}
} catch (err) {
console.error(err);
m.reply('❌ Gagal mengambil data Douyin.');
}
return;
}
m.reply(`Subcommand tidak valid!\nGunakan:\n- *douyin search *\n- *douyin down *`);
}
break