',
44 | to: email,
45 | subject: `Verify Email - Api ZeeoneOfc`,
46 | html: inboxGmail,
47 | };
48 | transporter.sendMail(mailOptions, (err) => {
49 | if (err) {
50 | console.log(err);
51 | }
52 | });
53 | } catch (error) {
54 | console.log(error);
55 | }
56 | }
57 | };
58 | module.exports = mailer;
59 |
--------------------------------------------------------------------------------
/lib/fetcher.js:
--------------------------------------------------------------------------------
1 | const fetch = require('node-fetch')
2 | const fs = require('fs')
3 |
4 | exports.getBase64 = getBase64 = async (url) => {
5 | const response = await fetch(url, { headers: { 'User-Agent': 'okhttp/4.5.0' } });
6 | if (!response.ok) throw new Error(`unexpected response ${response.statusText}`);
7 | const buffer = await response.buffer();
8 | const videoBase64 = `data:${response.headers.get('content-type')};base64,` + buffer.toString('base64');
9 | if (buffer)
10 | return videoBase64;
11 | };
12 |
13 | exports.getBuffer = getBuffer = async (url) => {
14 | const res = await fetch(url, {headers: { 'User-Agent': 'okhttp/4.5.0'}, method: 'GET' })
15 | const anu = fs.readFileSync('./src/emror.jpg')
16 | if (!res.ok) return { type: 'image/jpeg', result: anu }
17 | const buff = await res.buffer()
18 | if (buff)
19 | return { type: res.headers.get('content-type'), result: buff }
20 | }
21 |
22 | exports.fetchJson = fetchJson = (url, options) => new Promise(async (resolve, reject) => {
23 | fetch(url, options)
24 | .then(response => response.json())
25 | .then(json => {
26 | // console.log(json)
27 | resolve(json)
28 | })
29 | .catch((err) => {
30 | reject(err)
31 | })
32 | })
33 |
34 |
35 | exports.fetchText = fetchText = (url, options) => new Promise(async (resolve, reject) => {
36 | fetch(url, options)
37 | .then(response => response.text())
38 | .then(text => {
39 | // console.log(text)
40 | resolve(text)
41 | })
42 | .catch((err) => {
43 | reject(err)
44 | })
45 | })
46 |
47 | //exports.getBase64 = getBase64;
48 |
--------------------------------------------------------------------------------
/lib/functions.js:
--------------------------------------------------------------------------------
1 | require("../settings");
2 | const fetch = require('node-fetch')
3 | const axios = require('axios')
4 | const crypto = require('crypto')
5 | const pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ23456789'.split('');
6 | const jwt = require('jsonwebtoken')
7 |
8 | const getBuffer = async (url, options) => {
9 | try {
10 | options ? options : {}
11 | const res = await axios({
12 | method: "get",
13 | url,
14 | headers: {
15 | 'DNT': 1,
16 | 'Upgrade-Insecure-Request': 1
17 | },
18 | ...options,
19 | responseType: 'arraybuffer'
20 | })
21 | return res.data
22 | } catch (e) {
23 | console.log(`Error : ${e}`)
24 | }
25 | }
26 |
27 | const randomText = (len) => {
28 | const result = [];
29 | for (let i = 0; i < len; i++) result.push(pool[Math.floor(Math.random() * pool.length)]);
30 | return result.join('');
31 | }
32 |
33 | const getHashedPassword = (password) => {
34 | const sha256 = crypto.createHash('sha256');
35 | const hash = sha256.update(password).digest('base64');
36 | return hash;
37 | }
38 |
39 | const createActivationToken = (payload) => {
40 | const activationToken = jwt.sign(payload, ACTIVATION_TOKEN_SECRET, { expiresIn: '30m' })
41 | return activationToken;
42 | }
43 |
44 |
45 |
46 | module.exports = { createActivationToken, randomText, getHashedPassword, getBuffer}
47 |
--------------------------------------------------------------------------------
/lib/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | Vokal: require('./utils/vokal'),
3 | Base: require('./utils/base'),
4 | Searchnabi: require('./utils/kisahnabi'),
5 | Gempa: require('./utils/gempa')
6 | }
7 |
--------------------------------------------------------------------------------
/lib/options.js:
--------------------------------------------------------------------------------
1 | const options = {
2 | // Number of posts to scrape: {int default: 20}
3 | number: 50,
4 |
5 | // Set session: {string[] default: ['']}
6 | // Authenticated session cookie value is required to scrape user/trending/music/hashtag feed
7 | // You can put here any number of sessions, each request will select random session from the list
8 | sessionList: ['sid_tt=21312213'],
9 |
10 | // Set proxy {string[] | string default: ''}
11 | // http proxy: 127.0.0.1:8080
12 | // socks proxy: socks5://127.0.0.1:8080
13 | // You can pass proxies as an array and scraper will randomly select a proxy from the array to execute the requests
14 | proxy: '',
15 |
16 | // Set to {true} to search by user id: {boolean default: false}
17 | by_user_id: false,
18 |
19 | // How many post should be downloaded asynchronously. Only if {download:true}: {int default: 5}
20 | asyncDownload: 5,
21 |
22 | // How many post should be scraped asynchronously: {int default: 3}
23 | // Current option will be applied only with current types: music and hashtag
24 | // With other types it is always 1 because every request response to the TikTok API is providing the "maxCursor" value
25 | // that is required to send the next request
26 | asyncScraping: 3,
27 |
28 | // File path where all files will be saved: {string default: 'CURRENT_DIR'}
29 | filepath: 'CURRENT_DIR',
30 |
31 | // Custom file name for the output files: {string default: ''}
32 | fileName: `CURRENT_DIR`,
33 |
34 | // Output with information can be saved to a CSV or JSON files: {string default: 'na'}
35 | // 'csv' to save in csv
36 | // 'json' to save in json
37 | // 'all' to save in json and csv
38 | // 'na' to skip this step
39 | filetype: `na`,
40 |
41 | // Set custom headers: user-agent, cookie and etc
42 | // NOTE: When you parse video feed or single video metadata then in return you will receive {headers} object
43 | // that was used to extract the information and in order to access and download video through received {videoUrl} value you need to use same headers
44 | headers: {
45 | 'user-agent': "BLAH",
46 | referer: 'https://www.tiktok.com/',
47 | cookie: `tt_webid_v2=68dssds`,
48 | },
49 |
50 | // Download video without the watermark: {boolean default: false}
51 | // Set to true to download without the watermark
52 | // This option will affect the execution speed
53 | noWaterMark: true,
54 |
55 | // Create link to HD video: {boolean default: false}
56 | // This option will only work if {noWaterMark} is set to {true}
57 | hdVideo: false,
58 |
59 | // verifyFp is used to verify the request and avoid captcha
60 | // When you are using proxy then there are high chances that the request will be
61 | // blocked with captcha
62 | // You can set your own verifyFp value or default(hardcoded) will be used
63 | verifyFp: ''
64 | };
65 |
66 | exports.options = options
--------------------------------------------------------------------------------
/lib/oxy.js:
--------------------------------------------------------------------------------
1 |
2 | const fetch = require("node-fetch");
3 | const cheerio = require("cheerio");
4 | const cookie = require("cookie");
5 | const axios = require('axios')
6 | const FormData = require("form-data");
7 |
8 |
9 | async function getBuffer(url, options){
10 | try {
11 | options ? options : {}
12 | const res = await axios({
13 | method: "get",
14 | url,
15 | headers: {
16 | 'DNT': 1,
17 | 'Upgrade-Insecure-Request': 1
18 | },
19 | ...options,
20 | responseType: 'arraybuffer'
21 | })
22 | return res.data
23 | } catch (err) {
24 | return err
25 | }
26 | }
27 |
28 | async function post(url, formdata = {}, cookies) {
29 | let encode = encodeURIComponent;
30 | let body = Object.keys(formdata)
31 | .map((key) => {
32 | let vals = formdata[key];
33 | let isArray = Array.isArray(vals);
34 | let keys = encode(key + (isArray ? "[]" : ""));
35 | if (!isArray) vals = [vals];
36 | let out = [];
37 | for (let valq of vals) out.push(keys + "=" + encode(valq));
38 | return out.join("&");
39 | })
40 | .join("&");
41 | return await fetch(`${url}?${body}`, {
42 | method: "GET",
43 | headers: {
44 | Accept: "*/*",
45 | "Accept-Language": "en-US,en;q=0.9",
46 | "User-Agent": "GoogleBot",
47 | Cookie: cookies,
48 | },
49 | });
50 | }
51 |
52 |
53 |
54 | async function oxy(url, text) {
55 | const geturl = await fetch(url, {
56 | method: "GET",
57 | headers: {
58 | "User-Agent": "GoogleBot",
59 | },
60 | });
61 | const caritoken = await geturl.text();
62 | let hasilcookie = geturl.headers
63 | .get("set-cookie")
64 | .split(",")
65 | .map((v) => cookie.parse(v))
66 | .reduce((a, c) => {
67 | return { ...a, ...c };
68 | }, {});
69 | hasilcookie = {
70 | __cfduid: hasilcookie.__cfduid,
71 | PHPSESSID: hasilcookie.PHPSESSID,
72 | };
73 | hasilcookie = Object.entries(hasilcookie)
74 | .map(([name, value]) => cookie.serialize(name, value))
75 | .join("; ");
76 | const $ = cheerio.load(caritoken);
77 | const token = $('input[name="token"]').attr("value");
78 | const form = new FormData();
79 | if (typeof text === "string") text = [text];
80 | for (let texts of text) form.append("text[]", texts);
81 | form.append("submit", "Go");
82 | form.append("token", token);
83 | form.append("build_server", "https://e2.yotools.net");
84 | form.append("build_server_id", 2);
85 | const geturl2 = await fetch(url, {
86 | method: "POST",
87 | headers: {
88 | Accept: "*/*",
89 | "Accept-Language": "en-US,en;q=0.9",
90 | "User-Agent": "GoogleBot",
91 | Cookie: hasilcookie,
92 | ...form.getHeaders(),
93 | },
94 | body: form.getBuffer(),
95 | });
96 | const caritoken2 = await geturl2.text()
97 | const $$ = cheerio.load(caritoken2)
98 | const token2 = $$("#form_value").text()
99 | if (!token2) throw new Error("Token Tidak Ditemukan!!");
100 | const prosesimage = await post(
101 | "https://photooxy.com/effect/create-image",
102 | JSON.parse(token2),
103 | hasilcookie
104 | );
105 | const hasil = await prosesimage.json();
106 | const hassil = `https://e2.yotools.net/${hasil.image}`
107 | const result = await getBuffer(hassil)
108 | return result
109 | }
110 |
111 | module.exports = oxy
--------------------------------------------------------------------------------
/lib/textpro.js:
--------------------------------------------------------------------------------
1 | const co = require('cheerio');
2 | const request = require('request');
3 | const create = async (linkk,text1,text2) => {
4 | return request.post({
5 | url: `${linkk}`,
6 | headers: {
7 | 'Content-Type': 'application/x-www-form-urlencoded'
8 | },
9 | body: `text_1=${text1}&text_2=${text2}&login=OK`
10 | }, (e,r,b) => {
11 | let $ = co.load(b);
12 | $(".thumbnail").find("img").each(function() {
13 | let h = $(this).attr("src");
14 | var result = "https://photooxy.com"+h;
15 | console.log("https://photooxy.com"+h);
16 | });
17 | });
18 | }
19 |
20 | module.exports = { create }
--------------------------------------------------------------------------------
/lib/utils/Zeeone:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/lib/utils/base.js:
--------------------------------------------------------------------------------
1 | const base64 = require('base-64')
2 | const base32 = require('base32')
3 |
4 | const Base = (type, text) => new Promise((resolve, reject) => {
5 | switch (type) {
6 | case 'b64enc':
7 | const data1 = base64.encode(text)
8 | resolve({
9 | type: 'base64',
10 | string: text,
11 | encode: data1
12 | })
13 | break
14 | case 'b64dec':
15 | const data2 = base64.decode(text)
16 | resolve({
17 | type: 'base64',
18 | enc: text,
19 | string: data2
20 | })
21 | break
22 | case 'b32enc':
23 | const data3 = base32.encode(text)
24 | resolve({
25 | type: 'base32',
26 | string: text,
27 | encode: data3
28 | })
29 | break
30 | case 'b32dec':
31 | const data4 = base32.decode(text)
32 | resolve({
33 | type: 'base32',
34 | enc: text,
35 | string: data4
36 | })
37 | break
38 | default:
39 | break
40 | }
41 | })
42 |
43 | module.exports = Base
--------------------------------------------------------------------------------
/lib/utils/gempa.js:
--------------------------------------------------------------------------------
1 | const cheerio = require('cheerio')
2 | const axios = require('axios')
3 |
4 | const Gempa = () => new Promise((resolve, reject) => {
5 | axios.get('https://www.bmkg.go.id/gempabumi/gempabumi-dirasakan.bmkg').then((response) => {
6 | const $ = cheerio.load(response.data)
7 |
8 | const urlElems = $('table.table-hover.table-striped')
9 |
10 | for (let i = 0; i < urlElems.length; i++) {
11 | const urlSpan = $(urlElems[i]).find('tbody')[0]
12 |
13 | if (urlSpan) {
14 | const urlData = $(urlSpan).find('tr')[0]
15 | var Kapan = $(urlData).find('td')[1]
16 | var Letak = $(urlData).find('td')[2]
17 | var Magnitudo = $(urlData).find('td')[3]
18 | var Kedalaman = $(urlData).find('td')[4]
19 | var Wilayah = $(urlData).find('td')[5]
20 | var lintang = $(Letak).text().split(' ')[0]
21 | var bujur = $(Letak).text().split(' ')[2]
22 | var hasil = {
23 | Waktu: $(Kapan).text(),
24 | Lintang: lintang,
25 | Bujur: bujur,
26 | Magnitudo: $(Magnitudo).text(),
27 | Kedalaman: $(Kedalaman).text().replace(/\t/g, '').replace(/I/g, ''),
28 | Wilayah: $(Wilayah).text().replace(/\t/g, '').replace(/I/g, '').replace('-','').replace(/\r/g, '').split('\n')[0],
29 | Map: ''
30 | }
31 | // We then print the text on to the console
32 | resolve(hasil);
33 | }
34 | }
35 | }).catch(err => reject(err))
36 | })
37 |
38 | module.exports = Gempa
39 |
--------------------------------------------------------------------------------
/lib/utils/kisahnabi.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios');
2 |
3 | const Searchnabi = (nabi) => {
4 | return new Promise( async (resolve, reject) => {
5 | await axios.get(`https://raw.githubusercontent.com/Zhirrr/My-SQL-Results/main/kisahnabi/${nabi}.json`)
6 | .then(response => {
7 | if(response.status == 200){
8 | const results = response.data
9 |
10 | data = {}
11 | data.code = response.status
12 | data.message = "ok"
13 | data.nabi = {
14 | nabi: results.name,
15 | lahir: results.thn_kelahiran,
16 | umur: results.usia,
17 | tempat: results.tmp,
18 | image: results.image_url,
19 | kisah: results.description
20 | }
21 |
22 | data.creator = "Zhirrr"
23 | console.log(results)
24 | resolve(data)
25 | }else{
26 | reject({
27 | code: 500,
28 | success: false,
29 | message: "Server Sedang Maintance"
30 | })
31 | }
32 | })
33 | .catch(err => {
34 | reject(err)
35 | })
36 | })
37 | }
38 |
39 | module.exports = Searchnabi
40 |
--------------------------------------------------------------------------------
/lib/utils/vokal.js:
--------------------------------------------------------------------------------
1 | const lower = /[aiueo]/g
2 | const upper = /[AIUEO]/g
3 |
4 | const Vokal = (str,huruf) => new Promise((resolve, reject) => {
5 | var huruf_kecil = huruf.toLowerCase();
6 | var huruf_gede = huruf.toUpperCase();
7 | const result_text = str.replace(lower, huruf_kecil).replace(upper, huruf_gede)
8 | resolve({
9 | text: str,
10 | result_text
11 | })
12 | })
13 |
14 | module.exports = Vokal
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "my-rest-api",
3 | "version": "1.0.0",
4 | "description": "Rest api created by Zeeoneofc",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index.js"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/zeeoneofficial/my-rest-api.git"
12 | },
13 | "keywords": [
14 | "nodejs-restapi",
15 | "heroku",
16 | "css",
17 | "html",
18 | "api",
19 | "website",
20 | "apikey"
21 | ],
22 | "author": "Zeeoneofc",
23 | "license": "ISC",
24 | "dependencies": {
25 | "@bochilteam/scraper": "^3.0.0",
26 | "axios": "^0.21.1",
27 | "cookie": "^0.5.0",
28 | "crypto": "^1.0.1",
29 | "cfonts": "^2.9.1",
30 | "chalk": "^4.1.0",
31 | "cors": "^2.8.5",
32 | "compression": "^1.7.4",
33 | "connect-flash": "^0.1.1",
34 | "cookie-parser": "^1.4.5",
35 | "ejs": "^3.1.6",
36 | "express": "^4.17.1",
37 | "express-ejs-layouts": "^2.5.1",
38 | "express-rate-limit": "^5.3.0",
39 | "express-session": "^1.17.2",
40 | "form-data": "^3.0.0",
41 | "fluent-ffmpeg": "^2.1.2",
42 | "file-type": "^16.1.0",
43 | "jsonwebtoken": "^8.5.1",
44 | "lodash": "^4.17.20",
45 | "memorystore": "^1.6.6",
46 | "mongoose": "^5.13.5",
47 | "mongodb": "^3.6.3",
48 | "needle": "^2.6.0",
49 | "nodemailer": "^6.6.3",
50 | "node-fetch": "^2.6.1",
51 | "node-schedule": "^2.0.0",
52 | "passport": "^0.4.1",
53 | "passport-local": "^1.0.0",
54 | "request": "^2.88.2",
55 | "ssl-express-www": "^3.0.7"
56 | },
57 | "homepage": "https://github.com/zeeoneofficial/my-rest-api#readme"
58 | }
59 |
--------------------------------------------------------------------------------
/replit.nix:
--------------------------------------------------------------------------------
1 | { pkgs }: {
2 | deps = [
3 | pkgs.nodejs-16_x
4 | pkgs.libwebp
5 | pkgs.nodePackages.typescript
6 | pkgs.libuuid
7 | pkgs.ffmpeg
8 | pkgs.imagemagick
9 | pkgs.wget
10 | pkgs.git
11 | pkgs.nodePackages.pm2
12 | ];
13 | env ={
14 | LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [pkgs.libuuid];
15 | };
16 | }
--------------------------------------------------------------------------------
/routes/Zeeoneofc:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/routes/main.js:
--------------------------------------------------------------------------------
1 | __path = process.cwd()
2 |
3 | var express = require('express');
4 | var router = express.Router();
5 |
6 |
7 | module.exports = router
8 |
--------------------------------------------------------------------------------
/settings.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 |
3 | global.creator = 'Zeeoneofc'// yourname
4 | global.MONGO_DB_URI = "" //database mongodb
5 | global.ACTIVATION_TOKEN_SECRET = "-@Pqnap+@(/1jAPPnew/@10" //isi apa aja bebas
6 | global.your_email = "" //email
7 | global.email_password = "" //application password email
8 | global.limitCount = 10000
9 | global.YUOR_PORT = 8000
10 | global.loghandler = {
11 | noapikey:{
12 | status: 403,
13 | message: 'Input parameter apikey',
14 | creator: `${creator}`,
15 | result: "error"
16 | },
17 | error: {
18 | status: 503,
19 | message: 'Service Unavaible, Sedang dalam perbaikan',
20 | creator: `${creator}`
21 | },
22 | apikey: {
23 | status: 403,
24 | message: 'Forbiden, Invalid apikey',
25 | creator: `${creator}`
26 | },
27 | noturl: {
28 | status: 403,
29 | message: 'Forbiden, Invlid url, masukkan parameter url',
30 | creator: `${creator}`,
31 | }
32 | }
33 | let file = require.resolve(__filename)
34 | fs.watchFile(file, () => {
35 | fs.unwatchFile(file)
36 | console.log(`Update'${__filename}'`)
37 | delete require.cache[file]
38 | require(file)
39 | })
40 |
--------------------------------------------------------------------------------
/tmp/zeeoneofc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zeeoneofficial/my-rest-api/c30f9331ba5c7576917062a1d26af66147d0fb8a/tmp/zeeoneofc
--------------------------------------------------------------------------------
/views/layouts/alert.ejs:
--------------------------------------------------------------------------------
1 | <% if (success_msg != '') { %>
2 |
3 |
6 | <%- success_msg %>
7 |
8 | <% } %>
9 |
10 | <% if (error_msg != '') { %>
11 |
12 |
15 | <%- error_msg %>
16 |
17 | <% } %>
--------------------------------------------------------------------------------
/views/layouts/error.ejs:
--------------------------------------------------------------------------------
1 | <% if (error != '') { %>
2 |
3 |
6 | <%- error %>
7 |
8 | <% } %>
--------------------------------------------------------------------------------
/views/login.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Login
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | <%- include('layouts/alert') %>
20 | <%- include('layouts/error') %>
21 |
22 |
23 |
24 |
25 |
26 |
27 |

28 |
29 |
30 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
76 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/views/signup.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Signup
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | <%- include('layouts/alert') %>
20 | <%- include('layouts/error') %>
21 |
22 |
23 |
24 |
25 |
26 |
27 |

28 |
29 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
86 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/views/zeeoneofc:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------