src/Komiku.js
async function JHKomiku(mode, input) {
const axios = (await import('axios')).default;
const cheerio = await import('cheerio');
/*
- HARGAI WOY JANGAN DIHAPUS!
- Skrep by *JH a.k.a DHIKA - FIONY BOT*
- Credits to all Fiony's Bot Admin.
- Maaf kalo kurang maksimal atau berantakan
- Hasil gabut saja xixixi.
*/
const jantung = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Origin': 'https://komiku.org',
'Referer': 'https://komiku.org/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
};
const baseRes = {
author_skrep: 'JH a.k.a Dhika',
kesayangan: 'Fiony Alveria♡',
mode
};
try {
if (mode === 'search') {
const { data } = await axios.get(`https://api.komiku.org/?post_type=manga&s=${encodeURIComponent(input)}`, { headers: jantung });
const $ = cheerio.load(data);
const results = $('.bge').map((_, el) => {
const c = $(el);
const rawLink = c.find('a').first().attr('href') || '';
const thumb = c.find('.bgei img').attr('data-src') || c.find('.bgei img').attr('src') || '';
return {
title: c.find('.kan h3').text().trim(),
link: rawLink.startsWith('http') ? rawLink : `https://komiku.org${rawLink}`,
thumb: thumb.split('?resize=')[0],
type: c.find('.tpe1_inf b').text().trim() || 'Unknown',
latestChapter: c.find('.new1').first().text().trim().replace(/\s+/g, ' ') || '-',
desc: c.find('.kan p').text().trim() || '-'
};
}).get().filter(x => x.title && x.link);
return JSON.stringify({
...baseRes,
status: results.length > 0,
query: input,
total_results: results.length,
data: results.length > 0 ? results : 'Komik tidak ditemukan wak!'
}, null, 2);
}
if (mode === 'detail') {
const targetUrl = input.startsWith('http') ? input : `https://komiku.org/manga/${input.replace(/^\/|\/$/g, '')}/`;
const { data } = await axios.get(targetUrl, { headers: jantung });
const $ = cheerio.load(data);
const info = {};
const genres = [];
$('.inftable tr').each((_, el) => {
const key = $(el).find('td:nth-child(1)').text().replace(':', '').trim();
const valEl = $(el).find('td:nth-child(2)');
if (key.toLowerCase() === 'genre') valEl.find('a').each((_, a) => genres.push($(a).text().trim()));
else if (key) info[key] = valEl.text().trim();
});
const chapters = $('#Daftar_Chapter tbody tr').map((_, el) => {
const link = $(el).find('.judulseries a');
if (!link.length) return null;
const url = link.attr('href');
return {
title: link.find('span').text().trim() || link.text().trim(),
url: url.startsWith('http') ? url : `https://komiku.org${url}`,
date: $(el).find('.tanggalseries').text().trim()
};
}).get().filter(Boolean);
return JSON.stringify({
...baseRes,
status: true,
data: {
title: $('#Judul h1 span[itemprop="name"]').text().trim() || $('#Judul h1').text().replace(/Komik\s/i, '').trim(),
thumbnail: $('.ims img').attr('src') || '',
synopsis: $('.desc').text().trim() || $('#Sinopsis p').text().trim(),
info,
genres,
total_chapters: chapters.length,
chapters
}
}, null, 2);
}
} catch (e) {
return JSON.stringify({
...baseRes,
status: false,
error: e.message
}, null, 2);
}
}
return JHKomiku('detail', 'ISI_LINK_OR_SLUG'); // buat search ganti 'detail' ke 'search' dan input query contoh One Piece
Direct URL
Disalin!