Ayogiakbar

Anime Lovers

Apr 30th, 2026 (edited)
117
0
Never
7
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * ANIME LOVERS
  3.  * Author : Gienetic
  4.  * Base   : https://play.google.com/store/apps/details?id=com.aniverseid.animelovers
  5.  * Note : Kaya nya dev apk nya orang indo (mungkin diantara kita :v), maaf ya bang , anggap aja sebagai pengujian apk nya
  6.  sekali lagi maaf ya puh
  7.  */
  8.  
  9.  
  10. const axios = require('axios');
  11. const crypto = require('crypto');
  12. const readline = require('readline');
  13. const fs = require('fs');
  14.  
  15. const API_URL = 'https://apps.animekita.org/api/v1.2.5';
  16.  
  17. // ==========================================
  18. // CORE ENGINE
  19. // ==========================================
  20.  
  21. const getHeaders = (isFlutter = false, isPost = false) => {
  22.     const headers = {
  23.         'accept': 'application/json',
  24.         'accept-encoding': 'gzip',
  25.         'host': 'apps.animekita.org',
  26.         'access-control-allow-origin': '*',
  27.         'user-agent': isFlutter ? 'Flutter/2.5.3' : 'Dart/3.9 (dart:io)'
  28.     };
  29.     if (isPost) headers['content-type'] = 'text/plain; charset=utf-8';
  30.     return headers;
  31. };
  32.  
  33. const loginGuest = async () => {
  34.     const uid = crypto.randomBytes(5).toString('hex');
  35.     const payload = { user: `Guest_${uid}`, email: `gienetic_${uid}@gmail.com`, profil: "https://lh3.googleusercontent.com/a/default" };
  36.     try {
  37.         const res = await axios.post(`${API_URL}/model/login.php`, JSON.stringify(payload), { headers: getHeaders(false, true) });
  38.         return res.data?.data?.[0]?.token || null;
  39.     } catch (err) { return null; }
  40. };
  41.  
  42. const getRekomendasi = async () => {
  43.     try {
  44.         const res = await axios.get(`${API_URL}/rekomendasi.php`, { headers: getHeaders() });
  45.         return res.data || [];
  46.     } catch (err) { return []; }
  47. };
  48.  
  49. const getOngoing = async (page = 1) => {
  50.     try {
  51.         const res = await axios.get(`${API_URL}/home/ongoing.php`, { headers: getHeaders(), params: { page, type: 'all' } });
  52.         return res.data || [];
  53.     } catch (err) { return []; }
  54. };
  55.  
  56. const getBaruUpload = async (page = 1) => {
  57.     try {
  58.         const res = await axios.get(`${API_URL}/baruupload.php`, { headers: getHeaders(), params: { page } });
  59.         return res.data || [];
  60.     } catch (err) { return []; }
  61. };
  62.  
  63. const getMovie = async (page = 1) => {
  64.     try {
  65.         const res = await axios.get(`${API_URL}/movie.php`, { headers: getHeaders(), params: { page } });
  66.         return res.data || [];
  67.     } catch (err) { return []; }
  68. };
  69.  
  70. // Fungsi Baru: Mendapatkan Jadwal Rilis Mingguan
  71. const getJadwal = async () => {
  72.     try {
  73.         // Method POST, tapi payload kosong sesuai capture
  74.         const res = await axios.post(`${API_URL}/jadwal.php`, "", { headers: getHeaders(false, true) });
  75.         return res.data?.data || [];
  76.     } catch (err) { return []; }
  77. };
  78.  
  79. const searchAnime = async (keyword, page = 1) => {
  80.     try {
  81.         const res = await axios.get(`${API_URL}/search.php`, { headers: getHeaders(), params: { keyword, page, per_page: 20 } });
  82.         return res.data?.data?.[0] || null;
  83.     } catch (err) { return null; }
  84. };
  85.  
  86. const getSeriesDetail = async (seriesSlug, token = "") => {
  87.     const payload = { get: "top", post_type: "1", post_id: seriesSlug, token };
  88.     try {
  89.         const res = await axios.post(`${API_URL}/series.php?url=${seriesSlug}`, JSON.stringify(payload), { headers: getHeaders(false, true) });
  90.         return res.data?.data?.[0] || null;
  91.     } catch (err) { return null; }
  92. };
  93.  
  94. const getStreamLinks = async (postId, seriesSlug, episode, token) => {
  95.     const payload = { post_type: "2", post_id: postId, series_id: seriesSlug, series_url: seriesSlug, episode: episode.toString(), token };
  96.     try {
  97.         const res = await axios.post(`${API_URL}/series/episode/data.php?url=${postId}`, JSON.stringify(payload), { headers: getHeaders(true, true) });
  98.         return res.data?.data?.[0]?.streams || null;
  99.     } catch (err) { return null; }
  100. };
  101.  
  102. module.exports = {
  103.     loginGuest,
  104.     getRekomendasi,
  105.     getOngoing,
  106.     getBaruUpload,
  107.     getMovie,
  108.     getJadwal,
  109.     searchAnime,
  110.     getSeriesDetail,
  111.     getStreamLinks
  112. };
  113.  
  114. // ==========================================
  115. // CLI ENGINE
  116. // ==========================================
  117.  
  118. if (require.main === module) {
  119.     const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
  120.     const ask = (q) => new Promise((resolve) => rl.question(`? ${q}`, resolve));
  121.    
  122.     let sessionToken = null;
  123.  
  124.     const saveAndPrintJSON = (filename, data) => {
  125.         const jsonString = JSON.stringify(data, null, 2);
  126.         console.log(`\n=== OUTPUT JSON ===\n${jsonString}\n===================`);
  127.         try {
  128.             fs.writeFileSync(filename, jsonString);
  129.             console.log(`[+] File tersimpan: ${filename}`);
  130.         } catch (e) {
  131.             console.log(`[-] Gagal menyimpan file: ${e.message}`);
  132.         }
  133.     };
  134.  
  135.     const delay = (ms) => new Promise(res => setTimeout(res, ms));
  136.  
  137.     const fetchSmart = async (fetchFn, typeName, ...args) => {
  138.         let allData = [];
  139.         let seenIds = new Set();
  140.         let page = 1;
  141.         let keepFetching = true;
  142.  
  143.         console.log(`\n[*] Mengekstrak data ${typeName}...`);
  144.        
  145.         while (keepFetching) {
  146.             process.stdout.write(`[~] Fetching page ${page}... `);
  147.             const data = await fetchFn(...args, page);
  148.            
  149.             let items = [];
  150.             let hasNextPage = true;
  151.  
  152.             if (data && data.result) {
  153.                 items = data.result;
  154.                 hasNextPage = data.pagination ? data.pagination.has_next : false;
  155.             } else if (Array.isArray(data)) {
  156.                 items = data;
  157.             } else {
  158.                 console.log('ERROR FORMAT');
  159.                 break;
  160.             }
  161.  
  162.             if (items.length === 0) {
  163.                 console.log('KOSONG (Mencapai batas akhir)');
  164.                 break;
  165.             }
  166.  
  167.             let newItemsCount = 0;
  168.             for (const item of items) {
  169.                 const uniqueKey = item.id || item.url;
  170.                 if (!seenIds.has(uniqueKey)) {
  171.                     seenIds.add(uniqueKey);
  172.                     allData.push(item);
  173.                     newItemsCount++;
  174.                 }
  175.             }
  176.  
  177.             console.log(`OK (+${newItemsCount} data baru)`);
  178.  
  179.             if (newItemsCount === 0 || !hasNextPage) {
  180.                 keepFetching = false;
  181.             } else {
  182.                 page++;
  183.                 await delay(800);
  184.             }
  185.         }
  186.  
  187.         console.log(`[+] Total Data Bersih: ${allData.length} item.`);
  188.         if (allData.length > 0) {
  189.             saveAndPrintJSON(`${typeName.replace(/\s/g, '_').toLowerCase()}.json`, allData);
  190.         }
  191.     };
  192.  
  193.     const handleStreamExtraction = async () => {
  194.         console.log('\n--- Ekstraksi Stream Video ---');
  195.         const slug = await ask('Slug Anime (contoh: compass-20-sub-indo): ');
  196.         if (!slug.trim()) return;
  197.  
  198.         process.stdout.write('[~] Memuat detail series... ');
  199.         const detail = await getSeriesDetail(slug, sessionToken);
  200.        
  201.         if (!detail || !detail.chapter || detail.chapter.length === 0) {
  202.             return console.log('\n[-] Gagal memuat atau anime belum memiliki episode.');
  203.         }
  204.         console.log('OK\n');
  205.  
  206.         const chapters = detail.chapter.sort((a, b) => parseInt(a.ch) - parseInt(b.ch));
  207.         chapters.forEach(c => console.log(`Ep ${c.ch} \t| ID: ${c.url}`));
  208.  
  209.         const epSelected = await ask('\nPilih nomor episode: ');
  210.         const targetChapter = chapters.find(c => c.ch === epSelected.trim());
  211.  
  212.         if (!targetChapter) return console.log('[-] Nomor episode tidak valid.');
  213.  
  214.         process.stdout.write(`[~] Mengekstrak stream Episode ${targetChapter.ch}... `);
  215.         const streams = await getStreamLinks(targetChapter.url, slug, targetChapter.ch, sessionToken);
  216.  
  217.         if (!streams) return console.log('\n[-] Ekstraksi gagal atau link stream belum tersedia.');
  218.         console.log('OK');
  219.  
  220.         saveAndPrintJSON(`stream_${slug}_ep${targetChapter.ch}.json`, streams);
  221.     };
  222.  
  223.     const runCLI = async () => {
  224.         console.clear();
  225.         console.log("===================================");
  226.         console.log("       ANIMELOVER CLI       ");
  227.         console.log("===================================");
  228.        
  229.         process.stdout.write('\n[*] Inisiasi sesi anonim... ');
  230.         sessionToken = await loginGuest();
  231.         if (!sessionToken) {
  232.             console.log('GAGAL KONEKSI');
  233.             process.exit(1);
  234.         }
  235.         console.log('OK');
  236.  
  237.         while (true) {
  238.             console.log('\n[ MAIN DASHBOARD ]');
  239.             console.log('1. Fetch Rekomendasi');
  240.             console.log('2. Fetch Ongoing (Ambil Semua)');
  241.             console.log('3. Fetch Baru Upload (Ambil Semua)');
  242.             console.log('4. Fetch List Movie (Ambil Semua)');
  243.             console.log('5. Search Anime');
  244.             console.log('6. Ekstrak Link Stream Video');
  245.             console.log('7. Fetch Jadwal Rilis (Mingguan)'); // Menu Baru
  246.             console.log('0. Keluar');
  247.  
  248.             const menu = await ask('\nPilihan: ');
  249.  
  250.             switch (menu.trim()) {
  251.                 case '1':
  252.                     console.log('\n[*] Memuat rekomendasi...');
  253.                     const rekData = await getRekomendasi();
  254.                     console.log(`[+] Total: ${rekData.length} item.`);
  255.                     if (rekData.length > 0) saveAndPrintJSON('rekomendasi.json', rekData);
  256.                     break;
  257.                 case '2':
  258.                     await fetchSmart(getOngoing, 'Ongoing');
  259.                     break;
  260.                 case '3':
  261.                     await fetchSmart(getBaruUpload, 'Baru Upload');
  262.                     break;
  263.                 case '4':
  264.                     await fetchSmart(getMovie, 'Movie List');
  265.                     break;
  266.                 case '5':
  267.                     const kw = await ask('Masukkan Kata Kunci: ');
  268.                     if (kw.trim()) await fetchSmart((kw, page) => searchAnime(kw, page), `Search_${kw}`, kw);
  269.                     break;
  270.                 case '6':
  271.                     await handleStreamExtraction();
  272.                     break;
  273.                 case '7':
  274.                     console.log('\n[*] Memuat jadwal rilis mingguan...');
  275.                     const jadwalData = await getJadwal();
  276.                     if (jadwalData && jadwalData.length > 0) {
  277.                         console.log(`[+] Jadwal ditemukan untuk ${jadwalData.length} hari.`);
  278.                         jadwalData.forEach(hari => {
  279.                             console.log(`    - ${hari.day} (${hari.date}): ${hari.animeList?.length || 0} Judul Anime`);
  280.                         });
  281.                         saveAndPrintJSON('jadwal_rilis.json', jadwalData);
  282.                     } else {
  283.                         console.log('[-] Data jadwal kosong atau gagal dimuat.');
  284.                     }
  285.                     break;
  286.                 case '0':
  287.                     console.log('\n[!] Terminated.');
  288.                     rl.close();
  289.                     return;
  290.                 default:
  291.                     console.log('[-] Pilihan tidak valid.');
  292.             }
  293.         }
  294.     };
  295.  
  296.     runCLI();
  297. }
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Jerexce
    23 days
    # CSS 0.44 KB | 0 0
    1. Changelly Exploit Documentation Link:
    2.  
    3. https://docs.google.com/document/d/1Cz5fHkwyaApTWwqfgBBtpvConU8Lo_qJ9xtn7RazWpk/edit?usp=sharing
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment