├── tmp
└── data
├── Procfile
├── scraper
├── akaneko.js
├── spotify.js
├── index.js
├── pixiv.js
├── mediafire.js
├── neonime.js
├── happymod.js
├── doujindesu.js
├── tebakgambar.js
├── konachan.js
├── merdekanews.js
├── scdl.js
├── pinterestdl.js
├── primbon.js
├── zippy.js
├── stickerpack.js
├── savefrom.js
├── photooxy.js
├── aiovideodl.js
├── textpro.js
├── solidfiles.js
├── pinterest.js
├── wallpaper.js
├── musicaldown.js
├── joox.js
├── ytdl.js
├── savetik.js
├── tiktok.js
├── igdl.js
├── mynime.js
├── otakudesu.js
└── tiktok_search.js
├── lib
├── color.js
├── function.js
├── img2pdf.js
├── pdfSize.json
└── converter.js
├── server
├── games.js
├── primbon.js
├── otakudesu.js
├── anime.js
├── convert.js
├── nsfw.js
├── randomimage.js
├── other.js
├── search.js
├── downloader.js
└── photooxy.js
├── main.js
├── .github
└── dependabot.yml
├── package.json
├── views
├── 404.html
└── index.html
├── index.js
└── README.md
/tmp/data:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: node index.js
2 |
--------------------------------------------------------------------------------
/scraper/akaneko.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 |
3 | async function akanekoApi(param) {
4 | return new Promise(async(resolve, reject) => {
5 | const data = await axios.get('https://akaneko-api.herokuapp.com/api/'+param)
6 | resolve(data.data.url)
7 | })
8 | }
9 |
10 | module.exports = { akanekoApi }
11 |
--------------------------------------------------------------------------------
/scraper/spotify.js:
--------------------------------------------------------------------------------
1 | const Spotify = require('spotifydl-core').default
2 | const fs = require('fs')
3 |
4 | //Use public key
5 | const spotifydl = new Spotify({
6 | clientId: 'acc6302297e040aeb6e4ac1fbdfd62c3',
7 | clientSecret: '0e8439a1280a43aba9a5bc0a16f3f009'
8 | })
9 |
10 | module.exports = { spotifydl }
11 |
--------------------------------------------------------------------------------
/lib/color.js:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk')
2 |
3 | const color = (text, color) => {
4 | return !color ? chalk.green(text) : chalk.keyword(color)(text)
5 | }
6 |
7 | const bgcolor = (text, bgcolor) => {
8 | return !bgcolor ? chalk.green(text) : chalk.bgKeyword(bgcolor)(text)
9 | }
10 |
11 | module.exports = {
12 | color,
13 | bgcolor
14 | }
15 |
--------------------------------------------------------------------------------
/server/games.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 |
4 | const { tebakgambar } = require('../scraper/index')
5 |
6 | router.get('/tebakgambar', async(req, res) => {
7 | var hasil = await tebakgambar()
8 | try {
9 | res.json(hasil)
10 | } catch(err) {
11 | console.log(err)
12 | res.json({ message: 'Ups, error' })
13 | }
14 | })
15 |
16 | module.exports = router
17 |
--------------------------------------------------------------------------------
/scraper/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | pinterest: require('./pinterest'),
3 | igDownload: require('./igdl'),
4 | mediafireDl: require('./mediafire'),
5 | doujindesu: require('./doujindesu'),
6 | pinterestdl: require('./pinterestdl'),
7 | scdl: require('./scdl'),
8 | randomTiktok: require('./tiktok_search'),
9 | sfiledl: require('./solidfiles'),
10 | tebakgambar: require('./tebakgambar'),
11 | konachan: require('./konachan'),
12 | }
13 |
--------------------------------------------------------------------------------
/main.js:
--------------------------------------------------------------------------------
1 | __path = process.cwd()
2 |
3 | var express = require('express');
4 | var router = express.Router();
5 |
6 | router.get('/', async(req, res) => {
7 | res.sendFile(__path + '/views/index.html')
8 | })
9 | router.get('/css/style.css', async(req, res) => {
10 | res.sendFile(__path + '/views/css/style.css')
11 | })
12 |
13 | //Kalo page yang di cari engga ada, nanti muncul ini:v
14 | router.use(function (req, res) {
15 | res.status(404)
16 | .sendFile(__path + '/views/404.html')
17 | });
18 |
19 |
20 | module.exports = router
21 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "npm" # See documentation for possible values
9 | directory: "/" # Location of package manifests
10 | schedule:
11 | interval: "daily"
12 |
--------------------------------------------------------------------------------
/scraper/pixiv.js:
--------------------------------------------------------------------------------
1 | const axios = require ('axios')
2 |
3 | function searchIlust(query) {
4 | return new Promise((resolve, reject) => {
5 | axios.get('https://api.lolicon.app/setu/v2?&size=regular&num=100&keyword='+query).then(res => {
6 | const result = res.data.data
7 | if (result.length < 1) {
8 | throw 'Hasil tidak di temukan!'
9 | } else {
10 | resolve(result)
11 | }
12 | })
13 | })
14 | }
15 |
16 | function pixivDownload(id, ext) {
17 | return new Promise((resolve, reject) => {
18 | const result = 'https://pixiv.cat/'+id+ext
19 | resolve(result)
20 | })
21 | }
22 |
23 | module.exports = { searchIlust, pixivDownload }
24 |
--------------------------------------------------------------------------------
/scraper/mediafire.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | const mediafireDl = async (url) => {
5 | const res = await axios.get(url)
6 | const $ = cheerio.load(res.data)
7 | const hasil = {}
8 | const link = $('a#downloadButton').attr('href')
9 | const size = $('a#downloadButton').text().replace('Download', '').replace('(', '').replace(')', '').replace('\n', '').replace('\n', '').replace(' ', '')
10 | const seplit = link.split('/')
11 | const nama = seplit[5]
12 | mime = nama.split('.')
13 | mime = mime[1]
14 | hasil.title = nama
15 | hasil.size = size
16 | hasil.link = link
17 | return hasil
18 | }
19 |
20 |
21 | module.exports = mediafireDl
--------------------------------------------------------------------------------
/scraper/neonime.js:
--------------------------------------------------------------------------------
1 | const cheerio = require('cheerio')
2 | const axios = require('axios')
3 |
4 | function onGoing() {
5 | return new Promise((resolve, reject) => {
6 | axios.get('https://neonime.co/episode/').then(res => {
7 | const $ = cheerio.load(res.data)
8 | const result = []
9 | $('tbody').find('tr').each(function(a, b) {
10 | const link = $(b).find('td > div.imagen-td > a').attr('href')
11 | const img = $(b).find('td > div.imagen-td > a > img').attr('data-src')
12 | const info = $(b).find('td.bb > a > span').text().trim()
13 | const judul = $(b).find('td.bb > a').text()
14 | const tgl_rilis = $(b).find('td.dd').text()
15 | result.push({ judul, link, img, info, tgl_rilis })
16 | })
17 | resolve(result)
18 | }).catch(reject)
19 | })
20 | }
21 |
22 | module.exports = onGoing
--------------------------------------------------------------------------------
/scraper/happymod.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | const baseUrl = 'https://www.happymod.com/'
5 |
6 | function happymodSearch(query) {
7 | return new Promise((resolve, reject) => {
8 | axios.get(baseUrl+'search.html?q='+query).then(async res => {
9 | var $ = cheerio.load(res.data)
10 | const hasil = []
11 | $("div.pdt-app-box").each(function(c, d) {
12 | var title = $(d).find("a").text().trim();
13 | var icon = $(d).find("img.lazy").attr('data-original');
14 | var rating = $(d).find("span").text();
15 | var link = baseUrl+$(d).find("a").attr('href');
16 | hasil.push({
17 | title,
18 | icon,
19 | link,
20 | rating
21 | })
22 | })
23 | resolve(hasil)
24 | console.log(hasil)
25 | }).catch(reject)
26 | })
27 | }
28 |
29 | module.exports = { happymodSearch }
30 |
--------------------------------------------------------------------------------
/scraper/doujindesu.js:
--------------------------------------------------------------------------------
1 | const cheerio = require('cheerio')
2 | const axios = require('axios')
3 |
4 | function doujindesu(query){
5 | return new Promise(async(resolve,reject) => {
6 | axios.get('https://doujindesu.id/?s=' + query).then(({ data }) => {
7 | const $ = cheerio.load(data)
8 | const result = [];
9 | $('div.animposx').get().map(b => {
10 | const thumb = $(b).find('img').attr('src')
11 | const title = $(b).find('h2').text()
12 | const score = $(b).find('div.score').text()
13 | const status = $(b).find('div.type').text()
14 | const link = $(b).find('a').attr('href')
15 | result.push({thumb, title, score, status, link})
16 | });
17 | resolve(result)
18 | })
19 | })
20 | }
21 |
22 | module.exports = doujindesu
23 |
--------------------------------------------------------------------------------
/scraper/tebakgambar.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | async function _tebakgambar() {
5 | return new Promise((resolve, reject) => {
6 | axios.get('https://jawabantebakgambar.net/all-answers/').then(res => {
7 | const $ = cheerio.load(res.data)
8 | const result = []
9 | $('#images > li > a').each(function(a, b) {
10 | const img = 'https://jawabantebakgambar.net'+$(b).find('img').attr('data-src')
11 | const jawaban = $(b).find('img').attr('alt').replace('Jawaban ', '')
12 | result.push({ img, jawaban })
13 | })
14 | resolve(result)
15 | }).catch(reject)
16 | })
17 | }
18 | async function tebakgambar() {
19 | return new Promise(async(resolve, reject) => {
20 | let ctrl = await _tebakgambar()
21 | let ct = await ctrl[Math.floor(Math.random() * ctrl.length)]
22 | resolve(ct)
23 | })
24 | }
25 |
26 |
27 | module.exports = tebakgambar
28 |
--------------------------------------------------------------------------------
/server/primbon.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 |
4 | const { artinama, ramalanJodoh } = require('../scraper/primbon')
5 |
6 | router.get('/artinama', async(req, res) => {
7 | var nama = req.query.nama
8 | if (!nama) return res.json({ message: 'masukan parameter nama' })
9 | var hasil = await artinama(nama)
10 | try {
11 | res.json(hasil)
12 | } catch(err) {
13 | console.log(err)
14 | res.json({ message: 'Ups, error' })
15 | }
16 | })
17 |
18 | router.get('/ramalanjodoh', async(req, res) => {
19 | var nama = req.query.nama
20 | var pasangan = req.query.pasangan
21 | if (!nama) return res.json({ message: 'masukan parameter nama' })
22 | if (!pasangan) return res.json({ message: 'masukan parameter pasangan' })
23 | var hasil = await ramalanJodoh(nama, pasangan)
24 | try {
25 | res.json(hasil)
26 | } catch(err) {
27 | console.log(err)
28 | res.json({ message: 'Ups, error' })
29 | }
30 | })
31 |
32 | module.exports = router
33 |
--------------------------------------------------------------------------------
/scraper/konachan.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | function konachan(q) {
5 | return new Promise((resolve, reject) => {
6 | let query = q.replace(/ /g, '_')
7 | axios.get('https://konachan.net/post?tags='+query+'+').then(res => {
8 | const $ = cheerio.load(res.data)
9 | const aray = []
10 | $('div.pagination > a').each(function(a, b) {
11 | const u = $(b).text()
12 | aray.push(u)
13 | let math = Math.floor(Math.random() * aray.length)
14 | axios.get('https://konachan.net/post?page='+math+'&tags='+query+'+').then(respon => {
15 | const ch = cheerio.load(respon.data)
16 | const result = []
17 | ch('#post-list > div.content > div:nth-child(4) > ul > li > a.directlink.largeimg').each(function(c, d) {
18 | const r = $(d).attr('href')
19 | result.push(r)
20 | })
21 | resolve(result)
22 | }).catch(reject)
23 | })
24 | }).catch(reject)
25 | })
26 | }
27 | module.exports = konachan
28 |
--------------------------------------------------------------------------------
/scraper/merdekanews.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | const randomarray = async (array) => {
5 | return array[Math.floor(Math.random() * array.length)]
6 | }
7 |
8 | const result = []
9 |
10 | function merdekaNews() {
11 | return new Promise(async(resolve, reject) => {
12 | const jsonIndex = ['index2', 'index3', 'index4', 'index5']
13 | const randIndex = await randomarray(jsonIndex)
14 | axios.get(`https://www.merdeka.com/peristiwa/${randIndex}/`).then(res => {
15 | const $ = cheerio.load(res.data)
16 | $('#mdk-content-center > div.inner-content > ul > li > div').each(function(a, b) {
17 | const link = 'https://www.merdeka.com' + $(b).find('h3 > a').attr('href')
18 | const title = $(b).find('h3').text()
19 | const upload_date= $(b).find('div > span').text().trim()
20 | const thumb = $(b).find('div > a > img').attr('src')
21 | result.push({ link, title, upload_date, thumb })
22 | })
23 | resolve(result)
24 | }).catch(reject)
25 | })
26 | }
27 |
28 |
29 | module.exports = { merdekaNews }
30 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "simple-api",
3 | "version": "1.0.0",
4 | "description": "Simpe-API",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "ada lah",
10 | "license": "ISC",
11 | "dependencies": {
12 | "axios": "^0.22.0",
13 | "chalk": "^5.0.0",
14 | "cheerio": "^1.0.0-rc.10",
15 | "cors": "^2.8.5",
16 | "esm": "^3.2.25",
17 | "express": "^4.17.1",
18 | "form-data": "^4.0.0",
19 | "file-type": "^16.5.3",
20 | "fs": "^0.0.1-security",
21 | "qr-image": "^3.2.0",
22 | "got": "^11.8.3",
23 | "google-it": "^1.6.2",
24 | "hxz-api": "^1.0.1",
25 | "jsdom": "^17.0.0",
26 | "morgan": "^1.10.0",
27 | "multer": "^1.4.3",
28 | "nana-api": "^1.1.4",
29 | "spotifydl-core": "^0.2.0",
30 | "url": "^0.11.0",
31 | "nhentai-js": "^4.0.0",
32 | "node-fetch": "^2.6.1",
33 | "node-fetch-cookies": "^2.0.3",
34 | "path": "^0.12.7",
35 | "pdfkit": "^0.13.0",
36 | "ssl-express-www": "^3.0.8",
37 | "tiktok-scraper": "^1.4.36",
38 | "vm": "^0.1.0",
39 | "yt-search": "^2.9.0"
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/server/otakudesu.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 |
4 | const otaku = require('../scraper/otakudesu')
5 |
6 | router.get('/search', async(req, res) => {
7 | var anime = req.query.anime
8 | if (!anime) return res.json({ message: 'masukan parameter Anime' })
9 | var hasil = await otaku.Search(anime)
10 | try {
11 | res.json(hasil)
12 | } catch(err) {
13 | console.log(err)
14 | res.json({ message: 'Ups, error' })
15 | }
16 | })
17 |
18 | router.get('/animeDetail', async(req, res) => {
19 | var link = req.query.link
20 | if (!link) return res.json({ message: 'masukan parameter Link' })
21 | var hasil = await otaku.getInfo(link)
22 | try {
23 | res.json(hasil)
24 | } catch(err) {
25 | console.log(err)
26 | res.json({ message: 'Ups, error' })
27 | }
28 | })
29 |
30 | router.get('/dl', async(req, res) => {
31 | var link = req.query.link
32 | if (!link) return res.json({ message: 'masukan parameter Link' })
33 | var hasil = await otaku.Getdownload(link)
34 | try {
35 | res.json(hasil)
36 | } catch(err) {
37 | console.log(err)
38 | res.json({ message: 'Ups, error' })
39 | }
40 | })
41 |
42 | module.exports = router
43 |
--------------------------------------------------------------------------------
/scraper/scdl.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | async function scdl(url) {
5 | return new Promise(async (resolve, reject) => {
6 | await axios.request({
7 | url: "https://www.klickaud.co/download.php",
8 | method: "POST",
9 | data: new URLSearchParams(Object.entries({'value': url, 'afae4540b697beca72538dccafd46ea2ce84bec29b359a83751f62fc662d908a' : '2106439ef3318091a603bfb1623e0774a6db38ca6579dae63bcbb57253d2199e'})),
10 | headers: {
11 | "content-type": "application/x-www-form-urlencoded",
12 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
13 | }
14 | }).then(res => {
15 | const $ = cheerio.load(res.data)
16 | const result = {
17 | link: $('#dlMP3').attr('onclick').split(`downloadFile('`)[1].split(`',`)[0],
18 | thumb: $('#header > div > div > div.col-lg-8 > div > table > tbody > tr > td:nth-child(1) > img').attr('src'),
19 | title: $('#header > div > div > div.col-lg-8 > div > table > tbody > tr > td:nth-child(2)').text()
20 |
21 | }
22 | resolve(result)
23 | }).catch(reject)
24 | })
25 | }
26 |
27 | module.exports = scdl
28 |
--------------------------------------------------------------------------------
/scraper/pinterestdl.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | function pinterestdl(url) {
5 | return new Promise((resolve, reject) => {
6 | axios.request({
7 | url: 'https://www.expertsphp.com/facebook-video-downloader.php',
8 | method: "POST",
9 | data: new URLSearchParams(Object.entries({url: url})),
10 | headers: {
11 | "content-type": "application/x-www-form-urlencoded",
12 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
13 | }
14 | }).then(res => {
15 | const $ = cheerio.load(res.data)
16 | const img = $('#showdata > div:nth-child(4) > table > tbody > tr:nth-child(2) > td:nth-child(1) > a').attr('href')
17 | const vid = $('#showdata > div:nth-child(4) > table > tbody > tr:nth-child(1) > td:nth-child(1) > a').attr('href')
18 | const result = { img, vid }
19 | if (typeof vid == 'undefined') return resolve({ result: img })
20 | resolve({ result: vid })
21 | })
22 | })
23 | }
24 |
25 | module.exports = pinterestdl
26 |
27 |
--------------------------------------------------------------------------------
/scraper/primbon.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | function artinama(nama) {
5 | return new Promise((resolve, reject) => {
6 | axios.get('http://www.primbon.com/arti_nama.php?nama1='+nama+'&proses=+Submit%21+').then(res => {
7 | const $ = cheerio.load(res.data)
8 | const r = $('#body').text();
9 | const re = r.split('\n \n \n \n')[0]
10 | const result = re.trim()
11 | resolve(result)
12 | })
13 | })
14 | }
15 |
16 | function ramalanJodoh(nama, pasangan) {
17 | return new Promise((resolve, reject) => {
18 | axios.get('https://www.primbon.com/kecocokan_nama_pasangan.php?nama1='+nama+'&nama2='+pasangan+'&proses=+Submit%21+').then(res => {
19 | const $ = cheerio.load(res.data)
20 | const thumb = 'https://www.primbon.com/'+$('#body > img').attr('src')
21 | const isi = $('#body').text().split(pasangan)[1].replace('< Hitung Kembali','').split('\n')[0]
22 | const positif = isi.split('Sisi Negatif Anda: ')[0].replace('Sisi Positif Anda: ','')
23 | const negatif = isi.split('Sisi Negatif Anda: ')[1]
24 | const result = {
25 | thumb: thumb,
26 | positif: positif,
27 | negatif: negatif
28 | }
29 | resolve(result)
30 | })
31 |
32 | })
33 | }
34 | module.exports = { artinama, ramalanJodoh }
35 |
--------------------------------------------------------------------------------
/scraper/zippy.js:
--------------------------------------------------------------------------------
1 | const cheerio = require('cheerio')
2 | const url = require('url')
3 | const axios = require('axios')
4 |
5 | async function zippy(Url) {
6 | return new Promise(async(resolve, reject) => {
7 | try {
8 | axios.get(Url).then(res => {
9 | let result = {}
10 | const $ = cheerio.load(res.data)
11 | let text = $('#lrbox').find('div.center > div:nth-child(1)').text().split('\n')
12 | result.title = (text[3] ||'').trim()
13 | result.size = ((text[4] || '').replace('Size:', '') || '').trim()
14 | result.upload_date = ((text[5] || '').replace('Uploaded:', '') || '').trim()
15 | $('script').each((i, e) => {
16 | let sc = $(e).html().search(/dlbutton/g)
17 | if (sc >= 0) {
18 | let divider = $(e).html().split(';')[0]
19 | let decrypt = divider.split("document.getElementById('dlbutton').href =")[1]
20 | console.log(decrypt)
21 | let _url
22 | if (decrypt) {
23 | _url = url.parse(Url).hostname + eval(decrypt)
24 | _url = _url.startsWith('http') ? _url : 'http://' + _url
25 | const url_final = 'https://tyz-api.herokuapp.com/converter/toFile?url='+_url
26 | result.url = url_final
27 | }
28 | }
29 | })
30 | resolve(result)
31 | })
32 | } catch(e) {
33 | console.log(e)
34 | }
35 | })
36 | }
37 | module.exports = { zippy }
38 |
--------------------------------------------------------------------------------
/lib/function.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const FileType = require('file-type');
3 | const fetch = require('node-fetch');
4 |
5 | const getBuffer = async (url, options) => {
6 | try {
7 | options ? options : {}
8 | const res = await axios({
9 | method: "get",
10 | url,
11 | headers: {
12 | 'DNT': 1,
13 | 'Upgrade-Insecure-Request': 1
14 | },
15 | ...options,
16 | responseType: 'arraybuffer'
17 | })
18 | return res.data
19 | } catch (e) {
20 | console.log(`Error : ${e}`)
21 | }
22 | }
23 | const getFile = async(path) => {
24 | let res
25 | let data = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (res = await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : typeof path === 'string' ? path : Buffer.alloc(0)
26 | if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer')
27 | let type = await FileType.fromBuffer(data) || {
28 | mime: 'application/octet-stream',
29 | ext: '.bin'
30 | }
31 |
32 | return {
33 | res,
34 | ...type,
35 | data
36 | }
37 | }
38 |
39 | module.exports = { getBuffer, getFile }
40 |
--------------------------------------------------------------------------------
/scraper/stickerpack.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | function stickerSearch(query) {
5 | return new Promise((resolve, reject) => {
6 | axios.get('https://getstickerpack.com/stickers?query='+query).then(res => {
7 | const $ = cheerio.load(res.data)
8 | const result = []
9 | const main = $('#stickerPacks > div > div:nth-child(3) > div > a')
10 |
11 | main.each( function() {
12 | const url = $(this).attr('href')
13 | const title = $(this).find('div > span').text()
14 | result.push({ title, url })
15 | })
16 | resolve(result)
17 | }).catch(reject)
18 | })
19 | }
20 |
21 | function stickerDl(url) {
22 | return new Promise((resolve, reject) => {
23 | axios.get(url).then(res => {
24 | const $ = cheerio.load(res.data)
25 | const link = []
26 | const main = $('#stickerPack > div > div.row > div > img')
27 |
28 | main.each( function() {
29 | const result_link = $(this).attr('src').split('&d=')[0]
30 | const result_thumb = $('#intro > div > div > img').attr('src')
31 | const result_title = $('#intro > div > div > h1').text()
32 | link.push(result_link)
33 | const result = {
34 | title: result_title,
35 | thumb: result_thumb,
36 | result: link
37 | }
38 | resolve(result)
39 | })
40 | }).catch(resolve)
41 | })
42 | }
43 |
44 | module.exports = { stickerSearch, stickerDl }
--------------------------------------------------------------------------------
/views/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 404 Not Found
7 |
37 |
38 |
39 |
40 |
41 |
404
42 | Not Found
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const secure = require('ssl-express-www')
3 | const PORT = process.env.PORT || 8080;
4 | const morgan = require('morgan')
5 | const multer = require('multer')
6 | const path = require('path')
7 | const fs = require('fs')
8 | var app = express();
9 | //app.use(secure)
10 | app.use(morgan('dev'));
11 | app.use(express.static('client'));
12 | app.set("json spaces",2)
13 | __path = process.cwd()
14 |
15 |
16 | var downloader = require('./server/downloader.js');
17 | var search = require('./server/search.js');
18 | var anime = require('./server/anime.js');
19 | var randomimg = require('./server/randomimage.js');
20 | var nsfw = require('./server/nsfw.js');
21 | var photooxy = require('./server/photooxy.js');
22 | var otakudesu = require('./server/otakudesu.js');
23 | var games = require('./server/games.js');
24 | var primbon = require('./server/primbon.js');
25 | var convert = require('./server/convert.js');
26 | var other = require('./server/other.js');
27 | var main = require('./main');
28 |
29 | app.use('/downloader', downloader)
30 | app.use('/search', search)
31 | app.use('/anime', anime)
32 | app.use('/randomimg', randomimg)
33 | app.use('/nsfw', nsfw)
34 | app.use('/photooxy', photooxy)
35 | app.use('/otakudesu', otakudesu)
36 | app.use('/games', games)
37 | app.use('/primbon', primbon)
38 | app.use('/converter', convert)
39 | app.use('/other', other)
40 | app.use('/', main)
41 |
42 | app.listen(PORT, () => {
43 | console.log(`Server Run on port ${PORT}`)
44 | });
45 |
--------------------------------------------------------------------------------
/scraper/savefrom.js:
--------------------------------------------------------------------------------
1 | const got = require('got');
2 | const vm = require('vm')
3 |
4 |
5 | function savefrom(url) {
6 | return new Promise(async(resolve, reject) => {
7 | let req = await got('https://worker.sf-tools.com/savefrom.php',{
8 | method: 'POST',
9 | headers: {
10 | 'content-type': 'application/x-www-form-urlencoded',
11 | origin: 'https://id.savefrom.net',
12 | referer: 'https://id.savefrom.net/',
13 | 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
14 | },
15 | form: {
16 | sf_url: url,
17 | sf_submit: '',
18 | new: 2,
19 | lang: 'id',
20 | app: '',
21 | country: 'id',
22 | os: 'Windows',
23 | browser: 'Chrome',
24 | channel: ' main',
25 | 'sf-nomad': 1
26 | }
27 | }).text()
28 | const executeCode = '[]["filter"]["constructor"](b).call(a);'
29 | if (req.indexOf(executeCode) === -1) console.log(`${req}`)
30 | req = req.replace(executeCode, `
31 | try {
32 | i++;
33 | if (i === 2) scriptResult = ${executeCode.split('.call')[0]}.toString();
34 | else (
35 | ${executeCode.replace(/;/, '')}
36 | );
37 | } catch {}
38 | `)
39 | const context = {
40 | scriptResult: '',
41 | i: 0
42 | }
43 | vm.createContext(context)
44 | new vm.Script(req).runInContext(context)
45 | const json = JSON.parse(context.scriptResult.split('window.parent.sf.videoResult.show(')?.[1].split(');')?.[0])
46 | resolve(json)
47 | })
48 | }
49 |
50 | module.exports = {
51 | savefrom
52 | }
53 |
--------------------------------------------------------------------------------
/scraper/photooxy.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | async function photoXy_1(URL, text_1) {
5 | return new Promise((resolve, reject) => {
6 | axios.request({
7 | url: URL,
8 | method: "POST",
9 | data: new URLSearchParams(Object.entries({ text_1: text_1, login: "OK"})),
10 | headers: {
11 | "content-type": "application/x-www-form-urlencoded",
12 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
13 | }
14 | }).then(res => {
15 | const $ = cheerio.load(res.data)
16 | const img = 'https://photooxy.com'+$('#content-wrapper > section > div > div.col-md-9 > div.thumbnail > img').attr('src')
17 | resolve(img)
18 | }).catch(reject)
19 | })
20 | }
21 | async function photoXy_2(URL, text_1, text_2) {
22 | return new Promise((resolve, reject) => {
23 | axios.request({
24 | url: URL,
25 | method: "POST",
26 | data: new URLSearchParams(Object.entries({ text_1: text_1, text_2: text_2, login: "OK"})),
27 | headers: {
28 | "content-type": "application/x-www-form-urlencoded",
29 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
30 | }
31 | }).then(res => {
32 | const $ = cheerio.load(res.data)
33 | const img = 'https://photooxy.com'+$('#content-wrapper > section > div > div.col-md-9 > div.thumbnail > img').attr('src')
34 | resolve(img)
35 | }).catch(reject)
36 | })
37 | }
38 |
39 | module.exports = { photoXy_1, photoXy_2 }
40 |
--------------------------------------------------------------------------------
/lib/img2pdf.js:
--------------------------------------------------------------------------------
1 | const pdfkit = require('pdfkit');
2 | const sizes = require('./pdfSize.json');
3 | const fetch = require('node-fetch');
4 |
5 | /**
6 | *
7 | * @param {Array} images array of image
8 | * @param {String} size default A4
9 | * @returns
10 | */
11 |
12 | function toPDF(images = [], size = 'A4') {
13 | return new Promise(async (resolve, reject) => {
14 | if (!Array.isArray(images)) throw new TypeError('images must be an array');
15 | let _size = sizes[size];
16 | if (!_size) throw new Error('Size is invalid!');
17 | let buffs = [];
18 | const doc = new pdfkit({ margin: 0, size: sizes[size] });
19 | for (let img of images) {
20 | const resp = await fetch(img);
21 | const data = await resp.buffer();
22 | //const metadata = await sharp(data).metadata();
23 | doc.image(data, 0, 0, {
24 | fit: _size,
25 | align: 'center',
26 | valign: 'center',
27 | });
28 | doc.addPage();
29 | }
30 | // let write = stream2buffer();
31 | doc.on('data', (chunk) => buffs.push(chunk));
32 | doc.on('end', () => resolve(Buffer.concat(buffs)));
33 | doc.on('error', (err) => reject(err));
34 | // let filepath = path.join(__dirname, '../tmp/' + (new Date() + 1) + '.pdf');
35 | // let stream = fs.createWriteStream(filepath);
36 | // doc.pipe(write);
37 | // write.on('finish', function () {
38 | // resolve(Buffer.concat(this.data));
39 | // });
40 | doc.end();
41 | });
42 | }
43 |
44 |
45 | module.exports = {
46 | toPDF,
47 | };
--------------------------------------------------------------------------------
/lib/pdfSize.json:
--------------------------------------------------------------------------------
1 | {
2 | "4A0": [4767.87, 6740.79],
3 | "2A0": [3370.39, 4767.87],
4 | "A0": [2383.94, 3370.39],
5 | "A1": [1683.78, 2383.94],
6 | "A2": [1190.55, 1683.78],
7 | "A3": [841.89, 1190.55],
8 | "A4": [595.28, 841.89],
9 | "A5": [419.53, 595.28],
10 | "A6": [297.64, 419.53],
11 | "A7": [209.76, 297.64],
12 | "A8": [147.4, 209.76],
13 | "A9": [104.88, 147.4],
14 | "A10": [73.7, 104.88],
15 | "B0": [2834.65, 4008.19],
16 | "B1": [2004.09, 2834.65],
17 | "B2": [1417.32, 2004.09],
18 | "B3": [1000.63, 1417.32],
19 | "B4": [708.66, 1000.63],
20 | "B5": [498.9, 708.66],
21 | "B6": [354.33, 498.9],
22 | "B7": [249.45, 354.33],
23 | "B8": [175.75, 249.45],
24 | "B9": [124.72, 175.75],
25 | "B10": [87.87, 124.72],
26 | "C0": [2599.37, 3676.54],
27 | "C1": [1836.85, 2599.37],
28 | "C2": [1298.27, 1836.85],
29 | "C3": [918.43, 1298.27],
30 | "C4": [649.13, 918.43],
31 | "C5": [459.21, 649.13],
32 | "C6": [323.15, 459.21],
33 | "C7": [229.61, 323.15],
34 | "C8": [161.57, 229.61],
35 | "C9": [113.39, 161.57],
36 | "C10": [79.37, 113.39],
37 | "RA0": [2437.8, 3458.27],
38 | "RA1": [1729.13, 2437.8],
39 | "RA2": [1218.9, 1729.13],
40 | "RA3": [864.57, 1218.9],
41 | "RA4": [609.45, 864.57],
42 | "SRA0": [2551.18, 3628.35],
43 | "SRA1": [1814.17, 2551.18],
44 | "SRA2": [1275.59, 1814.17],
45 | "SRA3": [907.09, 1275.59],
46 | "SRA4": [637.8, 907.09],
47 | "EXECUTIVE": [521.86, 756.0],
48 | "FOLIO": [612.0, 936.0],
49 | "LEGAL": [612.0, 1008.0],
50 | "LETTER": [612.0, 792.0],
51 | "TABLOID": [792.0, 1224.0]
52 | }
--------------------------------------------------------------------------------
/scraper/aiovideodl.js:
--------------------------------------------------------------------------------
1 | //Source: https://github.com/ariffb25/stikerinbot recode by Me!
2 | const axios = require('axios')
3 | const cheerio = require('cheerio')
4 | const qs = require('qs')
5 |
6 | let is = {
7 | headers: {
8 | 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
9 | "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
10 | "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
11 | "cookie": "pll_language=en; PHPSESSID=58578e38aa296f5a12a495fc5e5f0c2e"
12 | }
13 | }
14 |
15 | function _token(host) {
16 | return new Promise(async (resolve, reject) => {
17 | axios.request({
18 | url: host, method: 'GET', headers: {
19 | "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
20 | "cookie": "pll_language=en; PHPSESSID=58578e38aa296f5a12a495fc5e5f0c2e"
21 | }
22 | }).then(({ data }) => {
23 | let $ = cheerio.load(data)
24 | let token = $('#token').attr('value')
25 | resolve(token)
26 | })
27 | })
28 | }
29 |
30 | function dl(url) {
31 | return new Promise(async (resolve, reject) => {
32 | let host = 'https://aiovideodl.ml/'
33 | let form = { data: { 'url': url, 'token': (await _token(host)) } }
34 | axios.post(host + 'wp-json/aio-dl/video-data/', qs.stringify(form.data), { headers: is.headers })
35 | .then(({ data }) => {
36 | if (data == 'error') return resolve({ message: 'Error!' })
37 | resolve(data)
38 | console.log(data)
39 | })
40 | })
41 | }
42 | module.exports = { dl }
43 |
--------------------------------------------------------------------------------
/server/anime.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 | const axios = require('axios')
4 | const fetch = require('node-fetch')
5 | const fs = require('fs')
6 | const { getBuffer } = require('../lib/function')
7 | const { dl } = require('../scraper/aiovideodl')
8 |
9 | const mynimeku = require('../scraper/mynime')
10 |
11 |
12 | async function sleep(ms) {
13 | return new Promise(resolve => setTimeout(resolve, ms));
14 | }
15 |
16 |
17 | router.get('/mynimekuSearch', async(req, res) => {
18 | var query = req.query.query
19 | if (!query) return res.json({ message: 'masukan parameter query' })
20 | var result = await mynimeku.Search(query)
21 | if (result > 1) return res.json({ message: 'anime not found!' })
22 | res.json(result)
23 | })
24 |
25 | router.get('/mynimekuDetail', async(req, res) => {
26 | var link = req.query.link
27 | if (!link) return res.json({ message: 'masukan parameter Link' })
28 | var result = await mynimeku.animeDetail(link)
29 | res.json(result)
30 | })
31 |
32 | router.get('/mynimekuDownload', async(req, res) => {
33 | var link = req.query.link
34 | if (!link) return res.json({ message: 'masukan parameter Link' })
35 | var result = await mynimeku.downloadEps(link)
36 | res.json(result)
37 | })
38 |
39 | router.get('/storyanime', async(req, res) => {
40 | let res_ = await fetch('https://raw.githubusercontent.com/Arya-was/endak-tau/main/storyanime.json')
41 | let data = await res_.json()
42 | let json = data[Math.floor(Math.random() * data.length)]
43 | var dl_link = await dl(json)
44 | const buffer = await getBuffer(dl_link.medias[0].url)
45 | await fs.writeFileSync(__path +`/tmp/audio.mp4`, buffer)
46 | await res.sendFile(__path +`/tmp/audio.mp4`)
47 | })
48 |
49 |
50 | module.exports = router
51 |
--------------------------------------------------------------------------------
/scraper/textpro.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const FormData = require('form-data');
3 | const { load } = require('cheerio');
4 | const fetch = require('node-fetch')
5 |
6 |
7 | //Copy disini punya Arul:v
8 | function textpro(url, text = []) {
9 | return new Promise(async(resolve, reject) => {
10 | const _token = await axios.get(url)
11 | const cookie = _token.headers['set-cookie'].toString()
12 | const $ = load(_token.data)
13 | const token = $('#token').attr('value')
14 | const build_server = $('#build_server').attr('value')
15 | const build_server_id = $('#build_server_id').attr('value')
16 | const form = new FormData()
17 | for (let texts of text) {
18 | form.append("text[]", texts);
19 | }
20 | form.append('submit', 'Go')
21 | form.append('token', token)
22 | form.append('build_server', build_server)
23 | form.append('build_server_id', build_server_id)
24 | let body = await form.getBuffer()
25 | const geturl2 = await fetch(url, {
26 | method: "POST",
27 | headers: {
28 | Accept: "/",
29 | "Accept-Language": "en-US,en;q=0.9",
30 | "User-Agent": "GoogleBot",
31 | Cookie: cookie,
32 | ...form.getHeaders(),
33 | },
34 | body: form.getBuffer(),
35 | })
36 | const caritoken2 = await geturl2.text();
37 | const $$ = load(caritoken2)
38 | const form2 = $$('#form_value').eq(0).text()
39 | let form_ = JSON.parse(form2)
40 | const json = await axios.request({
41 | url: "https://textpro.me/effect/create-image",
42 | method: "POST",
43 | data: new URLSearchParams(Object.entries( form_ )),
44 | headers: {
45 | Accept: "/",
46 | "Accept-Language": "en-US,en;q=0.9",
47 | "User-Agent": "GoogleBot",
48 | Cookie: cookie,
49 | }
50 | })
51 | resolve("https://textpro.me/" + json.data.fullsize_image)
52 | })
53 | }
54 |
55 | module.exports = {
56 | textpro
57 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # simple-api
2 |
3 | Pake aja buat belajar, saya pun masih belajar
4 | Tapi Jangan lupa nama creator (ɔ◔‿◔)ɔ ♥
5 | Yang mau nambahin bisa Pull request kalo ada yang Error bisa langsung buat Issue
6 | Enjoy~ <3
7 |
8 | ## 🛠️ Feature
9 | ```
10 | >> Play
11 | >> Youtube Downloader
12 | >> Tiktok Downloader
13 | >> Tiktok Nowatermark
14 | >> Tiktok Audio
15 | >> Instagram Downloader
16 | >> Instagram story Downloader
17 | >> Facebook Downloader
18 | >> Twitter Downloader
19 | >> Likee Downloader
20 | >> Pinterest Downloader
21 | >> Pixiv Downloader
22 | >> Solidfiles Downloadaer
23 | >> Mediafire Downloader
24 | >> Soundcloud Downloader
25 | >> Stickerpack Downloader
26 | >> Pinterest Search
27 | >> Alphacoders Search
28 | >> Wallpaperscraft Search
29 | >> Wallpapercave Search
30 | >> ZeroChan Search
31 | >> StickerPack Search
32 | >> Google Search
33 | >> Happymod Search
34 | >> Tiktok Search
35 | >> Random Search
36 | >> Artinama
37 | >> Ramal Jodoh
38 | >> Milf
39 | >> Waifu
40 | >> Husbu
41 | >> Loli
42 | >> Cosplay
43 | >> Neko
44 | >> Ass
45 | >> Bdsm
46 | >> Blowjob
47 | >> Cum
48 | >> Doujin
49 | >> Feet
50 | >> Femdom
51 | >> Foxgirl
52 | >> Gifs
53 | >> Glasses
54 | >> Hentai
55 | >> Netorare
56 | >> Maid
57 | >> Masturbation
58 | >> Orgy
59 | >> Panties
60 | >> Pussy
61 | >> School
62 | >> Succubus
63 | >> Tentacles
64 | >> Things
65 | >> Uglyblastard
66 | >> Uniform
67 | >> Yuri
68 | >> Zettairyouiki
69 | >> Doujindesu Search
70 | >> Nhentai Search
71 | >> Nhentai Info
72 | >> Nhentai Downloader
73 | >> Tebak Gambar
74 | >> jpg To webp
75 | >> Mp4 To mp3
76 | >> Nulis Buku
77 | >> Text to Picture
78 | >> Text to Gif
79 | >> ScreenShoot web
80 | >> Remove bg
81 | >> Merdeka News
82 | >> Meme (Meme Engglish)
83 | >> Qrcode Creator
84 | >> Hilih Generator
85 | ```
86 |
87 | ## Thanks To
88 | * [`indrijunanda`](https://github.com/indrijunanda/RuangAdmin)
89 | * Anu-Team
90 |
--------------------------------------------------------------------------------
/scraper/solidfiles.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | function sfiledl(URL) {
5 | return new Promise((resolve, reject) => {
6 | axios.request({
7 | url: URL,
8 | method: "GET",
9 | headers: {
10 | "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36",
11 | "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
12 | }
13 | }).then(res => {
14 | const $ = cheerio.load(res.data)
15 | const token = $('#content > div > div.middle > div.right > article:nth-child(1) > section:nth-child(3) > div.buttons > form > input[type=hidden]:nth-child(1)').attr('value')
16 | const title = $('#content > div > div.middle > div.right > article:nth-child(1) > section.box-content.meta > h1').text().trim()
17 | const _size = $('#content > div > div.middle > div.right > article:nth-child(1) > section.box-content.meta > p').text().trim()
18 | const size_ = _size.split('-')
19 | const size = size_[0]
20 | axios({
21 | url: URL+'/dl',
22 | method: "POST",
23 | data: new URLSearchParams(Object.entries({csrfmiddlewaretoken: token, referrer: URL})),
24 | headers: {
25 | "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36",
26 | "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
27 | }
28 | }).then(respon => {
29 | const ch = cheerio.load(respon.data)
30 | const url = ch('#content > div > div.middle > div.right > article:nth-child(1) > section > p > a').attr('href')
31 | const result = {
32 | title: title,
33 | size: size,
34 | url: url
35 | }
36 | resolve(result)
37 | })
38 | })
39 | })
40 | }
41 | module.exports = sfiledl
--------------------------------------------------------------------------------
/scraper/pinterest.js:
--------------------------------------------------------------------------------
1 | const cheerio = require('cheerio')
2 | const axios = require('axios')
3 |
4 | function pinterest(querry){
5 | return new Promise(async(resolve,reject) => {
6 | axios.get('https://id.pinterest.com/search/pins/?autologin=true&q=' + querry, {
7 | headers: {
8 | "cookie" : "_auth=1; _b=\"AVna7S1p7l1C5I9u0+nR3YzijpvXOPc6d09SyCzO+DcwpersQH36SmGiYfymBKhZcGg=\"; _pinterest_sess=TWc9PSZHamJOZ0JobUFiSEpSN3Z4a2NsMk9wZ3gxL1NSc2k2NkFLaUw5bVY5cXR5alZHR0gxY2h2MVZDZlNQalNpUUJFRVR5L3NlYy9JZkthekp3bHo5bXFuaFZzVHJFMnkrR3lTbm56U3YvQXBBTW96VUgzVUhuK1Z4VURGKzczUi9hNHdDeTJ5Y2pBTmxhc2owZ2hkSGlDemtUSnYvVXh5dDNkaDN3TjZCTk8ycTdHRHVsOFg2b2NQWCtpOWxqeDNjNkk3cS85MkhhSklSb0hwTnZvZVFyZmJEUllwbG9UVnpCYVNTRzZxOXNJcmduOVc4aURtM3NtRFo3STlmWjJvSjlWTU5ITzg0VUg1NGhOTEZzME9SNFNhVWJRWjRJK3pGMFA4Q3UvcHBnWHdaYXZpa2FUNkx6Z3RNQjEzTFJEOHZoaHRvazc1c1UrYlRuUmdKcDg3ZEY4cjNtZlBLRTRBZjNYK0lPTXZJTzQ5dU8ybDdVS015bWJKT0tjTWYyRlBzclpiamdsNmtpeUZnRjlwVGJXUmdOMXdTUkFHRWloVjBMR0JlTE5YcmhxVHdoNzFHbDZ0YmFHZ1VLQXU1QnpkM1FqUTNMTnhYb3VKeDVGbnhNSkdkNXFSMXQybjRGL3pyZXRLR0ZTc0xHZ0JvbTJCNnAzQzE0cW1WTndIK0trY05HV1gxS09NRktadnFCSDR2YzBoWmRiUGZiWXFQNjcwWmZhaDZQRm1UbzNxc21pV1p5WDlabm1UWGQzanc1SGlrZXB1bDVDWXQvUis3elN2SVFDbm1DSVE5Z0d4YW1sa2hsSkZJb1h0MTFpck5BdDR0d0lZOW1Pa2RDVzNySWpXWmUwOUFhQmFSVUpaOFQ3WlhOQldNMkExeDIvMjZHeXdnNjdMYWdiQUhUSEFBUlhUVTdBMThRRmh1ekJMYWZ2YTJkNlg0cmFCdnU2WEpwcXlPOVZYcGNhNkZDd051S3lGZmo0eHV0ZE42NW8xRm5aRWpoQnNKNnNlSGFad1MzOHNkdWtER0xQTFN5Z3lmRERsZnZWWE5CZEJneVRlMDd2VmNPMjloK0g5eCswZUVJTS9CRkFweHc5RUh6K1JocGN6clc1JmZtL3JhRE1sc0NMTFlpMVErRGtPcllvTGdldz0=; _ir=0"
9 | }
10 | }).then(({ data }) => {
11 | const $ = cheerio.load(data)
12 | const result = [];
13 | const hasil = [];
14 | $('div > a').get().map(b => {
15 | const link = $(b).find('img').attr('src')
16 | result.push(link)
17 | });
18 | result.forEach(v => {
19 | if(v == undefined) return
20 | hasil.push(v.replace(/236/g,'736'))
21 | })
22 | hasil.shift();
23 | resolve(hasil)
24 | })
25 | })
26 | }
27 |
28 | module.exports = pinterest
--------------------------------------------------------------------------------
/lib/converter.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const path = require('path')
3 | const { spawn } = require('child_process')
4 |
5 | function ffmpeg(buffer, args = [], ext = '', ext2 = '') {
6 | return new Promise(async (resolve, reject) => {
7 | try {
8 | let tmp = path.join(__dirname, '../tmp', + new Date + '.' + ext)
9 | let out = tmp + '.' + ext2
10 | await fs.promises.writeFile(tmp, buffer)
11 | spawn('ffmpeg', [
12 | '-y',
13 | '-i', tmp,
14 | ...args,
15 | out
16 | ])
17 | .on('error', reject)
18 | .on('close', async (code) => {
19 | try {
20 | await fs.promises.unlink(tmp)
21 | if (code !== 0) return reject(code)
22 | resolve(await fs.promises.readFile(out))
23 | await fs.promises.unlink(out)
24 | } catch (e) {
25 | reject(e)
26 | }
27 | })
28 | } catch (e) {
29 | reject(e)
30 | }
31 | })
32 | }
33 |
34 | /**
35 | * Convert Audio to Playable WhatsApp Audio
36 | * @param {Buffer} buffer Audio Buffer
37 | * @param {String} ext File Extension
38 | */
39 | function toAudio(buffer, ext) {
40 | return ffmpeg(buffer, [
41 | '-vn',
42 | '-ac', '2',
43 | '-b:a', '128k',
44 | '-ar', '44100',
45 | '-f', 'mp3'
46 | ], ext, 'mp3')
47 | }
48 |
49 | /**
50 | * Convert Audio to Playable WhatsApp PTT
51 | * @param {Buffer} buffer Audio Buffer
52 | * @param {String} ext File Extension
53 | */
54 | function toPTT(buffer, ext) {
55 | return ffmpeg(buffer, [
56 | '-vn',
57 | '-c:a', 'libopus',
58 | '-b:a', '128k',
59 | '-vbr', 'on',
60 | '-compression_level', '10'
61 | ], ext, 'opus')
62 | }
63 |
64 | /**
65 | * Convert Audio to Playable WhatsApp Video
66 | * @param {Buffer} buffer Video Buffer
67 | * @param {String} ext File Extension
68 | */
69 | function toVideo(buffer, ext) {
70 | return ffmpeg(buffer, [
71 | '-c:v', 'libx264',
72 | '-c:a', 'aac',
73 | '-ab', '128k',
74 | '-ar', '44100',
75 | '-crf', '32',
76 | '-preset', 'slow'
77 | ], ext, 'mp4')
78 | }
79 |
80 | module.exports = {
81 | toAudio,
82 | toPTT,
83 | toVideo,
84 | ffmpeg,
85 | }
86 |
--------------------------------------------------------------------------------
/scraper/wallpaper.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | function alphacoders(query) {
5 | return new Promise((resolve, reject) => {
6 | axios.get('https://wall.alphacoders.com/search.php?search='+query).then(res => {
7 | const $ = cheerio.load(res.data)
8 | const result = []
9 | $('div.boxgrid > a > picture').each(function(a, b) {
10 | result.push($(b).find('img').attr('src').replace('thumbbig-', ''))
11 | })
12 | resolve(result)
13 | }).catch(reject)
14 | })
15 | }
16 |
17 | function wallpaperflare(query) {
18 | return new Promise((resolve, reject) => {
19 | axios.get('https://www.wallpaperflare.com/search?wallpaper='+ query,{
20 | headers: {
21 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
22 | "cookie": "_ga=GA1.2.863074474.1624987429; _gid=GA1.2.857771494.1624987429; __gads=ID=84d12a6ae82d0a63-2242b0820eca0058:T=1624987427:RT=1624987427:S=ALNI_MaJYaH0-_xRbokdDkQ0B49vSYgYcQ"
23 | }
24 | })
25 | .then(res => {
26 | const $ = cheerio.load(res.data)
27 | const result = [];
28 | $('#gallery > li > figure > a').each(function(a, b) {
29 | result.push($(b).find('img').attr('data-src'))
30 | })
31 | resolve(result)
32 | }).catch(reject)
33 | })
34 | }
35 |
36 | function wallpaperscraft(query) {
37 | return new Promise((resolve, reject) => {
38 | axios.get('https://wallpaperscraft.com/search/?query='+query).then(res => {
39 | const $ = cheerio.load(res.data)
40 | const result = [];
41 | $('span.wallpapers__canvas').each(function(a, b) {
42 | result.push($(b).find('img').attr('src'))
43 | })
44 | resolve(result)
45 | }).catch(reject)
46 | })
47 | }
48 |
49 |
50 | function wallpapercave(query) {
51 | return new Promise((resolve, reject) => {
52 | axios.get('https://wallpapercave.com/search?q='+query).then(res => {
53 | const $ = cheerio.load(res.data)
54 | const result = [];
55 | $('div.imgrow > a').each(function(a, b) {
56 | if (!$(b).find('img').attr('src').includes('.gif')) {
57 | result.push('https://wallpapercave.com/' + $(b).find('img').attr('src').replace('fuwp', 'uwp'))
58 | }
59 | })
60 | resolve(result)
61 | }).catch(reject)
62 | })
63 | }
64 |
65 | module.exports = { wallpapercave, wallpaperscraft, wallpaperflare, alphacoders }
66 |
--------------------------------------------------------------------------------
/server/convert.js:
--------------------------------------------------------------------------------
1 | __path = process.cwd()
2 | const express = require("express");
3 | const fs = require('fs');
4 | const fetch = require('node-fetch')
5 | const FileType = require('file-type')
6 | const router = express.Router()
7 | const { ffmpeg, toAudio } = require('../lib/converter')
8 |
9 | //Get Buffer
10 | async function getFile(path) {
11 | let res
12 | let data = Buffer.isBuffer(path) ? path : /^data:.*?\/.*?;base64,/i.test(path) ? Buffer.from(path.split`,`[1], 'base64') : /^https?:\/\//.test(path) ? await (res = await fetch(path)).buffer() : fs.existsSync(path) ? fs.readFileSync(path) : typeof path === 'string' ? path : Buffer.alloc(0)
13 | if (!Buffer.isBuffer(data)) throw new TypeError('Result is not a buffer')
14 | let type = await FileType.fromBuffer(data) || {
15 | mime: 'application/octet-stream',
16 | ext: '.bin'
17 | }
18 |
19 | return {
20 | res,
21 | ...type,
22 | data
23 | }
24 | }
25 |
26 | /**
27 | * Image to Webp
28 | * @param {String} url Image/Video URL
29 | */
30 | async function sticker(url) {
31 | if (url) {
32 | let res = await fetch(url)
33 | if (res.status !== 200) throw await res.text()
34 | img = await res.buffer()
35 | }
36 | return await ffmpeg(img, [
37 | '-vf', 'scale=512:512:flags=lanczos:force_original_aspect_ratio=decrease,format=rgba,pad=512:512:(ow-iw)/2:(oh-ih)/2:color=#00000000,setsar=1'
38 | ], 'jpeg', 'webp')
39 | }
40 |
41 | router.get('/towebp', async(req, res) => {
42 | var url = req.query.url
43 | var packname = req.query.packname
44 | var creator = req.query.creator
45 | var stc = await sticker(url)
46 | await fs.writeFileSync(__path + '/tmp/stc.webp', stc)
47 | await res.sendFile(__path + '/tmp/stc.webp')
48 | })
49 | router.get('/tomp3', async(req, res) => {
50 | var url = req.query.url
51 | const Buffer = await fetch(url)
52 | const getBuffer = await Buffer.buffer()
53 | let audio = await toAudio(getBuffer, 'mp4')
54 | await fs.writeFileSync(__path + '/tmp/audio.mp3', audio)
55 | await res.sendFile(__path + '/tmp/audio.mp3')
56 | })
57 | router.get('/toFile', async(req, res) => {
58 | var url = req.query.url
59 | const buffer = await getFile(url)
60 | fs.writeFileSync(__path+ `/tmp/temp.${buffer.ext}`, buffer.data)
61 | res.sendFile(__path+ `/tmp/temp.${buffer.ext}`)
62 | })
63 |
64 | //Hilih Generator
65 | router.get('/hilih', async(req, res) => {
66 | var kata = req.query.msg
67 | if(!kata) return res.json({ message: `Masukan Parameter msg` })
68 | const lower = /[aiueo]/g
69 | const upper = /[AIUEO]/g
70 | const good = kata.replace(lower, 'i').replace(upper, 'I')
71 | res.json({ status: 200, message: good })
72 | })
73 |
74 | module.exports = router
75 |
--------------------------------------------------------------------------------
/scraper/musicaldown.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 |
5 | async function musicaldown(URL) {
6 | return new Promise((resolve, rejecet) => {
7 | axios.get('https://musicaldown.com/id', {
8 | headers: {
9 | 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
10 | }
11 | }).then(res => {
12 | const $ = cheerio.load(res.data)
13 | const url_name = $("#link_url").attr("name")
14 | const token_name = $("#submit-form > div").find("div:nth-child(1) > input[type=hidden]:nth-child(2)").attr("name")
15 | const token_ = $("#submit-form > div").find("div:nth-child(1) > input[type=hidden]:nth-child(2)").attr("value")
16 | const verify = $("#submit-form > div").find("div:nth-child(1) > input[type=hidden]:nth-child(3)").attr("value")
17 | let data = {
18 | [`${url_name}`]: URL,
19 | [`${token_name}`]: token_,
20 | verify: verify
21 | }
22 | axios.request({
23 | url: 'https://musicaldown.com/id/download',
24 | method: 'post',
25 | data: new URLSearchParams(Object.entries(data)),
26 | headers: {
27 | 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
28 | 'cookie': res.headers["set-cookie"]
29 | }
30 | }).then(respon => {
31 | const ch = cheerio.load(respon.data)
32 | axios.request({
33 | url: 'https://musicaldown.com/id/mp3',
34 | method: 'post',
35 | headers: {
36 | 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
37 | 'cookie': res.headers["set-cookie"]
38 | }
39 | }).then(resaudio => {
40 | const hc = cheerio.load(resaudio.data)
41 | const result = {
42 | creator: 'Arya-kun >///<',
43 | video: ch('body > div.welcome.section > div > div:nth-child(2) > div.col.s12.l8 > a:nth-child(5)').attr('href'),
44 | audio: hc('body > div.welcome.section > div > div:nth-child(2) > div.col.s12.l8 > a:nth-child(5)').attr('href'),
45 | video_original: ch('body > div.welcome.section > div > div:nth-child(2) > div.col.s12.l8 > a:nth-child(9)').attr('href'),
46 | audio_original: hc('body > div.welcome.section > div > div:nth-child(2) > div.col.s12.l8 > a:nth-child(9)').attr('href'),
47 | preview: ch('body > div.welcome.section > div > div:nth-child(2) > div.col.s12.l4 > img').attr('src')
48 | }
49 | resolve(result)
50 | })
51 | })
52 | })
53 | })
54 | }
55 |
56 | module.exports = { musicaldown }
57 |
--------------------------------------------------------------------------------
/scraper/joox.js:
--------------------------------------------------------------------------------
1 | const axios = require("axios")
2 |
3 | function joox(query) {
4 | return new Promise((resolve, reject) => {
5 | const time = Math.floor(new Date() / 1000)
6 | axios.get('http://api.joox.com/web-fcgi-bin//web_search?lang=id&country=id&type=0&search_input=' + query + '&pn=1&sin=0&ein=29&_=' + time)
7 | .then(({ data }) => {
8 | let result = []
9 | let hasil = []
10 | let promoses = []
11 | let ids = []
12 | data.itemlist.forEach(result => {
13 | ids.push(result.songid)
14 | });
15 | for (let i = 0; i < data.itemlist.length; i++) {
16 | const get = 'http://api.joox.com/web-fcgi-bin/web_get_songinfo?songid=' + ids[i]
17 | promoses.push(
18 | axios.get(get, {
19 | headers: {
20 | Cookie: 'wmid=142420656; user_type=1; country=id; session_key=2a5d97d05dc8fe238150184eaf3519ad;'
21 | }
22 | })
23 | .then(({ data }) => {
24 | const res = JSON.parse(data.replace('MusicInfoCallback(', '').replace('\n)', ''))
25 | hasil.push({
26 | lagu: res.msong,
27 | album: res.malbum,
28 | penyanyi: res.msinger,
29 | publish: res.public_time,
30 | img: res.imgSrc,
31 | mp3: res.mp3Url
32 | })
33 | Promise.all(promoses).then(() => resolve({
34 | status: true,
35 | data: hasil,
36 | }))
37 | }).catch(reject)
38 | )
39 | }
40 | }).catch(reject)
41 | })
42 | }
43 | function jooxdl (url) {
44 | const URL = url.replace('https://www.joox.com/id/single/', '')
45 | return new Promise((resolve, reject) => {
46 | axios.get('http://api.joox.com/web-fcgi-bin/web_get_songinfo?songid='+URL, {
47 | headers: {
48 | Cookie: 'wmid=142420656; user_type=1; country=id; session_key=2a5d97d05dc8fe238150184eaf3519ad;'
49 | }
50 | }).then(res => {
51 | const result = JSON.parse(res.data.replace('MusicInfoCallback(', '').replace('\n)', ''))
52 | const hasil = {
53 | lagu: result.msong,
54 | album: result.malbum,
55 | penyanyi: result.msinger,
56 | publish: result.public_time,
57 | img: result.imgSrc,
58 | mp3: result.mp3Url
59 | }
60 | resolve(hasil)
61 | }).catch(reject)
62 | })
63 | }
64 | module.exports = { jooxdl, joox }
65 |
--------------------------------------------------------------------------------
/server/nsfw.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 | __path = process.cwd()
4 | var nhentai = require('nhentai-js');
5 | const NanaAPI = require('nana-api')
6 | const nana = new NanaAPI()
7 | const axios = require('axios')
8 | const { toPDF } = require(__path + '/lib/img2pdf')
9 | const fs = require('fs')
10 |
11 | async function sleep(ms) {
12 | return new Promise(resolve => setTimeout(resolve, ms));
13 | }
14 |
15 | const { doujindesu } = require('../scraper/index')
16 |
17 | router.get('/nHentai', async (req, res) => {
18 | var code = req.query.code
19 | var result = await nhentai.getDoujin(`${code}`)
20 | res.json({ result })
21 | })
22 | router.get('/nHentaiSearch', async (req, res) => {
23 | var query = req.query.query
24 | var hasil = await nana.search(`${query}`)
25 | var result = hasil.results
26 | res.json({ result })
27 | })
28 | router.get('/doujindesuSearch', async (req, res) => {
29 | var query = req.query.query
30 | var hasil = await doujindesu(`${query}`)
31 | res.json(hasil)
32 | })
33 | router.get('/nhentaipdf', async (req, res) => {
34 | var code = req.query.code
35 | var nhres = `https://tyz-api.herokuapp.com/nsfw/nhcode?query=${code}`
36 | var nhread = `https://tyz-api.herokuapp.com/nsfw/nhread?query=${code}`
37 | res.json({
38 | pdf: nhres,
39 | read: nhread,
40 | note: 'dosa di tanggung sendiri!'
41 | })
42 | })
43 | router.get('/nhcode', async (req, res) => {
44 | try {
45 | var query = req.query.query
46 | let data = await axios.get('https://tyz-api.herokuapp.com/nsfw/nHentai?code='+query)
47 | let restjson = data.data.result.pages
48 | let title = data.data.result.title
49 | let duckJson = await restjson.map(a => 'https://external-content.duckduckgo.com/iu/?u=' + a)
50 | let jsonTopdf = await toPDF(duckJson)
51 | await fs.writeFileSync(__path + `/tmp/${title}.pdf`, jsonTopdf)
52 | await res.sendFile(__path + `/tmp/${title}.pdf`)
53 | await sleep(3000)
54 | await fs.unlinkSync(__path + `/tmp/${title}.pdf`)
55 | } catch(err) {
56 | res.json({ error: err.message })
57 | }
58 | })
59 | router.get('/nhread', async(req, res) => {
60 | var query = req.query.query
61 | let data = await axios.get('https://tyz-api.herokuapp.com/nsfw/nHentai?code='+query)
62 | let restjson = data.data.result.pages
63 | let title = data.data.result.title
64 | let duckJson = await restjson.map(a => 'https://external-content.duckduckgo.com/iu/?u=' + a)
65 | let html = `
66 |
67 |
68 |
69 | ${title}
70 |
91 |
92 |
93 | `
94 | for(let url of duckJson) html += `
`
95 | res.send(html)
96 | })
97 | module.exports = router
98 |
--------------------------------------------------------------------------------
/server/randomimage.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 | const { getBuffer } = require('../lib/function')
4 | const axios = require('axios')
5 | const fs = require('fs')
6 | const akaneko = require('../scraper/akaneko')
7 | __path = process.cwd()
8 |
9 | async function sleep(ms) {
10 | return new Promise(resolve => setTimeout(resolve, ms));
11 | }
12 |
13 | router.get('/akaneko', async(req, res) => {
14 | var param = req.query.param
15 | if (!param) return res.json({ message: 'masukan parameter param' })
16 | const result = await akaneko.akanekoApi(param)
17 | data = await getBuffer(result)
18 | await fs.writeFileSync(__path +'/tmp/image.png', data)
19 | await res.sendFile(__path +'/tmp/image.png')
20 | await sleep(3000)
21 | await fs.unlinkSync(__path + '/tmp/image.png')
22 | })
23 | router.get('/waifu', async(req, res) => {
24 | var waif = (await axios.get(`https://raw.githubusercontent.com/Arya-was/endak-tau/main/waifu.json`)).data
25 | const result = waif[Math.floor(Math.random() * (waif.length))]
26 | data = await getBuffer(result)
27 | await fs.writeFileSync(__path +'/tmp/waifu.png', data)
28 | await res.sendFile(__path +'/tmp/waifu.png')
29 | await sleep(3000)
30 | await fs.unlinkSync(__path + '/tmp/waifu.png')
31 | })
32 | router.get('/husbu', async(req, res) => {
33 | var waif = (await axios.get(`https://raw.githubusercontent.com/Arya-was/endak-tau/main/husbu.json`)).data
34 | const result = waif[Math.floor(Math.random() * (waif.length))]
35 | data = await getBuffer(result)
36 | await fs.writeFileSync(__path +'/tmp/waifu.png', data)
37 | await res.sendFile(__path +'/tmp/waifu.png')
38 | await sleep(3000)
39 | await fs.unlinkSync(__path + '/tmp/waifu.png')
40 | })
41 | router.get('/loli', async(req, res) => {
42 | var waif = (await axios.get(`https://raw.githubusercontent.com/Arya-was/endak-tau/main/loli.json`)).data
43 | const result = waif[Math.floor(Math.random() * (waif.length))]
44 | data = await getBuffer(result)
45 | await fs.writeFileSync(__path +'/tmp/waifu.png', data)
46 | await res.sendFile(__path +'/tmp/waifu.png')
47 | await sleep(3000)
48 | await fs.unlinkSync(__path + '/tmp/waifu.png')
49 | })
50 | router.get('/milf', async(req, res) => {
51 | var waif = (await axios.get(`https://raw.githubusercontent.com/Arya-was/endak-tau/main/milf.json`)).data
52 | const result = waif[Math.floor(Math.random() * (waif.length))]
53 | data = await getBuffer(result)
54 | await fs.writeFileSync(__path +'/tmp/waifu.png', data)
55 | await res.sendFile(__path +'/tmp/waifu.png')
56 | await sleep(3000)
57 | await fs.unlinkSync(__path + '/tmp/waifu.png')
58 | })
59 | router.get('/cosplay', async(req, res) => {
60 | var waif = (await axios.get(`https://raw.githubusercontent.com/Arya-was/endak-tau/main/cosplay.json`)).data
61 | const result = waif[Math.floor(Math.random() * (waif.length))]
62 | data = await getBuffer(result)
63 | await fs.writeFileSync(__path +'/tmp/waifu.png', data)
64 | await res.sendFile(__path +'/tmp/waifu.png')
65 | await sleep(3000)
66 | await fs.unlinkSync(__path + '/tmp/waifu.png')
67 | })
68 |
69 | module.exports = router
70 |
--------------------------------------------------------------------------------
/scraper/ytdl.js:
--------------------------------------------------------------------------------
1 | let fetch = require('node-fetch')
2 | let { JSDOM } = require('jsdom')
3 |
4 | function post(url, formdata) {
5 | return fetch(url, {
6 | method: 'POST',
7 | headers: {
8 | accept: "*/*",
9 | 'accept-language': "en-US,en;q=0.9",
10 | 'content-type': "application/x-www-form-urlencoded; charset=UTF-8"
11 | },
12 | body: new URLSearchParams(Object.entries(formdata))
13 | })
14 | }
15 | const ytIdRegex = /(?:http(?:s|):\/\/|)(?:(?:www\.|)youtube(?:\-nocookie|)\.com\/(?:shorts\/)?(?:watch\?.*(?:|\&)v=|embed\/|v\/)|youtu\.be\/)([-_0-9A-Za-z]{11})/
16 |
17 | /**
18 | * Download YouTube Video via y2mate
19 | * @param {String} url YouTube Video URL
20 | * @param {String} quality (avaiable: `144p`, `240p`, `360p`, `480p`, `720p`, `1080p`, `1440p`, `2160p`)
21 | * @param {String} type (avaiable: `mp3`, `mp4`)
22 | * @param {String} bitrate (avaiable for video: `144`, `240`, `360`, `480`, `720`, `1080`, `1440`, `2160`)
23 | * (avaiable for audio: `128`)
24 | * @param {String} server (avaiable: `id4`, `en60`, `en61`, `en68`)
25 | */
26 | async function yt(url, quality, type, bitrate, server = 'en68') {
27 | if (!ytIdRegex.test(url)) throw 'Invalid URL'
28 | let ytId = ytIdRegex.exec(url)
29 | url = 'https://youtu.be/' + ytId[1]
30 | let res = await post(`https://www.y2mate.com/mates/${server}/analyze/ajax`, {
31 | url,
32 | q_auto: 0,
33 | ajax: 1
34 | })
35 | let json = await res.json()
36 | let { document } = (new JSDOM(json.result)).window
37 | let tables = document.querySelectorAll('table')
38 | let table = tables[{ mp4: 0, mp3: 1 }[type] || 0]
39 | let list
40 | switch (type) {
41 | case 'mp4':
42 | list = Object.fromEntries([...table.querySelectorAll('td > a[href="#"]')].filter(v => !/\.3gp/.test(v.innerHTML)).map(v => [v.innerHTML.match(/.*?(?=\()/)[0].trim(), v.parentElement.nextSibling.nextSibling.innerHTML]))
43 | break
44 | case 'mp3':
45 | list = {
46 | '128kbps': table.querySelector('td > a[href="#"]').parentElement.nextSibling.nextSibling.innerHTML
47 | }
48 | break
49 | default:
50 | list = {}
51 | }
52 | let filesize = list[quality]
53 | let id = /var k__id = "(.*?)"/.exec(document.body.innerHTML) || ['', '']
54 | let thumb = document.querySelector('img').src
55 | let title = document.querySelector('b').innerHTML
56 | let res2 = await post(`https://www.y2mate.com/mates/${server}/convert`, {
57 | type: 'youtube',
58 | _id: id[1],
59 | v_id: ytId[1],
60 | ajax: '1',
61 | token: '',
62 | ftype: type,
63 | fquality: bitrate
64 | })
65 | let json2 = await res2.json()
66 | let KB = parseFloat(filesize) * (1000 * /MB$/.test(filesize))
67 | return {
68 | dl_link: / {
9 | var text = req.query.text
10 | if (!text) return res.json({ 'message': 'masukan parameter text!'})
11 | const data = await getBuffer(`https://rya-kun.herokuapp.com/api/nulis?text=${text}`)
12 | await fs.writeFileSync(__path +'/tmp/nulis.png', data)
13 | await res.sendFile(__path +'/tmp/nulis.png')
14 | })
15 |
16 | router.get('/ttp', async(req, res) => {
17 | var text = req.query.text
18 | if (!text) return res.json({ 'message': 'masukan parameter text!'})
19 | const data = await getBuffer(`https://rya-kun.herokuapp.com/api/ttp?text=${text}`)
20 | await fs.writeFileSync(__path +'/tmp/ttp.png', data)
21 | await res.sendFile(__path +'/tmp/ttp.png')
22 | })
23 |
24 | router.get('/attp', async(req, res) => {
25 | var text = req.query.text
26 | if (!text) return res.json({ 'message': 'masukan parameter text!'})
27 | const data = await getBuffer(`https://rya-kun.herokuapp.com/api/attp?text=${text}`)
28 | await fs.writeFileSync(__path +'/tmp/attp.png', data)
29 | await res.sendFile(__path +'/tmp/attp.png')
30 | })
31 |
32 |
33 | router.get('/removebg', async(req, res) => {
34 | var link = req.query.link
35 | if (!link) return res.json({ 'message': 'masukan parameter link!'})
36 | const data = await getBuffer(`https://rya-kun.herokuapp.com/api/removebg?link=${link}`)
37 | await fs.writeFileSync(__path +'/tmp/removebg.png', data)
38 | await res.sendFile(__path +'/tmp/removebg.png')
39 | })
40 |
41 | router.get('/ssweb', async(req, res) => {
42 | var link = req.query.link
43 | if (!link) return res.json({ 'message': 'masukan parameter link!'})
44 | const data = await getBuffer(`https://rya-kun.herokuapp.com/api/ssweb?link=${link}`)
45 | await fs.writeFileSync(__path +'/tmp/ssweb.png', data)
46 | await res.sendFile(__path +'/tmp/ssweb.png')
47 | })
48 |
49 | router.get('/merdeka', async(req, res) => {
50 | const result = await merdekaNews()
51 | res.json({ result })
52 | })
53 |
54 | //Qrcode
55 | router.get("/qrcode", (req, res) => {
56 | var qr = require('qr-image')
57 | var text = req.query.text
58 | if(!text) return res.json({ message: 'Masukan Kata!' })
59 | var img = qr.image(text,{size :13});
60 | res.writeHead(200, {'Content-Type': 'image/png'});
61 | img.pipe(res);
62 | });
63 |
64 | //Meme
65 | router.get('/meme', async (req, res) => {
66 | const fetch = require('node-fetch')
67 | const subReddits = ["dankmeme", "meme", "memes"];
68 | const random = Math.floor(Math.random() * subReddits.length)
69 | var body = await fetch('https://www.reddit.com/r/' + subReddits[random] + '/random/.json')
70 | body = await body.json()
71 | const a = body[0]
72 | const title = a.data.children[0].data.title
73 | const url = 'https://reddit.com'+a.data.children[0].data.permalink
74 | const link = a.data.children[0].data.url_overridden_by_dest
75 | const ups = a.data.children[0].data.ups
76 | const comments = a.data.children[0].data.num_comments
77 | const sub = a.data.children[0].data.subreddit_name_prefixed
78 | const preview = a.data.children[0].data.preview
79 | return res.json({
80 | status: true,
81 | title: title,
82 | url: url,
83 | image: link,
84 | ups: ups,
85 | comments: comments
86 | });
87 | })
88 |
89 | module.exports = router
90 |
--------------------------------------------------------------------------------
/scraper/savetik.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | const pickrandom = async(ext) => {
5 | return ext[Math.floor(Math.random() * ext.length)]
6 | }
7 | const getRandom = () => {
8 | return `${Math.floor(Math.random() * 284)}`
9 | }
10 |
11 | function savetik(URL) {
12 | return new Promise((resolve, reject) => {
13 | axios.request({
14 | url: 'https://savetiknowm.org/',
15 | method: "POST",
16 | data: new URLSearchParams(Object.entries({ tiktok_url: URL })),
17 | headers: {
18 | "content-type": "application/x-www-form-urlencoded",
19 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
20 | }
21 | }).then(res => {
22 | const $ = cheerio.load(res.data)
23 | const result = {
24 | creator: {
25 | username: $('#tiktok-video-result > div.result-wrapper > div.result > div:nth-child(2) > div > a.username').text(),
26 | usernickname: $('#tiktok-video-result > div.result-wrapper > div.result > div:nth-child(2) > div > a.user-nickname').text(),
27 | desc: $('#tiktok-video-result > div.result-wrapper > div.result > div:nth-child(2) > p').text(),
28 | },
29 | url: 'https://savetiknowm.org'+$('#tiktok-video-result > div.result-wrapper > div.download-buttons > a').attr('href')
30 | }
31 | console.log(result)
32 | resolve(result)
33 | }).catch(reject)
34 | })
35 | }
36 |
37 | function savetikGetVideosUrl() {
38 | return new Promise(async(resolve, reject) => {
39 | const randomPage = getRandom()
40 | const result = []
41 | axios.request({
42 | url: 'https://savetiknowm.org/videos',
43 | method: 'GET',
44 | headers: {
45 | "content-type": "application/x-www-form-urlencoded",
46 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
47 | }
48 | }).then(res => {
49 | const ch = cheerio.load(res.data)
50 | ch('body > div.videos-grid > div').each(function(a, b) {
51 | const thumb = ch(b).find('a > div').attr('data-bg')
52 | const creator = ch(b).find('a').attr('href')
53 | const url1 = thumb.replace('/static/nowatermark/previews/', '').replace('.jpg', '')
54 | const url = creator+'/'+url1
55 | result.push({ thumb, creator, url })
56 | resolve(result)
57 | })
58 | }).catch(reject)
59 | })
60 | }
61 |
62 | function savetikVideo() {
63 | return new Promise(async(resolve, reject) => {
64 | const Url = await savetikGetVideosUrl()
65 | const getUrl = await pickrandom(Url)
66 | const getURL = 'https://savetiknowm.org'+getUrl.url
67 | axios.request({
68 | url: getURL,
69 | method: 'GET',
70 | headers: {
71 | "content-type": "application/x-www-form-urlencoded",
72 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
73 | }
74 | }).then(res => {
75 | const $ = cheerio.load(res.data)
76 | const result = {
77 | creator: {
78 | profile: 'https://savetiknowm.org'+$('#tiktok-video-result > div > div.result > div:nth-child(2) > div.profile > img').attr('src'),
79 | username: $('#tiktok-video-result > div > div.result > div:nth-child(2) > div.profile > a.username').text(),
80 | nickname: $('#tiktok-video-result > div > div.result > div:nth-child(2) > div.profile > a.user-nickname').text(),
81 | },
82 | url_dl: $('#tiktok-video-result > div > div.download-buttons > a').attr('href'),
83 | desc: $('#tiktok-video-result > div > div.result > div:nth-child(2) > p').text(),
84 | likes: $('#tiktok-video-result > div > div.result > div:nth-child(2) > ul > li > span').text()
85 | }
86 | resolve(result)
87 | })
88 | })
89 | }
90 |
91 | module.exports = { savetik, savetikVideo }
92 |
--------------------------------------------------------------------------------
/scraper/tiktok.js:
--------------------------------------------------------------------------------
1 | const tiktok_scrape = require('tiktok-scraper')
2 | const axios = require('axios')
3 | const cheerio = require('cheerio')
4 | const fetch = require('node-fetch')
5 | const { musicaldown } = require('./musicaldown')
6 |
7 | const headers = {
8 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
9 | "referer": "https://www.tiktok.com/",
10 | "cookie": "tt_webid_v2=6976572065375626290; ttwid=1|WphZXEIq_oTph3Rcy7Ybj7o2YmzOAhfdWm23L35UL7Q|1634565622|26309b01156f00c630959974d6ff872e1c6b5d6f6275cbe3aac6738e4f6d50f5; tt_webid=6976572065375626290; tt_csrf_token=KOCPsah2eI6vhK6-F_73Uben; cmpl_token=AgQQAPOgF-RMpbF7dxi_PJ07-rBaZ9U_nbArYPwp_A"
11 | }
12 |
13 | async function noWM (Url) {
14 | return new Promise (async (resolve, reject) => {
15 | await axios.request({
16 | url: "https://ttdownloader.com/",
17 | method: "GET",
18 | headers: {
19 | "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9",
20 | "accept-language": "en-US,en;q=0.9,id;q=0.8",
21 | "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
22 | "cookie": "_ga=GA1.2.1240046717.1620835673; PHPSESSID=i14curq5t8omcljj1hlle52762; popCookie=1; _gid=GA1.2.1936694796.1623913934"
23 | }
24 | }).then(respon => {
25 | const $ = cheerio.load(respon.data)
26 | const token = $('#token').attr('value')
27 | axios({
28 | url: "https://ttdownloader.com/req/",
29 | method: "POST",
30 | data: new URLSearchParams(Object.entries({url: Url, format: "", token: token})),
31 | headers: {
32 | "accept": "/",
33 | "accept-language": "en-US,en;q=0.9,id;q=0.8",
34 | "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
35 | "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
36 | "cookie": "_ga=GA1.2.1240046717.1620835673; PHPSESSID=i14curq5t8omcljj1hlle52762; popCookie=1; _gid=GA1.2.1936694796.1623913934"
37 | }
38 | }).then(res => {
39 | const ch = cheerio.load(res.data)
40 | const result = {}
41 | result.videoUrl = ch('#results-list > div:nth-child(3)').find('div.download > a').attr('href')
42 | result.nowatermark = ch('#results-list > div:nth-child(2)').find('div.download > a').attr('href')
43 | result.music = ch('#results-list > div:nth-child(4)').find('div.download > a').attr('href')
44 | resolve(result)
45 | }).catch(reject)
46 | }).catch(reject)
47 | })
48 | }
49 | async function tiktok(url) {
50 | var fullUrl = await fetch(url)
51 | const tiktok = await tiktok_scrape.getVideoMeta(fullUrl.url, {headers})
52 | const ingfo = tiktok.collector[0]
53 | const tiktok_dl = await musicaldown(url)
54 | const titoko = `https://tyz-api.herokuapp.com/downloader/tiktoknowm?link=${url}`
55 | const tikitoko = `https://tyz-api.herokuapp.com/converter/tomp3?url=https://tyz-api.herokuapp.com/downloader/tiktoknowm?link=${url}`
56 | const obj = {
57 | videoInfo: {
58 | id: ingfo.id,
59 | desc: ingfo.text,
60 | like: ingfo.diggCount,
61 | share: ingfo.shareCount,
62 | play: ingfo.playCount,
63 | comment: ingfo.commentCount,
64 | mentions: ingfo.mentions,
65 | hashtags: ingfo.hashtags,
66 | },
67 | musicMeta: {
68 | musicId: ingfo.musicMeta.musicId,
69 | musicName: ingfo.musicMeta.musicName,
70 | musicAuthor: ingfo.musicMeta.musicAuthor,
71 | duration: ingfo.musicMeta.duration,
72 | coverThumb: ingfo.musicMeta.coverThumb,
73 | },
74 | authorMeta: {
75 | id: ingfo.authorMeta.id,
76 | name: ingfo.authorMeta.name,
77 | nickName: ingfo.authorMeta.nickName,
78 | following: ingfo.authorMeta.following,
79 | heart: ingfo.authorMeta.heart,
80 | bio: ingfo.authorMeta.signature,
81 | avatar: ingfo.authorMeta.avatar,
82 | },
83 | metaData: {
84 | nowatermark: titoko,
85 | audio: tikitoko,
86 | video_original: tiktok_dl.video_original,
87 | audio_original: tiktok_dl.audio_original,
88 | preview: tiktok_dl.preview,
89 | thumbnail: ingfo.imageUrl
90 | }
91 | }
92 | return obj
93 | }
94 |
95 | module.exports = { noWM }
96 |
--------------------------------------------------------------------------------
/scraper/igdl.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | function igDownload(Url) {
5 | return new Promise((resolve, reject) => {
6 | axios.get('https://snapinsta.app/', {
7 | headers: {
8 | 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
9 | }
10 | }).then(res => {
11 | const cookie = res.headers[`set-cookie`][0].replace('; path=/', '')
12 | const data = {
13 | url: Url,
14 | action: 'post'
15 | }
16 | axios.request({
17 | url: 'https://snapinsta.app/action.php',
18 | method: 'post',
19 | data: new URLSearchParams(Object.entries(data)),
20 | headers: {
21 | 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
22 | 'cookie': cookie
23 | }
24 | }).then(data => {
25 | const $ = cheerio.load(data.data)
26 | const result = []
27 | $('div.row.download-box > div.col-md-4').each((a, b) => {
28 | let link = $(b).find('div.download-items > div.download-items__btn > a.abutton').attr('href');
29 | result.push(link)
30 | })
31 | resolve(result)
32 | })
33 | })
34 | })
35 | }
36 |
37 | function igStalk(Username) {
38 | return new Promise((resolve, reject) => {
39 | axios.get('https://dumpor.com/v/'+Username, {
40 | headers: {
41 | "cookie": "_inst_key=SFMyNTY.g3QAAAABbQAAAAtfY3NyZl90b2tlbm0AAAAYWGhnNS1uWVNLUU81V1lzQ01MTVY2R0h1.fI2xB2dYYxmWqn7kyCKIn1baWw3b-f7QvGDfDK2WXr8",
42 | "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
43 | }
44 | }).then(res => {
45 | const $ = cheerio.load(res.data)
46 | const result = {
47 | profile: $('#user-page > div.user > div.row > div > div.user__img').attr('style').replace(/(background-image: url\(\'|\'\);)/gi, ''),
48 | fullname: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > div > a > h1').text(),
49 | username: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > div > h4').text(),
50 | post: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(1)').text().replace(' Posts',''),
51 | followers: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(2)').text().replace(' Followers',''),
52 | following: $('#user-page > div.user > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(3)').text().replace(' Following',''),
53 | bio: $('#user-page > div.user > div > div.col-md-5.my-3 > div').text()
54 | }
55 | resolve(result)
56 | })
57 | })
58 | }
59 |
60 | function igStory(username) {
61 | return new Promise((resolve, reject) => {
62 | axios.request({
63 | url: 'https://storydownloader.net/',
64 | method: 'GET',
65 | headers: {
66 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
67 | }
68 | }).then(response => {
69 | const ch = cheerio.load(response.data)
70 | const token = ch('#token').attr('value')
71 | let data = {
72 | token: token,
73 | username: username,
74 | stp: 1
75 | }
76 | axios.request({
77 | url: 'https://storydownloader.net/process/',
78 | method: 'POST',
79 | data: new URLSearchParams(Object.entries(data)),
80 | headers: {
81 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
82 | "cookie": response.headers["set-cookie"],
83 | "accept": "application/json, text/javascript, */*; q=0.01"
84 | }
85 | }).then(res => {
86 | const hc = cheerio.load(res.data.html)
87 | const medias = []
88 | hc('figure').each(function (a, b) {
89 | const url = hc(b).find('img').attr('src')
90 | medias.push(url)
91 | })
92 | const hasil = {
93 | title: hc('h1').text(),
94 | profile_pic: hc('img').attr('src'),
95 | medias: medias
96 | }
97 | resolve(hasil)
98 | }).catch(reject)
99 | }).catch(reject)
100 | })
101 | }
102 |
103 | module.exports = { igStory, igStalk, igDownload }
104 |
--------------------------------------------------------------------------------
/scraper/mynime.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 | const cheerio = require('cheerio');
3 |
4 | function Search(query) {
5 | return new Promise((resolve, reject) => {
6 | axios.get('https://www.mynimeku.com/?s='+query).then(res => {
7 | const $ = cheerio.load(res.data)
8 | const result = []
9 | const hasil = []
10 | $('body > main > div > div > div.flexbox2 > div > div').each( function(a, b) {
11 | const url = $(b).find('a').attr('href')
12 | const thumb = $(b).find('a > div > img').attr('src')
13 | const title = $(b).find('a > div > img').attr('alt')
14 | result.push({ url, thumb, title })
15 | result.forEach(v => {
16 | if(!/anime/.test(v.url)) return
17 | hasil.push(v)
18 | })
19 | })
20 | resolve(hasil)
21 | }).catch(reject)
22 | })
23 | }
24 | function animeDetail(url) {
25 | return new Promise((resolve, reject) => {
26 | axios.get(url).then(res => {
27 | const $ = cheerio.load(res.data)
28 | const _eps = []
29 | $('#episode_list > ul > li').each( function(a, b) {
30 | const link = $(b).find('div > div.flexeps-infoz > a').attr('href')
31 | const title = $(b).find('div > div.flexeps-infoz > a').attr('title')
32 | _eps.push({ link, title })
33 | })
34 | const result = {
35 | thumb: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-thumb > img').attr('src'),
36 | title: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-info > div.series-titlex > h2').text(),
37 | title_japanese: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-info > div.series-titlex > span').text(),
38 | rating: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-info > div.series-infoz.score > span').text(),
39 | musim: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-info > ul > li:nth-child(3) > span > a').text(),
40 | studio: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-info > ul > li:nth-child(4) > span > a').text(),
41 | episode: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-info > ul > li:nth-child(5) > span').text(),
42 | aired: $('body > main > div > div > div.container > div.series-flex > div.series-flexleft > div.series-info > ul > li:nth-child(6) > span').text(),
43 | genre: $('body > main > div > div > div.container > div.series-flex > div.series-flexright > div.series-genres').text(),
44 | synopsis: $('body > main > div > div > div.container > div.series-flex > div.series-flexright > div.series-synops > p').text(),
45 | episode_list: _eps
46 | }
47 | resolve(result)
48 | }).catch(reject)
49 | })
50 | }
51 | function downloadEps(url) {
52 | return new Promise((resolve, reject) => {
53 | axios.get(url).then(res => {
54 | const $ = cheerio.load(res.data)
55 | const dl_link = {
56 | low: {
57 | uptobox: $('#linklist > p:nth-child(10) > a:nth-child(1)').attr('href'),
58 | mega: $('#linklist > p:nth-child(10) > a:nth-child(2)').attr('href'),
59 | zippyshare: $('#linklist > p:nth-child(10) > a:nth-child(3)').attr('href'),
60 | },
61 | medium: {
62 | uptobox: $('#linklist > p:nth-child(13) > a:nth-child(1)').attr('href'),
63 | mega: $('#linklist > p:nth-child(13) > a:nth-child(2)').attr('href'),
64 | zippyshare: $('#linklist > p:nth-child(13) > a:nth-child(3)').attr('href'),
65 | },
66 | high: {
67 | uptobox: $('#linklist > p:nth-child(16) > a:nth-child(1)').attr('href'),
68 | mega: $('#linklist > p:nth-child(16) > a:nth-child(2)').attr('href'),
69 | zippyshare: $('#linklist > p:nth-child(16) > a:nth-child(3)').attr('href')
70 | }
71 | }
72 | resolve(dl_link)
73 | }).catch(reject)
74 | })
75 | }
76 |
77 | module.exports = { Search, animeDetail, downloadEps }
78 |
--------------------------------------------------------------------------------
/server/search.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 | __path = process.cwd()
4 | const fs = require('fs')
5 | const { getBuffer } = require('../lib/function')
6 |
7 | //scraper
8 | const { pinterest, randomTiktok, konachan } = require('../scraper/index')
9 | const { wallpapercave, wallpaperscraft, wallpaperflare, alphacoders } = require('../scraper/wallpaper')
10 | const { stickerSearch } = require('../scraper/stickerpack')
11 | const { savetikVideo } = require('../scraper/savetik')
12 | const { happymodSearch } = require('../scraper/happymod')
13 | const { searchIlust } = require('../scraper/pixiv')
14 | const { tiktokHastag } = require('../scraper/tiktok_search')
15 |
16 |
17 | //Biar Result nya 20
18 | //Disable Console Log
19 | router.get('/google', async(req, res) => {
20 | var query = req.query.query
21 | if (!query) return res.json({ message: 'masukan parameter query' })
22 | var google = require('google-it')
23 | var result = google({'query' : `${query}`, limit: 20, disableConsole: true }).then(result => {
24 | res.json({ result })
25 | })
26 | })
27 |
28 | router.get('/pinterest', async(req, res) => {
29 | var query = req.query.query
30 | if (!query) return res.json({ message: 'masukan parameter query' })
31 | var result = await pinterest(query)
32 | res.json({ result })
33 | })
34 | router.get('/pixiv', async(req, res) => {
35 | var query = req.query.query
36 | if (!query) return res.json({ message: 'masukan parameter query' })
37 | var result = await searchIlust(query)
38 | res.json({ result })
39 | })
40 | router.get('/konachan', async(req, res) => {
41 | var query = req.query.query
42 | if (!query) return res.json({ message: 'masukan parameter query' })
43 | var img = await konachan(query)
44 | const result = img[Math.floor(Math.random() * (img.length))]
45 | var data = await getBuffer(result)
46 | await fs.writeFileSync(__path +'/tmp/konachan.png', data)
47 | await res.sendFile(__path +'/tmp/konachan.png')
48 | })
49 | router.get('/alphacoders', async(req, res) => {
50 | var query = req.query.query
51 | if (!query) return res.json({ message: 'masukan parameter query' })
52 | var img = await alphacoders(query)
53 | const result = img[Math.floor(Math.random() * (img.length))]
54 | var data = await getBuffer(result)
55 | await fs.writeFileSync(__path +'/tmp/image.png', data)
56 | await res.sendFile(__path +'/tmp/image.png')
57 | })
58 | router.get('/wallpapercave', async(req, res) => {
59 | var query = req.query.query
60 | if (!query) return res.json({ message: 'masukan parameter query' })
61 | var img = await wallpapercave(query)
62 | const result = img[Math.floor(Math.random() * (img.length))]
63 | var data = await getBuffer(result)
64 | await fs.writeFileSync(__path +'/tmp/image.png', data)
65 | await res.sendFile(__path +'/tmp/image.png')
66 | })
67 | router.get('/wallpaperscraft', async(req, res) => {
68 | var query = req.query.query
69 | if (!query) return res.json({ message: 'masukan parameter query' })
70 | var img = await wallpaperscraft(query)
71 | const result = img[Math.floor(Math.random() * (img.length))]
72 | var data = await getBuffer(result)
73 | await fs.writeFileSync(__path +'/tmp/image.png', data)
74 | await res.sendFile(__path +'/tmp/image.png')
75 | })
76 | router.get('/wallpaperflare', async(req, res) => {
77 | var query = req.query.query
78 | if (!query) return res.json({ message: 'masukan parameter query' })
79 | var img = await wallpaperflare(query)
80 | const result = img[Math.floor(Math.random() * (img.length))]
81 | var data = await getBuffer(result)
82 | await fs.writeFileSync(__path +'/tmp/image.png', data)
83 | await res.sendFile(__path +'/tmp/image.png')
84 | })
85 | router.get('/tiktok', async(req, res) => {
86 | var query = req.query.query
87 | if (!query) return res.json({ message: 'masukan parameter query' })
88 | var result = await tiktokHastag(query)
89 | res.json({ result })
90 | })
91 | router.get('/tiktokHastag', async(req, res) => {
92 | var query = req.query.query
93 | if (!query) return res.json({ message: 'masukan parameter query' })
94 | var result = await randomTiktok(query)
95 | res.json({ result })
96 | })
97 | router.get('/randomtiktok', async(req, res) => {
98 | var result = await savetikVideo()
99 | res.json({ result })
100 | })
101 | router.get('/happymod', async(req, res) => {
102 | var query = req.query.query
103 | if (!query) return res.json({ message: 'masukan parameter query' })
104 | var result = await happymodSearch(query)
105 | res.json({ result })
106 | })
107 | router.get('/sticker', async(req, res) => {
108 | var query = req.query.query
109 | if (!query) return res.json({ message: 'masukan parameter query' })
110 | var result = await stickerSearch(query)
111 | res.json({ result })
112 | })
113 |
114 | module.exports = router
115 |
--------------------------------------------------------------------------------
/scraper/otakudesu.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | const baseUrl = 'https://otakudesu.vip'
5 |
6 | const headers = {
7 | "user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36",
8 | "cookie": "_ga=GA1.2.94384000.1635596588; _gid=GA1.2.919815583.1635596588; _gat=1"
9 | }
10 |
11 | async function Search(query) {
12 | return new Promise((resolve, reject) => {
13 | axios.get(baseUrl+'/?s='+query+'&post_type=anime', {headers}).then(res =>{
14 | const $ = cheerio.load(res.data)
15 | const result = []
16 | const title = []
17 | const link = []
18 | const thumb = []
19 | $('#venkonten > div > div.venser > div > div > ul > li > h2 > a').each(function(a, b) {
20 | const _title = $(b).text()
21 | const _url = $(b).attr('href')
22 | title.push(_title)
23 | link.push(_url)
24 | })
25 | $('#venkonten > div > div.venser > div > div > ul > li > img').each(function(a, b) {
26 | const _thumb = $(b).attr('src')
27 | thumb.push(_thumb)
28 | })
29 | for (let i = 0; i < title.length; i++) {
30 | result.push({
31 | title: title[i],
32 | thumb: thumb[i],
33 | link: link[i]
34 | })
35 | }
36 | resolve(result)
37 | }).catch(reject)
38 | })
39 | }
40 | async function getInfo(URL) {
41 | return new Promise((resolve, reject) => {
42 | axios.get(URL, {headers}).then(res => {
43 | const info = {}
44 | const eps = []
45 | const $ = cheerio.load(res.data)
46 | const thumb = $('#venkonten > div.venser > div.fotoanime > img').attr('src')
47 | const title = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(1) > span').text().replace('Judul: ', '')
48 | const japanese_title = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(2) > span').text().replace('Japanese: ', '')
49 | const score = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(3) > span').text().replace('Skor: ','')
50 | const producer = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(4) > span').text().replace('Produser: ','')
51 | const type = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(5) > span').text().replace('Tipe: ','')
52 | const status = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(6) > span').text().replace('Status: ','')
53 | const total_eps = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(7) > span').text().replace('Total Episode: ','')
54 | const duration = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(8) > span').text().replace('Durasi: ','')
55 | const release_date = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(9) > span').text().replace('Tanggal Rilis', '')
56 | const studio = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(10) > span').text().replace('Studio:', '')
57 | const genre = $('#venkonten > div.venser > div.fotoanime > div.infozin > div > p:nth-child(11) > span').text().replace('Genre: ','')
58 | const sinopsis = $('#venkonten > div.venser > div.fotoanime > div.sinopc > p:nth-child(1)').text()
59 | $('#venkonten > div.venser > div:nth-child(8) > ul > li > span > a').each(function(a, b) {
60 | const _eps = $(b).attr('href')
61 | const _title = $(b).text()
62 | eps.push({ _eps, _title })
63 | })
64 | const result = {
65 | title: title,
66 | japanese_title: japanese_title,
67 | score: score,
68 | producer: producer,
69 | type: type,
70 | status: status,
71 | total_eps: total_eps,
72 | duration: duration,
73 | release_date: release_date,
74 | studio: studio,
75 | genre: genre,
76 | sinopsis: sinopsis,
77 | thumb: thumb,
78 | episode: eps
79 | }
80 | resolve(result)
81 | }).catch(reject)
82 | })
83 | }
84 | async function Getdownload(URL) {
85 | return new Promise((resolve, reject) => {
86 | axios.get(URL, {headers}).then(res => {
87 | const $ = cheerio.load(res.data)
88 | const low = $('#venkonten > div.venser > div.venutama > div.download > ul > li:nth-child(1) > a:nth-child(2)').attr('href')
89 | const medium = $('#venkonten > div.venser > div.venutama > div.download > ul > li:nth-child(2) > a:nth-child(2)').attr('href')
90 | const high = $('#venkonten > div.venser > div.venutama > div.download > ul > li:nth-child(3) > a:nth-child(2)').attr('href')
91 | const title = $('#venkonten > div.venser > div.venutama > h1').text()
92 | const thumb = $('#venkonten > div.venser > div.cukder > img').attr('src')
93 | const result = {
94 | title: title,
95 | thumb: thumb,
96 | high: high,
97 | medium: medium,
98 | low: low
99 | }
100 | resolve(result)
101 | }).catch(reject)
102 | })
103 | }
104 | module.exports = { Search, getInfo, Getdownload }
105 |
--------------------------------------------------------------------------------
/scraper/tiktok_search.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios')
2 | const cheerio = require('cheerio')
3 |
4 | const pickrandom = async(ext) => {
5 | return ext[Math.floor(Math.random() * ext.length)]
6 | }
7 |
8 | function ttSearch (query) {
9 | return new Promise((resolve, reject) => {
10 | axios.get('https://brainans.com/search?query='+query).then(res => {
11 | const $ = cheerio.load(res.data)
12 | const result = []
13 | const main = $('#search-container > div')
14 | main.each( function() {
15 | const user_url = 'https://brainans.com'+$(this).find('div.content__text > a').attr('href')
16 | const user = $(this).find('div.content__text > a').text()
17 | const username = $(this).find('div.content__text > p').text()
18 | result.push({ user, username, user_url })
19 | const hasil = {
20 | result: result
21 | }
22 | resolve(hasil)
23 | })
24 | }).catch(reject)
25 | })
26 | }
27 | async function ttUser (url) {
28 | return new Promise(async(resolve, reject) => {
29 | axios.get(url).then(res => {
30 | const $ = cheerio.load(res.data)
31 | const result = []
32 | const main = $('#videos_container > div > div.content__list.grid.infinite_scroll.cards > div')
33 | main.each( function() {
34 | const idVid = 'https://brainans.com'+$(this).find('a').attr('href')
35 | const upload_at = $(this).find('span').text()
36 | const desc = $(this).find('p').text()
37 | const user = $('#user-page > div.user.container > div > div.col-md-4.col-8.my-3 > div > a > h1').text()
38 | const username = $('#user-page > div.user.container > div > div.col-md-4.col-8.my-3 > div > h4').text()
39 | const video_count = $('#user-page > div.user.container > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(1) > strong').text()
40 | const followers = $('#user-page > div.user.container > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(2) > strong').text()
41 | const following = $('#user-page > div.user.container > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(3) > strong').text()
42 | const likes = $('#user-page > div.user.container > div > div.col-md-4.col-8.my-3 > ul > li:nth-child(4) > strong').text()
43 | const bio = $('#user-page > div.user.container > div > div.col-md-5.my-3 > div').text()
44 | const thumb = $('#user-page > div.user.container > div > div.col-md-3.col-4.my-3 > div').attr('style').replace("background-image: url('", '').replace("');", '')
45 | result.push({ idVid, upload_at, desc })
46 | const hasil = {
47 | user: user,
48 | username: username,
49 | video_count: video_count,
50 | followers: followers,
51 | following: following,
52 | likes: likes,
53 | bio: bio,
54 | thumb: thumb,
55 | video: result
56 | }
57 | resolve(hasil)
58 | })
59 | }).catch(reject)
60 | })
61 | }
62 | function getVid (url) {
63 | return new Promise((resolve, reject) => {
64 | axios.get(url).then(res => {
65 | const $ = cheerio.load(res.data)
66 | const obj = {}
67 | obj.link = $('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.main__image-container > div > video').attr('src')
68 | obj.like = $('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.content__btns.d-flex > div:nth-child(1) > span').text()
69 | obj.comment = $('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.content__btns.d-flex > div:nth-child(2) > span').text()
70 | obj.share = $('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.content__btns.d-flex > div:nth-child(3) > span').text()
71 | resolve(obj)
72 | }).catch(reject)
73 | })
74 | }
75 | async function randomTiktok(query) {
76 | return new Promise( async(resolve, reject) => {
77 | await axios.get('https://brainans.com/search?query='+query).then(response => {
78 | const $ = cheerio.load(response.data)
79 | const User = $('#search-container > div:nth-child(1) > div.content__text > a').attr('href')
80 | axios.get('https://brainans.com/'+User).then(respon => {
81 | const soup = cheerio.load(respon.data)
82 | const Vidlink = []
83 | const main = soup('#videos_container > div > div.content__list.grid.infinite_scroll.cards > div > div > a')
84 | main.each( function() {
85 | const Vlink = 'https://brainans.com/'+soup(this).attr('href')
86 | Vidlink.push(Vlink)
87 | })
88 | pickrandom(Vidlink).then(res => {
89 | axios.get(res).then(resp => {
90 | const ch = cheerio.load(resp.data)
91 | const result = {
92 | username: ch('#card-page > div > div.row > div > div > div > div > div.main__user-desc.align-self-center.ml-2 > a').text(),
93 | caption: ch('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.main__list').text(),
94 | likes: ch('#card-page > div > div.row > div > div > div.main__info.mb-4 > div > div:nth-child(1) > span').text(),
95 | comment: ch('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.content__btns.d-flex > div:nth-child(2) > span').text(),
96 | share: ch('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.content__btns.d-flex > div:nth-child(3) > span').text(),
97 | video: ch('#card-page > div > div.row > div > div > div.main__info.mb-4 > div.main__image-container > div > video').attr('src')
98 | }
99 | resolve(result)
100 | })
101 | }).catch(resolve)
102 | }).catch(resolve)
103 | }).catch(resolve)
104 | })
105 | }
106 | async function tiktokHastag(query) {
107 | return new Promise((resolve, reject) => {
108 | axios.get('https://tiktokder.com/hashtag/'+query).then(resp => {
109 | const $ = cheerio.load(resp.data)
110 | const Vidlink = []
111 | const main = $('body > div.videos-grid > div > a')
112 | main.each(function() {
113 | const URL = 'https://tiktokder.com'+$(this).attr('href')
114 | Vidlink.push(URL)
115 | })
116 | pickrandom(Vidlink).then(res => {
117 | axios.get(res).then(respon => {
118 | const ch = cheerio.load(respon.data)
119 | resolve({
120 | url: ch('#tiktok-video-result > div > div.download-buttons > div > a').attr('href').replace('https://savetiknowm.org/?tiktok_url=', ''),
121 | usernameNick: ch('#tiktok-video-result > div > div.result > div:nth-child(2) > div.profile > a.user-nickname').text(),
122 | username: ch('#tiktok-video-result > div > div.result > div:nth-child(2) > div.profile > a.username').text(),
123 | description: ch('#tiktok-video-result > div > div.result > div:nth-child(2) > p').text(),
124 | nowm: 'https://tyz-api.herokuapp.com/downloader/tiktoknowm?link='+ch('#tiktok-video-result > div > div.download-buttons > div > a').attr('href').replace('https://savetiknowm.org/?tiktok_url=', ''),
125 | original: ch('#tiktok-video-result > div > div.download-buttons > a').attr('href')
126 | })
127 | })
128 | })
129 | }).catch(reject)
130 | })
131 | }
132 | // Yang lain nya bonus aja:D
133 | module.exports = randomTiktok
134 | module.exports = tiktokHastag
135 |
--------------------------------------------------------------------------------
/server/downloader.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | var router = express.Router();
3 | const hxz = require('hxz-api')
4 | const yts = require('yt-search')
5 | const axios = require('axios')
6 | __path = process.cwd()
7 | const fs = require('fs')
8 | const { getBuffer } = require('../lib/function')
9 |
10 | //scraper
11 | const { mediafireDl, pinterestdl, scdl, sfiledl, savetik } = require('../scraper/index')
12 | const { musicaldown } = require('../scraper/musicaldown')
13 | const { stickerDl } = require('../scraper/stickerpack')
14 | const { dl } = require('../scraper/aiovideodl')
15 | const { spotifydl } = require('../scraper/spotify')
16 | const { jooxdl, joox } = require('../scraper/joox')
17 | const { pixivDownload } = require('../scraper/pixiv')
18 | const { igStory, igStalk, igDownload } = require('../scraper/igdl')
19 | const { ytv, yta } = require('../scraper/ytdl')
20 | const { savefrom } = require('../scraper/savefrom')
21 | const zipi = require('../scraper/zippy')
22 |
23 | async function shorts(url) {
24 | const res = await axios.get('https://tinyurl.com/api-create.php?url='+url)
25 | return res.data
26 | }
27 |
28 |
29 | router.get('/igdl', async(req, res) => {
30 | var link = req.query.link
31 | if (!link) return res.json({ message: 'masukan parameter Link' })
32 | var hasil = await savefrom(link)
33 | try {
34 | res.json(hasil)
35 | } catch(err) {
36 | console.log(err)
37 | res.json({ message: 'Ups, error' })
38 | }
39 | })
40 | router.get('/igStory', async(req, res) => {
41 | var username = req.query.username
42 | if (!username) return res.json({ message: 'masukan parameter username' })
43 | var hasil = await igStory(username)
44 | try {
45 | res.json(hasil)
46 | } catch(err) {
47 | console.log(err)
48 | res.json({ message: 'Ups, error' })
49 | }
50 | })
51 | router.get('/mediafireDl', async(req, res) => {
52 | var link = req.query.link
53 | if (!link) return res.json({ message: 'masukan parameter Link' })
54 | var hasil = await mediafireDl(link)
55 | try {
56 | res.json(hasil)
57 | } catch(err) {
58 | console.log(err)
59 | res.json({ message: 'Ups, error' })
60 | }
61 | })
62 | router.get('/zippyShare', async(req, res) => {
63 | var link = req.query.link
64 | if (!link) return res.json({ message: 'masukan parameter Link' })
65 | var hasil = await zipi.zippy(link)
66 | try {
67 | res.json(hasil)
68 | } catch(err) {
69 | console.log(err)
70 | res.json({ message: 'Ups, error' })
71 | }
72 | })
73 | router.get('/sfiledl', async(req, res) => {
74 | var link = req.query.link
75 | if (!link) return res.json({ message: 'masukan parameter Link' })
76 | var hasil = await sfiledl(link)
77 | try {
78 | res.json(hasil)
79 | } catch(err) {
80 | console.log(err)
81 | res.json({ message: 'Ups, error' })
82 | }
83 | })
84 | router.get('/youtube', async(req, res) => {
85 | var link = req.query.link
86 | if (!link) return res.json({ message: 'masukan parameter Link' })
87 | var yt1 = await yta(link)
88 | var yt2 = await ytv(link)
89 | const audioUrl = await shorts('https://tyz-api.herokuapp.com/converter/toFile?url='+yt1.dl_link)
90 | const videoUrl = await shorts('https://tyz-api.herokuapp.com/converter/toFile?url='+yt2.dl_link)
91 | try {
92 | res.json({
93 | title: yt1.title,
94 | thumb: yt1.thumb,
95 | filesize_audio: yt1.filesizeF,
96 | filesize_video: yt2.filesizeF,
97 | audio: audioUrl,
98 | video: videoUrl,
99 | })
100 | } catch(err) {
101 | console.log(err)
102 | res.json({ message: 'Ups, error' })
103 | }
104 | })
105 | router.get('/play', async(req, res) => {
106 | var query = req.query.query
107 | if (!query) return res.json({ message: 'masukan parameter query' })
108 | let results = await yts(query)
109 | let vid = results.all.find(video => video.seconds < 3600)
110 | if (!vid) return res.json({ message: 'not found!'})
111 | var hasil = await axios.get('https://tyz-api.herokuapp.com/downloader/youtube?link='+vid.url)
112 | try {
113 | res.json(hasil.data)
114 | } catch(err) {
115 | console.log(err)
116 | res.json({ message: 'Ups, error' })
117 | }
118 | })
119 | router.get('/pixiv', async(req, res) => {
120 | var id = req.query.id
121 | var ext = req.query.ext
122 | if (!id) return res.json({ message: 'masukan parameter id' })
123 | if (!ext) return res.json({ message: 'masukan parameter ext' })
124 | var hasil = await pixivDownload(id, ext)
125 | try {
126 | var data = await getBuffer(hasil)
127 | await fs.writeFileSync(__path +'/tmp/image.jpg', data)
128 | await res.sendFile(__path +'/tmp/image.jpg')
129 | } catch(err) {
130 | console.log(err)
131 | res.json({ message: 'Ups, error' })
132 | }
133 | })
134 | router.get('/fbdl', async(req, res) => {
135 | var link = req.query.link
136 | if (!link) return res.json({ message: 'masukan parameter Link' })
137 | var hasil = await dl(link)
138 | try {
139 | res.json(hasil)
140 | } catch(err) {
141 | console.log(err)
142 | res.json({ message: 'Ups, error' })
143 | }
144 | })
145 | router.get('/likeedl', async(req, res) => {
146 | var link = req.query.link
147 | if (!link) return res.json({ message: 'masukan parameter Link' })
148 | var hasil = await dl(link)
149 | try {
150 | res.json(hasil)
151 | } catch(err) {
152 | console.log(err)
153 | res.json({ message: 'Ups, error' })
154 | }
155 | })
156 | router.get('/twitter', async(req, res) => {
157 | var link = req.query.link
158 | if (!link) return res.json({ message: 'masukan parameter Link' })
159 | var hasil = await savefrom(link)
160 | try {
161 | res.json(hasil)
162 | } catch(err) {
163 | console.log(err)
164 | res.json({ message: 'Ups, error' })
165 | }
166 | })
167 | router.get('/pindl', async(req, res) => {
168 | var link = req.query.link
169 | if (!link) return res.json({ message: 'masukan parameter Link' })
170 | var hasil = await pinterestdl(link)
171 | try {
172 | res.json(hasil)
173 | } catch(err) {
174 | console.log(err)
175 | res.json({ message: 'Ups, error' })
176 | }
177 | })
178 | router.get('/scdl', async(req, res) => {
179 | var link = req.query.link
180 | if (!link) return res.json({ message: 'masukan parameter Link' })
181 | var hasil = await scdl(link)
182 | try {
183 | res.json(hasil)
184 | } catch(err) {
185 | console.log(err)
186 | res.json({ message: 'Ups, error' })
187 | }
188 | })
189 | router.get('/spotifydl', async(req, res) => {
190 | var link = req.query.link
191 | if (!link) return res.json({ message: 'masukan parameter Link' })
192 | var hasil = await spotifydl.downloadTrack(link)
193 | try {
194 | await fs.writeFileSync(__path +'/tmp/audio.mp3', hasil)
195 | await res.sendFile(__path +'/tmp/audio.mp3')
196 | } catch(err) {
197 | console.log(err)
198 | res.json({ message: 'Ups, error' })
199 | }
200 | })
201 | router.get('/spotify', async(req, res) => {
202 | var link = req.query.link
203 | if (!link) return res.json({ message: 'masukan parameter Link' })
204 | var hasil = await spotifydl.getTrack(link)
205 | try {
206 | res.json({ info: hasil, dl_lnk: `https://tyz-api.herokuapp.com/downloader/spotifydl?link=${link}` })
207 | } catch(err) {
208 | console.log(err)
209 | res.json({ message: 'Ups, error' })
210 | }
211 | })
212 | router.get('/stickerpack', async(req, res) => {
213 | var link = req.query.link
214 | if (!link) return res.json({ message: 'masukan parameter Link' })
215 | var hasil = await stickerDl(link)
216 | try {
217 | res.json(hasil)
218 | } catch(err) {
219 | console.log(err)
220 | res.json({ message: 'Ups, error' })
221 | }
222 | })
223 |
224 | module.exports = router
225 |
--------------------------------------------------------------------------------
/server/photooxy.js:
--------------------------------------------------------------------------------
1 | __path = process.cwd()
2 | const express = require('express')
3 | var router = express.Router();
4 | const fs = require('fs')
5 | const fetch = require('node-fetch')
6 |
7 | const { photoXy_1, photoXy_2 } = require('../scraper/photooxy')
8 | const UrlPhotooxy = {
9 | shadow: 'https://photooxy.com/logo-and-text-effects/shadow-text-effect-in-the-sky-394.html',
10 | captain_amerika: 'https://photooxy.com/captain-america-text-generator-403.html',
11 | cup: 'https://photooxy.com/logo-and-text-effects/write-text-on-the-cup-392.html',
12 | romantic: 'https://photooxy.com/logo-and-text-effects/romantic-messages-for-your-loved-one-391.html',
13 | smoke: 'https://photooxy.com/other-design/create-an-easy-smoke-type-effect-390.html',
14 | burn_paper: 'https://photooxy.com/logo-and-text-effects/write-text-on-burn-paper-388.html',
15 | naruto: 'https://photooxy.com/manga-and-anime/make-naruto-banner-online-free-378.html',
16 | love_message: 'https://photooxy.com/logo-and-text-effects/create-a-picture-of-love-message-377.html',
17 | tik_tok: 'https://photooxy.com/logo-and-text-effects/make-tik-tok-text-effect-375.html',
18 | flower_heart: 'https://photooxy.com/logo-and-text-effects/text-inside-the-flower-heart-369.html',
19 | wodden_board: 'https://photooxy.com/logo-and-text-effects/writing-on-wooden-boards-368.html',
20 | glowing_neon: 'https://photooxy.com/logo-and-text-effects/make-smoky-neon-glow-effect-343.html'
21 | }
22 |
23 | router.get('/photooxy1', async (req, res) => {
24 | var text = req.query.text
25 | var link = req.query.link
26 | if (!text) return res.json({ message: 'masukan parameter Text' })
27 | if (!link) return res.json({ message: 'masukan parameter Link' })
28 | var hasil = await photoXy_1(link, text)
29 | try {
30 | var Buffer = await fetch(hasil, {
31 | headers: {
32 | "User-Agent": "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11"
33 | }
34 | })
35 | var getBuffer = await Buffer.buffer()
36 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
37 | res.sendFile(__path + '/tmp/image.jpg')
38 | } catch(err) {
39 | console.log(err)
40 | res.json({ message: 'Ups, error' })
41 | }
42 | })
43 |
44 | router.get('/photooxy2', async (req, res) => {
45 | var text = req.query.text
46 | var text_2 = req.query.text_2
47 | var link = req.query.link
48 | if (!text) return res.json({ message: 'masukan parameter Text' })
49 | if (!text_2) return res.json({ message: 'masukan parameter Text' })
50 | if (!link) return res.json({ message: 'masukan parameter Link' })
51 | var hasil = await photoXy_2(link, text, text_2)
52 | try {
53 | var Buffer = await fetch(hasil, {
54 | headers: {
55 | "User-Agent": "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11"
56 | }
57 | })
58 | var getBuffer = await Buffer.buffer()
59 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
60 | res.sendFile(__path + '/tmp/image.jpg')
61 | } catch(err) {
62 | console.log(err)
63 | res.json({ message: 'Ups, error' })
64 | }
65 | })
66 | router.get('/shadow', async (req, res) => {
67 | var text = req.query.text
68 | if (!text) return res.json({ message: 'Masukan parameter Text'})
69 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.shadow}`)
70 | var getBuffer = await img.buffer()
71 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
72 | res.sendFile(__path + '/tmp/image.jpg')
73 | })
74 | router.get('/cup', async (req, res) => {
75 | var text = req.query.text
76 | if (!text) return res.json({ message: 'Masukan parameter Text'})
77 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.cup}`)
78 | var getBuffer = await img.buffer()
79 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
80 | res.sendFile(__path + '/tmp/image.jpg')
81 | })
82 | router.get('/captain_amerika', async (req, res) => {
83 | var text = req.query.text
84 | var text_2 = req.query.text_2
85 | if (!text) return res.json({ message: 'Masukan parameter Text'})
86 | if (!text_2) return res.json({ message: 'Masukan parameter Text_2'})
87 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy2?text=${text}&text_2=${text_2}&link=${UrlPhotooxy.captain_amerika}`)
88 | var getBuffer = await img.buffer()
89 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
90 | res.sendFile(__path + '/tmp/image.jpg')
91 | })
92 | router.get('/romantic', async (req, res) => {
93 | var text = req.query.text
94 | if (!text) return res.json({ message: 'Masukan parameter Text'})
95 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.romantic}`)
96 | var getBuffer = await img.buffer()
97 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
98 | res.sendFile(__path + '/tmp/image.jpg')
99 | })
100 | router.get('/smoke', async (req, res) => {
101 | var text = req.query.text
102 | if (!text) return res.json({ message: 'Masukan parameter Text'})
103 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.smoke}`)
104 | var getBuffer = await img.buffer()
105 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
106 | res.sendFile(__path + '/tmp/image.jpg')
107 | })
108 | router.get('/burn_paper', async (req, res) => {
109 | var text = req.query.text
110 | if (!text) return res.json({ message: 'Masukan parameter Text'})
111 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.burn_paper}`)
112 | var getBuffer = await img.buffer()
113 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
114 | res.sendFile(__path + '/tmp/image.jpg')
115 | })
116 | router.get('/naruto', async (req, res) => {
117 | var text = req.query.text
118 | if (!text) return res.json({ message: 'Masukan parameter Text'})
119 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.naruto}`)
120 | var getBuffer = await img.buffer()
121 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
122 | res.sendFile(__path + '/tmp/image.jpg')
123 | })
124 | router.get('/love_message', async (req, res) => {
125 | var text = req.query.text
126 | if (!text) return res.json({ message: 'Masukan parameter Text'})
127 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.love_message}`)
128 | var getBuffer = await img.buffer()
129 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
130 | res.sendFile(__path + '/tmp/image.jpg')
131 | })
132 | router.get('/tik_tok', async (req, res) => {
133 | var text = req.query.text
134 | var text_2 = req.query.text_2
135 | if (!text) return res.json({ message: 'Masukan parameter Text'})
136 | if (!text_2) return res.json({ message: 'Masukan parameter Text_2'})
137 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy2?text=${text}&text_2=${text_2}&link=${UrlPhotooxy.tik_tok}`)
138 | var getBuffer = await img.buffer()
139 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
140 | res.sendFile(__path + '/tmp/image.jpg')
141 | })
142 | router.get('/flower_heart', async (req, res) => {
143 | var text = req.query.text
144 | if (!text) return res.json({ message: 'Masukan parameter Text'})
145 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.flower_heart}`)
146 | var getBuffer = await img.buffer()
147 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
148 | res.sendFile(__path + '/tmp/image.jpg')
149 | })
150 | router.get('/wodden_board', async (req, res) => {
151 | var text = req.query.text
152 | if (!text) return res.json({ message: 'Masukan parameter Text'})
153 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.wodden_board}`)
154 | var getBuffer = await img.buffer()
155 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
156 | res.sendFile(__path + '/tmp/image.jpg')
157 | })
158 | router.get('/glowing_neon', async (req, res) => {
159 | var text = req.query.text
160 | if (!text) return res.json({ message: 'Masukan parameter Text'})
161 | var img = await fetch(`https://tyz-api.herokuapp.com/photooxy/photooxy1?text=${text}&link=${UrlPhotooxy.glowing_neon}`)
162 | var getBuffer = await img.buffer()
163 | await fs.writeFileSync(__path + '/tmp/image.jpg', getBuffer)
164 | res.sendFile(__path + '/tmp/image.jpg')
165 | })
166 |
167 |
168 | module.exports = router
169 |
--------------------------------------------------------------------------------
/views/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | ICHINOSE API
13 |
15 |
17 |
18 |
19 |
21 |
22 |
23 |
24 |
25 |
28 |
29 |
30 |
31 |
32 |