├── lib ├── helper │ ├── bot.json │ ├── antilink.json │ ├── welcome.json │ ├── antisticker.json │ ├── stickerspam.json │ ├── badword.json │ ├── limit.json │ ├── msgBadword.json │ └── settings.json ├── database │ ├── bacot.json │ ├── banned.json │ ├── limit.json │ ├── premium.json │ ├── katakasar.json │ └── user.json ├── font │ ├── Indie-Flower.ttf │ └── ObelixProBIt-cyr.ttf ├── index.js ├── shortener.js ├── translate.js ├── remove-bg.js ├── kataKotor.js ├── info.txt ├── stickertext.js ├── update.txt ├── meme.js ├── downloader.js └── scraper.js ├── util ├── stat.json ├── index.js ├── color.js ├── getBase64.js ├── imageProcessing.js ├── msgFilter.js ├── options.js └── fetcher.js ├── .github └── imagemagic.png ├── media └── images │ ├── buku │ ├── sebelumkiri.jpg │ ├── setelahkiri.jpg │ ├── sebelumkanan.jpg │ └── setelahkanan.jpg │ └── folio │ ├── sebelumkanan.jpg │ ├── sebelumkiri.jpg │ ├── setelahkanan.jpg │ └── setelahkiri.jpg ├── .gitignore ├── package.json ├── README.md ├── index.js └── msg └── text └── menu.js /lib/helper/bot.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/database/bacot.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/database/banned.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/database/limit.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/database/premium.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/helper/antilink.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/helper/welcome.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/helper/antisticker.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/helper/stickerspam.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /lib/helper/badword.json: -------------------------------------------------------------------------------- 1 | ["6285236189413-1601885520@g.us"] -------------------------------------------------------------------------------- /lib/database/katakasar.json: -------------------------------------------------------------------------------- 1 | ["asu","bajingan","jembot","silit"] -------------------------------------------------------------------------------- /lib/helper/limit.json: -------------------------------------------------------------------------------- 1 | [{"id":"6285236189413@c.us","limit":20}] -------------------------------------------------------------------------------- /lib/helper/msgBadword.json: -------------------------------------------------------------------------------- 1 | [{"id":"6283150626842@c.us","msg":3}] -------------------------------------------------------------------------------- /lib/database/user.json: -------------------------------------------------------------------------------- 1 | [{"id":"6285236189413@c.us","nama":"mg","umur":"17"}] -------------------------------------------------------------------------------- /util/stat.json: -------------------------------------------------------------------------------- 1 | { 2 | "sent": { 3 | 4 | }, 5 | "receive": { 6 | 7 | } 8 | } -------------------------------------------------------------------------------- /.github/imagemagic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/.github/imagemagic.png -------------------------------------------------------------------------------- /lib/font/Indie-Flower.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/lib/font/Indie-Flower.ttf -------------------------------------------------------------------------------- /lib/helper/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "owner": "6285236189413@c.us", 3 | "banChats": false, 4 | "limitCount": 50 5 | } -------------------------------------------------------------------------------- /lib/font/ObelixProBIt-cyr.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/lib/font/ObelixProBIt-cyr.ttf -------------------------------------------------------------------------------- /media/images/buku/sebelumkiri.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/sebelumkiri.jpg -------------------------------------------------------------------------------- /media/images/buku/setelahkiri.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/setelahkiri.jpg -------------------------------------------------------------------------------- /media/images/buku/sebelumkanan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/sebelumkanan.jpg -------------------------------------------------------------------------------- /media/images/buku/setelahkanan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/buku/setelahkanan.jpg -------------------------------------------------------------------------------- /media/images/folio/sebelumkanan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/sebelumkanan.jpg -------------------------------------------------------------------------------- /media/images/folio/sebelumkiri.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/sebelumkiri.jpg -------------------------------------------------------------------------------- /media/images/folio/setelahkanan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/setelahkanan.jpg -------------------------------------------------------------------------------- /media/images/folio/setelahkiri.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Gimenz/Mg-v2-WhatsApp-BOT/HEAD/media/images/folio/setelahkiri.jpg -------------------------------------------------------------------------------- /util/index.js: -------------------------------------------------------------------------------- 1 | exports.msgFilter = require('./msgFilter') 2 | exports.fetcher = require('./fetcher') 3 | exports.color = require('./color') 4 | exports.getBase64 = require('./getBase64') 5 | exports.options = require('./options') 6 | -------------------------------------------------------------------------------- /util/color.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | /** 3 | * Get text with color 4 | * @param {String} text 5 | * @param {String} color 6 | * @return {String} Return text with color 7 | */ 8 | module.exports = color = (text, color) => !color ? chalk.green(text) : chalk.keyword(color)(text) 9 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | exports.downloader = require('./downloader') 2 | exports.meme = require('./meme') 3 | exports.removebg = require('./remove-bg') 4 | exports.urlShortener = require('./shortener') 5 | exports.translate = require('./translate') 6 | exports.stext = require('./stickertext') 7 | exports.cariKasar = require('./kataKotor') 8 | exports.scraper = require('./scraper') 9 | -------------------------------------------------------------------------------- /lib/shortener.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch') 2 | module.exports = shortener = (url) => new Promise((resolve, reject) => { 3 | console.log('Creating short url...') 4 | fetch(`https://tinyurl.com/api-create.php?url=${url}`) 5 | .then(response => response.text()) 6 | .then(json => { 7 | resolve(json) 8 | }) 9 | .catch((err) => { 10 | reject(err) 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /lib/translate.js: -------------------------------------------------------------------------------- 1 | const { default: translate } = require('google-translate-open-api') 2 | 3 | /** 4 | * Translate Text 5 | * @param {String} text 6 | * @param {String} lang 7 | */ 8 | 9 | module.exports = doing = (text, lang) => new Promise((resolve, reject) => { 10 | console.log(`Translate text to ${lang}...`) 11 | translate(text, { tld: 'cn', to: lang }) 12 | .then((text) => resolve(text.data[0])) 13 | .catch((err) => reject(err)) 14 | }) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Directory 2 | node_modules 3 | .node-persist 4 | 5 | # Dot files 6 | .node-persist 7 | 8 | # Log files 9 | *.log 10 | 11 | # Session files 12 | *.data.json 13 | 14 | # Workspace files 15 | *.code-workspace 16 | 17 | # Lock files 18 | package-lock.json 19 | *.lock 20 | 21 | # Other files 22 | lib/database/welcome.json 23 | lib/database/group.json 24 | lib/database/hastag.json 25 | lib/filmdl.js 26 | lib/functions.js 27 | lib/welcome.js 28 | lib/joox.js 29 | lib/shopee.js 30 | lib/yt.js 31 | util/reqconfig.js 32 | -------------------------------------------------------------------------------- /util/getBase64.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch') 2 | /** 3 | * Get base64 from url 4 | * @param {String} url 5 | */ 6 | module.exports = getBase64 = (url) => new Promise((resolve, reject) => { 7 | fetch(url, { headers: { 'User-Agent': 'okhttp/4.5.0' } }) 8 | .then((response) => response.buffer()) 9 | .then((result) => resolve(`data:${result.headers.get('content-type')};base64,` + result.toString('base64'))) 10 | .catch((err) => { 11 | console.error(err) 12 | reject(err) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /lib/remove-bg.js: -------------------------------------------------------------------------------- 1 | const { RemoveBgResult, removeBackgroundFromImageBase64 } = require('remove.bg') 2 | /** 3 | * Remove Image Background 4 | * 5 | * @param {String} base64img 6 | */ 7 | 8 | var apikey = 'Get api-key at remove.bg' 9 | 10 | const removebg = async (base64img) => new Promise(async (resolve, reject) => { 11 | await removeBackgroundFromImageBase64({ 12 | base64img, 13 | apiKey: apikey, 14 | size: 'auto', 15 | type: 'auto', 16 | }).then((result) => { 17 | const hasil = result.base64img 18 | resolve(hasil) 19 | }).catch((err) => { 20 | reject(err) 21 | }); 22 | }) 23 | 24 | module.exports = removebg; 25 | 26 | -------------------------------------------------------------------------------- /lib/kataKotor.js: -------------------------------------------------------------------------------- 1 | const sastrawi = require('sastrawijs'); 2 | const fs = require('fs') 3 | let kataKasar = JSON.parse(fs.readFileSync('./lib/database/katakasar.json')) 4 | var sorted = []; 5 | for (var i = 0; i < kataKasar.length; i++) { 6 | sorted.push(kataKasar[i].toLowerCase()); 7 | } 8 | sorted.sort(); 9 | 10 | const inArray = (needle, haystack) => { 11 | let length = haystack.length; 12 | for(let i = 0; i < length; i++) { 13 | if(haystack[i] == needle) return true; 14 | } 15 | return false; 16 | } 17 | 18 | module.exports = cariKasar = (kata) => new Promise((resolve, reject) => { 19 | let sentence = kata; 20 | let stemmer = new sastrawi.Stemmer(); 21 | let tokenizer = new sastrawi.Tokenizer(); 22 | let words = tokenizer.tokenize(sentence); 23 | for (word of words) { 24 | if(inArray(stemmer.stem(word), sorted)){ 25 | resolve(true) 26 | } 27 | } 28 | resolve(false) 29 | }) -------------------------------------------------------------------------------- /util/imageProcessing.js: -------------------------------------------------------------------------------- 1 | const sharp = require('sharp') 2 | const { fromBuffer } = require('file-type') 3 | 4 | /** 5 | * Resize image to buffer or base64 6 | * @param {Buffer} bufferdata 7 | * @param {Boolean} encode 8 | * @param {String} mimType 9 | */ 10 | // eslint-disable-next-line no-async-promise-executor 11 | module.exports = resizeImage = (buff, encode) => new Promise(async (resolve, reject) => { 12 | console.log('Resizeing image...') 13 | const { mime } = await fromBuffer(buff) 14 | sharp(buff, { failOnError: false }) 15 | .resize(512, 512) 16 | .toBuffer() 17 | .then(resizedImageBuffer => { 18 | if (!encode) return resolve(resizedImageBuffer) 19 | console.log('Create base64 from resizedImageBuffer...') 20 | const resizedImageData = resizedImageBuffer.toString('base64') 21 | const resizedBase64 = `data:${mime};base64,${resizedImageData}` 22 | resolve(resizedBase64) 23 | }) 24 | .catch(error => reject(error)) 25 | }) -------------------------------------------------------------------------------- /lib/info.txt: -------------------------------------------------------------------------------- 1 | _*ɪɴꜰᴏʀᴍᴀꜱɪ ᴍɢ-ʙᴏᴛ*_ 2 | ꜱᴛᴀᴛᴜꜱ ʙᴏᴛ : *%state* 3 | 4 | Tolong di BACA dan PAHAMI Penjelasan penggunaan sebelum menggunakan BoT >.< 5 | 6 | Penjelasan : 7 | ◉ Semua perintah/command tidak perlu menggunakan tanda *[* dan *]* 8 | ◉ *Yang di maksud dengan reply/quote pesan, simple nya aja [geser pesan ke kanan]* 9 | ◉ Untuk fitur cuaca, agar lebih akurat dan lokasi tidak salah, kamu bisa share lokasi mu, kemudian reply dengan caption #cuaca 10 | ◉ Untuk #memestiker jangan sekali-kali *menggunakan emoticon*, karena sistem tidak dapat memproses 11 | => Kalau ingin text atas/bawah kosong, gunakan tanda - Contoh = #memestiker - | text bawah 12 | ◉ #emo => emoji *tidak boleh lebih dari 1 emoji*, karena sistem hanya dapat memproses SATU emoji saja 13 | => Contoh = #emo 😁 14 | ◉ Fitur #tts (Text To Speech) dan #tr (Translate) bisa juga digunakan dengan cara reply/quote pesan yang akan di Translate ataupun TTS 15 | ◉ Fitur #profile, yang di maksud NO WA adalah nomor wa dengan country code. 16 | => Contoh = #profile 6285236189411 17 | 18 | Telegram Channel: t.me/info_mg 19 | Group WA Mg-BoT : minta ke admin #min minta link grup -------------------------------------------------------------------------------- /lib/stickertext.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const { registerFont, createCanvas } = require("canvas"); 4 | const canvasTxt = require("canvas-txt").default; 5 | var text2png = require('text2png'); 6 | 7 | const stext = async (text) => new Promise(async (resolve, reject) => { 8 | function fontFile(name) { 9 | return path.join(__dirname, '/font/', name) 10 | } 11 | registerFont(fontFile('ObelixProBIt-cyr.ttf'), { family: 'pg' }) 12 | //await client.reply(from, '_Sek yo... gek gawe stiker_', id) 13 | const canvas = createCanvas(500, 500); 14 | const ctx = canvas.getContext("2d"); 15 | // alpha bg 16 | ctx.fillStyle = "rgba(0,0,0,0)"; 17 | ctx.fillRect(0, 0, canvas.width, canvas.height); 18 | 19 | const txt = text 20 | ctx.fillStyle = "white"; 21 | ctx.strokeStyle = "black" 22 | canvasTxt.font = 'pg' 23 | canvasTxt.align = 'center' 24 | canvasTxt.lineHeight = null 25 | canvasTxt.justify = false 26 | canvasTxt.fontSize = 80; 27 | canvasTxt.drawText(ctx, txt, 70, 50, 400, 400) 28 | const mediaData = canvas.toDataURL() 29 | resolve(mediaData) 30 | const err = 'Error' 31 | reject(err) 32 | }) 33 | 34 | module.exports = stext; -------------------------------------------------------------------------------- /lib/update.txt: -------------------------------------------------------------------------------- 1 | _*ᴜᴘᴅᴀᴛᴇ ᴍɢ-ʙᴏᴛ*_ 2 | Status Bot : *%state* 3 | 4 | 17 - 11 - 2020 5 | [+] Joox downloader 6 | [+] Template menu baru agar tidak membosankan 7 | [+] dan beberapa fitur baru, cek sendiri di #menu 8 | 9 | 18 - 11 - 2020 10 | [+] Filter *Anti Badword* 11 | => Member grup yang mengirim pesan mengandung badword [kata kasar] lebih dari 10x akan di kick otomatis oleh bot 12 | => Fitur ini dapat di aktifkan atau nonaktifkan 13 | => #filter on / off 14 | [+] Filter *Anti Link group* 15 | => Member grup yang mengirim pesan mengandung link chat group akan di kick otomatis oleh bot TANPA PERINGATAN! 16 | => Fitur ini dapat di aktifkan atau nonaktifkan 17 | => #antilink on / off 18 | [+] Filter *Anti Spam Sticker* 19 | => Member grup yang spam sticker sebanyak 10x di group akan di kick otomatis oleh bot TANPA PERINGATAN! 20 | => Fitur ini dapat di aktifkan atau nonaktifkan 21 | => #antisticker on / off 22 | [+] Setiap admin group berwenang untuk mereset data member yang telah spam sticker atau badword 23 | => #resetbadword [NO WA / @member] === (RESET DATA MEMBER YANG SPAM BADWORD) 24 | => #resetsticker [NO WA / @member] === (RESET DATA MEMBER YANG SPAM STICKER) 25 | 26 | [Bagi yang ingin registrasi ulang, karena data salah, silahkan donasi seikhlasnya. kirim #donasi untuk melihat info donasi] 27 | 28 | Bila menemukan bugs/bot error, lapor ke admin bot. 29 | cara lapor mudah, kirim aja #bug [deskripsi bug] 30 | 31 | Telegram Channel: t.me/info_mg 32 | Group WA Mg-BoT : minta ke admin #min minta link grup -------------------------------------------------------------------------------- /util/msgFilter.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const moment = require('moment-timezone') 3 | const updateJson = require('update-json-file') 4 | moment.tz.setDefault('Asia/Jakarta').locale('id') 5 | /** 6 | * Get text with color 7 | * @param {String} text 8 | * @param {String} color 9 | * @return {String} Return text with color 10 | */ 11 | const color = (text, color) => { 12 | return !color ? chalk.green(text) : chalk.keyword(color)(text) 13 | } 14 | 15 | /** 16 | * Get Time duration 17 | * @param {Date} timestamp 18 | * @param {Date} now 19 | */ 20 | const processTime = (timestamp, now) => { 21 | // timestamp => timestamp when message was received 22 | return moment.duration(now - moment(timestamp * 1000)).asSeconds() 23 | } 24 | /** 25 | * is it url? 26 | * @param {String} url 27 | */ 28 | const isUrl = (url) => { 29 | return url.match(new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/gi)) 30 | } 31 | 32 | // Message Filter / Message Cooldowns 33 | const usedCommandRecently = new Set() 34 | 35 | /** 36 | * Check is number filtered 37 | * @param {String} from 38 | */ 39 | const isFiltered = (from) => { 40 | return !!usedCommandRecently.has(from) 41 | } 42 | 43 | /** 44 | * Add number to filter 45 | * @param {String} from 46 | */ 47 | const addFilter = (from) => { 48 | usedCommandRecently.add(from) 49 | setTimeout(() => { 50 | return usedCommandRecently.delete(from) 51 | }, 5000) // 5sec is delay before processing next command 52 | } 53 | 54 | // Message type Log 55 | const messageLog = (fromMe, type) => updateJson('utils/stat.json', (data) => { 56 | (fromMe) ? (data.sent[type]) ? data.sent[type] += 1 : data.sent[type] = 1 : (data.receive[type]) ? data.receive[type] += 1 : data.receive[type] = 1 57 | return data 58 | }) 59 | 60 | module.exports = { 61 | msgFilter: { 62 | isFiltered, 63 | addFilter 64 | }, 65 | processTime, 66 | isUrl, 67 | color, 68 | messageLog 69 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mg-bot-v2", 3 | "version": "2.0.0", 4 | "description": "Whatsapp Bot - sticker creator", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "masgimenz", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/Gimenz/Mg-v2-WhatsApp-BOT.git" 14 | }, 15 | "license": "MIT", 16 | "dependencies": { 17 | "@justalk/pornhub-api": "^3.3.0", 18 | "@open-wa/wa-automate": "^3.0.16", 19 | "base64-string": "^1.1.2", 20 | "brainly-scraper": "^1.0.2", 21 | "canvas": "^2.6.1", 22 | "canvas-txt": "^3.0.0", 23 | "chalk": "^4.1.0", 24 | "dotenv": "^8.2.0", 25 | "file-type": "^16.0.1", 26 | "fs": "0.0.1-security", 27 | "fs-extra": "^9.0.1", 28 | "g-i-s": "^2.1.6", 29 | "genius-lyrics-scrape": "^1.2.0", 30 | "google-it": "^1.5.4", 31 | "google-translate-open-api": "^1.3.7", 32 | "gtts": "^0.2.1", 33 | "html-to-text": "^6.0.0", 34 | "merge-options": "^3.0.3", 35 | "moment-timezone": "^0.5.32", 36 | "mysql": "^2.18.1", 37 | "node-cron": "^2.0.3", 38 | "node-fetch": "^2.6.1", 39 | "npm-check-updates": "^10.2.1", 40 | "pornhub.js": "^0.2.4", 41 | "pornnhub": "^1.0.0", 42 | "remove.bg": "^1.3.0", 43 | "sastrawijs": "^1.0.3", 44 | "sharp": "^0.26.3", 45 | "soundcloud-downloader": "^0.2.0", 46 | "superagent": "^6.1.0", 47 | "text2png": "^2.3.0", 48 | "update-json-file": "^1.1.1", 49 | "util": "^0.12.3", 50 | "xml2js": "^0.4.23", 51 | "yt-search": "^2.5.0" 52 | }, 53 | "devDependencies": { 54 | "babel-eslint": "^10.1.0", 55 | "eslint": "^7.13.0", 56 | "eslint-config-standard": "^16.0.2", 57 | "eslint-plugin-import": "^2.22.1", 58 | "eslint-plugin-node": "^11.1.0", 59 | "eslint-plugin-promise": "^4.2.1", 60 | "eslint-plugin-standard": "^4.1.0", 61 | "nodemon": "^2.0.6" 62 | }, 63 | "directories": { 64 | "lib": "lib" 65 | }, 66 | "keywords": [ 67 | "whatsapp", 68 | "bot" 69 | ] 70 | } 71 | -------------------------------------------------------------------------------- /util/options.js: -------------------------------------------------------------------------------- 1 | //const fs = require('fs') 2 | /** 3 | * Get Client Options 4 | * @param {Function} start function 5 | * @param {Boolean} headless 6 | */ 7 | 8 | module.exports = options = (headless, start) => { 9 | // const chromePath = { 10 | // win32: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', // Windows 32 bit 11 | // win64: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', // Windows 64 bit 12 | // linuxChrome: '/usr/bin/google-chrome-stable', // Linux - Chrome 13 | // linuxChromium: '/usr/bin/chromium-browser', // Linux - Chromium 14 | // darwin: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' // MacOS 15 | // } 16 | 17 | // if (fs.existsSync(chromePath.win32)) { 18 | // execPath = chromePath.win32 19 | // } else if (fs.existsSync(chromePath.win64)) { 20 | // execPath = chromePath.win64 21 | // } else if (fs.existsSync(chromePath.linuxChrome)) { 22 | // execPath = chromePath.linuxChrome 23 | // } else if (fs.existsSync(chromePath.linuxChromium)) { 24 | // execPath = chromePath.linuxChromium 25 | // } else if (process.platform === 'darwin') { 26 | // execPath = chromePath.darwin 27 | // } else { 28 | // console.error(new Error('Google Chrome Is Not Installed')) 29 | // process.exit(1) 30 | // } 31 | 32 | const options = { 33 | headless: headless, 34 | qrRefreshS: 20, 35 | qrTimeout: 0, 36 | authTimeout: 0, 37 | autoRefresh: true, 38 | restartOnCrash: start, 39 | cacheEnabled: false, 40 | // executablePath: execPath, 41 | useChrome: true, 42 | killProcessOnBrowserClose: true, 43 | throwErrorOnTosBlock: false, 44 | chromiumArgs: [ 45 | '--no-sandbox', 46 | '--disable-setuid-sandbox', 47 | '--aggressive-cache-discard', 48 | '--disable-cache', 49 | '--disable-application-cache', 50 | '--disable-offline-load-stale-cache', 51 | '--disk-cache-size=0' 52 | ] 53 | } 54 | 55 | return options 56 | } -------------------------------------------------------------------------------- /lib/meme.js: -------------------------------------------------------------------------------- 1 | const { fetchJson, fetchBase64 } = require('../util/fetcher') 2 | 3 | /** 4 | * Get meme from random subreddit 5 | * 6 | * @param {String} subreddit 7 | * @return {Promise} Return meme from dankmemes, wholesomeanimemes, wholesomememes, AdviceAnimals, MemeEconomy, memes, terriblefacebookmemes, teenagers, historymemes 8 | */ 9 | const random = (subreddit) => new Promise((resolve, reject) => { 10 | const subreddits = ['dankmemes', 'wholesomeanimemes', 'wholesomememes', 'AdviceAnimals', 'MemeEconomy', 'memes', 'terriblefacebookmemes', 'teenagers', 'historymemes'] 11 | const randSub = subreddits[Math.random() * subreddits.length | 0] 12 | console.log('looking for memes on ' + randSub) 13 | fetchJson('https://meme-api.herokuapp.com/gimme/' + randSub) 14 | .then((result) => resolve(result)) 15 | .catch((err) => { 16 | console.error(err) 17 | reject(err) 18 | }) 19 | }) 20 | 21 | /** 22 | * create custom meme 23 | * @param {String} imageUrl 24 | * @param {String} topText 25 | * @param {String} bottomText 26 | */ 27 | const custom = async (imageUrl, top, bottom) => new Promise((resolve, reject) => { 28 | topText = top.trim().replace(/\s/g, '_').replace(/\?/g, '~q').replace(/\%/g, '~p').replace(/\#/g, '~h').replace(/\//g, '~s') 29 | bottomText = bottom.trim().replace(/\s/g, '_').replace(/\?/g, '~q').replace(/\%/g, '~p').replace(/\#/g, '~h').replace(/\//g, '~s') 30 | fetchBase64(`https://api.memegen.link/images/custom/${topText}/${bottomText}.png?background=${imageUrl}`, 'image/png') 31 | .then((result) => resolve(result)) 32 | .catch((err) => { 33 | console.error(err) 34 | reject(err) 35 | }) 36 | }) 37 | 38 | const stalk = (username) => new Promise((resolve, reject) => { 39 | fetchJson(`https://test.mumetndase.my.id/stalkv2?username=${username}`) 40 | .then((result) => { 41 | const res = result.result 42 | resolve(res) 43 | }) 44 | .catch((err) => { 45 | console.error(err) 46 | reject(err) 47 | }) 48 | }) 49 | 50 | module.exports = { 51 | random, 52 | custom, 53 | stalk 54 | } -------------------------------------------------------------------------------- /lib/downloader.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable prefer-promise-reject-errors */ 2 | const axios = require('axios') 3 | var vhtear = 'GET apikey at https://api.vhtear.com/' 4 | 5 | /** 6 | * Get pornhub videos download url 7 | * Premium content 8 | * 9 | * @param {string} keyword 10 | */ 11 | const porn = async (keyword) => new Promise(async (resolve, reject) => { 12 | // Hidden content 13 | }) 14 | 15 | /** 16 | * Get instagram stories 17 | * Premium content 18 | * 19 | * @param {string} username 20 | * @param {string} jumlah 21 | */ 22 | const igs = async (username, jumlah) => new Promise(async (resolve, reject) => { 23 | // Premium content 24 | }) 25 | 26 | 27 | const tik = async (url) => new Promise(async (resolve, reject) => { 28 | const api = 'https://api.vhtear.com/tiktokdl?link='+url+'&apikey='+vhtear 29 | axios.get(api).then(async(res) => { 30 | const st = res.data.result 31 | if(st === undefined){ 32 | resolve(`Link tidak valid, atau mungkin akun private`) 33 | }else{ 34 | resolve(st) 35 | } 36 | }).catch(err => { 37 | console.log(err) 38 | resolve(`Server error, atau akun private`) 39 | }) 40 | }) 41 | 42 | 43 | /** 44 | * Get instagram metadata 45 | * 46 | * @param {string} url 47 | */ 48 | const ig = async (url) => new Promise(async (resolve, reject) => { 49 | const api = 'https://test.mumetndase.my.id/igdl?url='+url 50 | axios.get(api).then(async(res) => { 51 | const st = res.data.result 52 | if(st.status === false){ 53 | resolve(`Asupan tidak ditemukan!! Coba lagi`) 54 | }else{ 55 | resolve(st) 56 | } 57 | }).catch(err => { 58 | console.log(err) 59 | resolve(`Server error, try again!`) 60 | }) 61 | }) 62 | 63 | 64 | /** 65 | * Get Twitter Metadata 66 | * 67 | * @param {String} url 68 | */ 69 | const tweet = (url) => new Promise((resolve, reject) => { 70 | const api = 'https://test.mumetndase.my.id/twitter?url='+url 71 | axios.get(api).then((res) => { 72 | const st = res.data.result 73 | if(typeof st.status === false){ 74 | resolve(`Errooooorrrrrrrrrrrrrr!`) 75 | }else{ 76 | resolve(st) 77 | } 78 | }).catch(err => { 79 | console.log(err) 80 | resolve(`Server error, try again!`) 81 | }) 82 | }) 83 | 84 | module.exports = { tweet, tik, porn, igs, ig } 85 | -------------------------------------------------------------------------------- /util/fetcher.js: -------------------------------------------------------------------------------- 1 | const fetch = require('node-fetch') 2 | const FormData = require('form-data') 3 | const fs = require('fs') 4 | const { fromBuffer } = require('file-type') 5 | const resizeImage = require('./imageProcessing') 6 | 7 | /** 8 | *Fetch Json from Url 9 | * 10 | *@param {String} url 11 | *@param {Object} options 12 | */ 13 | const fetchJson = (url, options) => 14 | new Promise((resolve, reject) => 15 | fetch(url, options) 16 | .then(response => response.json()) 17 | .then(json => resolve(json)) 18 | .catch(err => { 19 | console.error(err) 20 | reject(err) 21 | }) 22 | ) 23 | 24 | /** 25 | * Fetch Text from Url 26 | * 27 | * @param {String} url 28 | * @param {Object} options 29 | */ 30 | const fetchText = (url, options) => { 31 | return new Promise((resolve, reject) => { 32 | return fetch(url, options) 33 | .then(response => response.text()) 34 | .then(text => resolve(text)) 35 | .catch(err => { 36 | console.error(err) 37 | reject(err) 38 | }) 39 | }) 40 | } 41 | 42 | /** 43 | * Fetch base64 from url 44 | * @param {String} url 45 | */ 46 | 47 | const fetchBase64 = (url, mimetype) => { 48 | return new Promise((resolve, reject) => { 49 | console.log('Get base64 from:', url) 50 | return fetch(url) 51 | .then((res) => { 52 | const _mimetype = mimetype || res.headers.get('content-type') 53 | res.buffer() 54 | .then((result) => resolve(`data:${_mimetype};base64,` + result.toString('base64'))) 55 | }) 56 | .catch((err) => { 57 | console.error(err) 58 | reject(err) 59 | }) 60 | }) 61 | } 62 | 63 | /** 64 | * Upload Image to Telegra.ph 65 | * 66 | * @param {String} base64 image buffer 67 | * @param {Boolean} resize 68 | */ 69 | 70 | const uploadImages = (buffData, type) => { 71 | // eslint-disable-next-line no-async-promise-executor 72 | return new Promise(async (resolve, reject) => { 73 | const { ext } = await fromBuffer(buffData) 74 | const filePath = 'util/tmp.' + ext 75 | const _buffData = type ? await resizeImage(buffData, true) : buffData 76 | fs.writeFile(filePath, _buffData, { encoding: 'base64' }, (err) => { 77 | if (err) return reject(err) 78 | console.log('Uploading image to telegra.ph server...') 79 | const fileData = fs.readFileSync(filePath) 80 | const form = new FormData() 81 | form.append('file', fileData, 'tmp.' + ext) 82 | fetch('https://telegra.ph/upload', { 83 | method: 'POST', 84 | body: form 85 | }) 86 | .then(res => res.json()) 87 | .then(res => { 88 | if (res.error) return reject(res.error) 89 | resolve('https://telegra.ph' + res[0].src) 90 | }) 91 | .then(() => fs.unlinkSync(filePath)) 92 | .catch(err => reject(err)) 93 | }) 94 | }) 95 | } 96 | 97 | module.exports = { 98 | fetchJson, 99 | fetchText, 100 | fetchBase64, 101 | uploadImages 102 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

mg WhatsApp-BOT

2 |

Just Simple WhatsApp BOT

3 |

SCRIPT TIDAK DIJUAL. DAN REPO INI TIDAK DILANJUTKAN! SAYA SUDAH PENSIUN NGEBOT!!! MAKASIH SEMUA :)

4 | 5 | ### Install 6 | Clone this project 7 | ```bash 8 | > git clone https://github.com/Gimenz/Mg-v2-WhatsApp-BOT.git 9 | > cd Mg-v2-WhatsApp-BOT 10 | ``` 11 | 12 | Install the dependencies: 13 | ```bash 14 | > npm install 15 | ``` 16 | 17 | ## Information 18 | - Bot Work on 06.00 AM - 12.00 AM Local Indonesian Time Asia/Jakarta 19 | - Set bot owner number on lib/helper/settings.json **(Important)** 20 | - Set limitCount on lib/helper/settings.json **(Optional)** 21 | - Set accuweather, simsimi, farzain apikey on lib/scraper.js **(Important)** 22 | - Set remove.bg apikey on lib/remove.bg.js **(Important)** 23 | - And some features require premium apikey from [VHTEAR](https://api.vhtear.com/) 24 | - Add badword list on lib/katakasar.json **(Important)** 25 | 26 | 27 | #### For Bot Nulis Support **(Important)** 28 | - [ImageMagick](https://bit.ly/3faAi8l) 29 | - Checklist like this 30 |

31 | 32 |

33 | 34 | #### For GIF Sticker Support **(Important)** 35 | - [FFMPEG](https://ffmpeg.org/download.html) 36 | - [TUTORIAL](https://video.stackexchange.com/questions/20495/how-do-i-set-up-and-use-ffmpeg-in-windows) 37 | 38 | Usage 39 | ```bash 40 | > npm start 41 | > SCAN QR 42 | ``` 43 | 44 | ## Features 45 | #### Chat Utility 46 | | Feature |Yes| 47 | | ------------- | ------------- | 48 | | User Registration |✅| 49 | | Age Limit |✅| 50 | | Group Chat Link Detector|✅| 51 | | Sticker Spam Detector |✅| 52 | | Anti Badword |✅| 53 | | Command Limit |✅| 54 | | Ban User |✅| 55 | 56 | #### Downloader 57 | | Feature |Yes| 58 | | ------------- | ------------- | 59 | | Instagram (Multiple Post) |✅| 60 | | Instagram Profile Picture |✅| 61 | | YouTube Song |✅| 62 | | YouTube to mp3|✅| 63 | | YouTube Video |✅| 64 | | Twitter Video |✅| 65 | | Joox Music |✅| 66 | | Facebook Videos |✅| 67 | | SoundCloud Music |✅| 68 | | Google Image |✅| 69 | #### Sticker 70 | | Feature |Yes| 71 | | ------------- | ------------- | 72 | | Sticker from Image |✅| 73 | | Sticker from Video/GIF |✅| 74 | | Sticker from URL |✅| 75 | | Sticker from Emoji|✅| 76 | | Sticker from Giphy |✅| 77 | | Sticker from Text |✅| 78 | | Memesticker |✅| 79 | #### Islamic 80 | | Feature |Yes| 81 | | ------------- | ------------- | 82 | | Quran |✅| 83 | | Jadwal Sholat |✅| 84 | | Tafsir |✅| 85 | #### Group Manager 86 | | Feature |Yes| 87 | | ------------- | ------------- | 88 | | Anti Badword |✅| 89 | | Anti Group Link |✅| 90 | | Anti Sticker Spam |✅| 91 | | Add Member|✅| 92 | | Kick Member |✅| 93 | | Promote Member |✅| 94 | | Demote Member |✅| 95 | | Set On/Off Bot |✅| 96 | | Set Group Picture |✅| 97 | | Lock Group |✅| 98 | | Unlock Group |✅| 99 | | Group Info |✅| 100 | #### Utility 101 | | Feature |Yes| 102 | | ------------- | ------------- | 103 | | Nulis |✅| 104 | | Indonesia Covid |✅| 105 | | BMKG Gempa |✅| 106 | | Google Translate|✅| 107 | | Google Voice |✅| 108 | | Weather Info |✅| 109 | | Google Search |✅| 110 | | KBBI Search |✅| 111 | | WikiPedia Search |✅| 112 | | Shopee Search |✅| 113 | #### Premium Features 114 | | Feature |Yes| 115 | | ------------- | ------------- | 116 | | Instagram Stories |✅| 117 | | Unlimited Quota CMD |✅| 118 | | Sticker No Background |✅| 119 | | Simsimi Chat |✅| 120 | | Gift Quota CMD |✅| 121 | | Brainly Search |✅| 122 | | Add Badword |✅| 123 | #### Just For Fun 124 | | Feature |Yes| 125 | | ------------- | ------------- | 126 | | Random Tag Group Members |✅| 127 | | WhatsApp Stalk |✅| 128 | | Instagram Stalk |✅| 129 | | Puisi 1,2,3|✅| 130 | | Read Mojok.co Article |✅| 131 | | Random Cerpen |✅| 132 | | Random Bacot |✅| 133 | | Specific Bacot |✅| 134 | | Add Bacot |✅| 135 | | Self WhatsApp Info |✅| 136 | | Penyegar Timeline |✅| 137 | 138 | - And many hidden features 139 | ## Contact 140 | - [WhatsApp](https://wa.me/6285236189413) 141 | - [Instagram](https://www.instagram.com/gimenz.id) 142 | - [MG-BOT Whatsapp Group](https://chat.whatsapp.com/GEr9NMYc53z2NIvSVpN62o) 143 | 144 | ## Donation 145 | - [SAWERIA](https://saweria.co/masgimenz) 146 | - [Trakteer](https://trakteer.id/gimenz) 147 | - [OVO/GOPAY/DANA/Pulsa](085236189413) 148 | 149 | ## Big Thanks to 150 | - [WA-Automate](https://github.com/open-wa/wa-automate-nodejs) 151 | - [YogaSakti](https://github.com/YogaSakti/imageToSticker) 152 | - [ItzNgga](https://github.com/ItzNgga/wa-bot.js) 153 | - [MhankBarBar](https://github.com/MhankBarBar/whatsapp-bot) 154 | - [Dandy Raka](https://github.com/dandyraka/NoBadWord) 155 | 156 | ## License 157 | - [MIT](/LICENSE) 158 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { create, Client } = require('@open-wa/wa-automate') 2 | const { color, messageLog } = require('./util') 3 | const msgHandler = require('./msg') 4 | const cron = require('node-cron') 5 | const fs = require('fs') 6 | let settings = JSON.parse(fs.readFileSync('./lib/helper/settings.json')) 7 | 8 | const start = (client = new Client()) => { 9 | console.log('[DEV]', color('masgimenz', 'yellow')) 10 | console.log('[CLIENT] CLIENT Started!') 11 | 12 | // Message log for analytic 13 | client.onAnyMessage((fn) => messageLog(fn.fromMe, fn.type)) 14 | 15 | // Force it to keep the current session 16 | client.onStateChanged((state) => { 17 | console.log('[Client State]', state) 18 | if (state === 'CONFLICT' || state === 'DISCONNECTED') client.forceRefocus() 19 | }) 20 | 21 | // listening on message 22 | client.onMessage((message) => { 23 | // Cut message Cache if cache more than 3K 24 | client.getAmountOfLoadedMessages().then((msg) => (msg >= 3000) && client.cutMsgCache()) 25 | // Message Handler 26 | msgHandler(client, message) 27 | }) 28 | // listen group invitation 29 | client.onAddedToGroup((chat) => { 30 | //let totalMem = chat.groupMetadata.participants.length 31 | /*if (totalMem < 25) { 32 | client.sendText(chat.id, `Maaf, untuk menambahkan bot ini, grup harus melebihi 25 member`).then(() => client.leaveGroup(chat.id)) 33 | client.deleteChat(chat.id) 34 | } else { 35 | 36 | }*/ 37 | client.sendText(chat.groupMetadata.id, `Halo warga grup *${chat.contact.name}* terimakasih sudah menginvite bot ini, sebelum menggunakan bot baca rules dulu ya\nkirim #rules untuk membaca rules penggunaan bot`) 38 | }) 39 | // listen paricipant event on group (wellcome message) 40 | /*client.onGlobalParicipantsChanged((async (event) => { 41 | try { 42 | const idgrup = await client.getChatById(event.chat) 43 | const { name, formattedTitle } = idgrup 44 | const datagrup = (name || formattedTitle) 45 | if (event.action === 'add') { 46 | client.sendText(event.chat, `Halo, Selamat datang di grup *${datagrup}* \n\Silahkan memperkenalkan diri dan baca deskripsi grup`) 47 | } else { 48 | if (event.action === 'remove') 49 | client.sendText(event.chat, 'yah keluar, pasti baperan') 50 | } 51 | } catch (err) { 52 | console.log(err) 53 | } 54 | }))*/ 55 | // listening on Incoming Call 56 | client.onIncomingCall((call) => { 57 | client.sendText(call.peerJid, 'Maaf, bot tidak bisa menerima panggilan. Bot otomatis memblokir apabila menerima panggilan') 58 | .then(() => client.contactBlock(call.peerJid)) 59 | }) 60 | .catch ((err) => { 61 | console.error(err) 62 | }) 63 | } 64 | const options = { 65 | sessionId: 'Imperial', 66 | headless: true, 67 | qrTimeout: 0, 68 | authTimeout: 0, 69 | restartOnCrash: start, 70 | cacheEnabled: false, 71 | useChrome: true, 72 | killProcessOnBrowserClose: true, 73 | throwErrorOnTosBlock: false, 74 | chromiumArgs: [ 75 | '--no-sandbox', 76 | '--disable-setuid-sandbox', 77 | '--aggressive-cache-discard', 78 | '--disable-cache', 79 | '--disable-application-cache', 80 | '--disable-offline-load-stale-cache', 81 | '--disk-cache-size=0' 82 | ] 83 | } 84 | 85 | create(options) 86 | .then((client) => { 87 | start(client) 88 | // Auto on / off BOT & CMD Limiter => Thanks to ItzNgga - XyZ BOT 89 | cron.schedule("0 0 0 * * *", function(){ 90 | settings.banChats = true 91 | fs.writeFileSync('./lib/helper/settings.json',JSON.stringify(settings,null,2)) 92 | client.sendText('Bot Owner Number@c.us', 'Waktunya istirahat :)') 93 | }, { 94 | scheduled: true, 95 | timezone: "Asia/Jakarta" 96 | }); 97 | 98 | cron.schedule("0 0 6 * * *", function(){ 99 | settings.banChats = false 100 | fs.writeFileSync('./lib/helper/settings.json',JSON.stringify(settings,null,2)) 101 | client.sendText('Bot Owner Number@c.us', 'Waktunya Bekerja :)') 102 | }, { 103 | scheduled: true, 104 | timezone: "Asia/Jakarta" 105 | }); 106 | 107 | cron.schedule("0 59 23 * * *", function(){ 108 | let obj = []; 109 | fs.writeFileSync('./lib/helper/limit.json', JSON.stringify(obj)); 110 | console.log('[INFO] Limit restarted!'); 111 | }, { 112 | scheduled: true, 113 | timezone: "Asia/Jakarta" 114 | }); 115 | // Auto on / off BOT & CMD Limiter => Thanks to ItzNgga - XyZ BOT 116 | }) 117 | .catch((err) => new Error(err)) -------------------------------------------------------------------------------- /msg/text/menu.js: -------------------------------------------------------------------------------- 1 | exports.textAbout = () => { 2 | return ` 3 | *About* 4 | Bot developed by *masgimenz.com*. 5 | Instagram = https://www.instagram.com/gimenz.id 6 | Telegram Channel = t.me/infomg` 7 | } 8 | 9 | exports.textDonasi = (pushname) => { 10 | return ` 11 | Hai ${pushname} , support saya dalam pengembangan bot ini yuk. 12 | Silahkan donasi berapapun asalkan kamu ikhlas 13 | pembuat bot juga tidak mendapatkan keuntungan sepeserpun dari bot ini. 14 | 15 | ☕️ *Donasi* ☕️ 16 | *PULSA / DANA / GOPAY / OVO* 17 | Semua Di sini : 18 | [085236189413] 19 | 20 | Mau jadi user premium / join grup? 21 | Kirim foto/ss bukti donasi #min [no wa kamu]` 22 | } 23 | 24 | exports.textMenu = (pushname, tgl, moment) => { 25 | return ` 26 | Hi, ${pushname} :) harap *BACA* *#rules* dan *#info* sebelum menggunakan bot 27 | 28 | 🎀 *ᴍɢ ʙᴏᴛ ᴍᴇɴᴜ* 🎀 29 | 30 | 📌 Semua perintah digunakan *tanpa tanda* [ *dan* ] 31 | 32 | selalu cek limit kamu!! 33 | ◉ *#limit* 34 | ◉ *#tumbas* _[IKLAN BOT]_ 35 | 36 | 💎 *ꜰɪᴛᴜʀ ᴘʀᴇᴍɪᴜᴍ* 💎 37 | ◉ *#igs* [username] [urutan] 38 | ◉ *#sticker nobg* [send image] 39 | ◉ *#simi* [text] 40 | ◉ *#gift* [NO WA] [Jumlah] 41 | ◉ *#brainly* [pertanyaan] *{ᴇʀʀᴏʀ}* 42 | ◉ *#addbadword* [kata kasar] 43 | ◉ *[Unlimited Quota bot]* 44 | 45 | ⚙️ *ᴜᴛɪʟɪᴛᴀꜱ* ⚙️ 46 | ◉ *#nulis* 47 | ◉ *#covid* 48 | ◉ *#gempa* 49 | ◉ *#tr* [kode bahasa] [text] 50 | ◉ *#cuaca* [wilayah] / share loc 51 | ◉ *#kbbi* [kata] 52 | ◉ *#google* [query] 53 | ◉ *#wiki* [query] 54 | ◉ *#shopee* [query] 55 | 56 | 🕌 *ɪꜱʟᴀᴍɪᴄ* 🕌 57 | ◉ *#listsurah* 58 | ◉ *#infosurah* [nama surah] 59 | ◉ *#surah* [nama surah] [ayat] 60 | ◉ *#tafsir* [nama surah] [ayat] 61 | ◉ *#sholat* [wilayah] 62 | 63 | 🎮 *ꜰᴜɴ ᴢᴏɴᴇ* 🎮 64 | ◉ *#gdrive* [link] 65 | ◉ *#lk21* [judul] *{ᴇʀʀᴏʀ}* 66 | ◉ *#film* [link] 67 | ◉ *#ptl* [cans/gans] 68 | ◉ *#tts* [kode bahasa] [text] 69 | ◉ *#me* 70 | ◉ *#profile* [NO WA] 71 | ◉ *#cerpen* 72 | ◉ *#puisi1* 73 | ◉ *#puisi2* 74 | ◉ *#puisi3* 75 | ◉ *#mojok* 76 | ◉ *#addbacot* [bacotanmu] 77 | ◉ *#bacot* 78 | ◉ *#bacot* [nomor] 79 | ◉ *#mock* [kalimat] 80 | ◉ *#stalk* [username] 81 | 82 | 🖼 *ꜱᴛɪᴄᴋᴇʀ ᴢᴏɴᴇ* 🖼 83 | ◉ *#sticker* [send image] 84 | ◉ *#sticker toimg* [reply sticker] 85 | ◉ *#sticker* [url] 86 | ◉ *#emo* [emoji] 87 | ◉ *#memestiker* [teks atas] | [teks bawah] 88 | ◉ *#stext* [teks] 89 | ◉ *#gif* [send video/gif] 90 | ◉ *#giphy* [link] 91 | 92 | 🎧 *ᴍᴜꜱɪᴄ ᴢᴏɴᴇ* 🎧 93 | ◉ *#play* [judul lagu - artis] 94 | ◉ *#ytmp3* [link] 95 | ◉ *#yt* [link] 96 | ◉ *#ytvid* [query] 97 | ◉ *#ytfind* [query] 98 | ◉ *#joox* [judul lagu - artis] 99 | ◉ *#scplay* [judul lagu - artis] 100 | ◉ *#scfind* [judul lagu - artis] 101 | ◉ *#scdl* [link] 102 | ◉ *#findlyrics* [judul lagu - artis] 103 | ◉ *#getlirik* [link] 104 | ◉ *#lirik* [judul lagu - artis] 105 | ◉ *#lirik2* [judul lagu - artis] 106 | 107 | 📂 *ᴅᴏᴡɴʟᴏᴀᴅᴇʀ* 📂 108 | ◉ *#tiktok* [link] 109 | ◉ *#tw / #twitter* [link] 110 | ◉ *#fb* [link] 111 | ◉ *#ig* [link] 112 | ◉ *#igdp* [username] 113 | ◉ *#igp* (Private post download) 114 | ◉ *#igs* [username] 115 | ◉ *#goimg* [query.jumlah] 116 | 117 | 🔰 *ɢʀᴏᴜᴘ ᴄᴏᴍᴍᴀɴᴅ* 🔰 118 | ◉ *#ava* [reply pesan member] 119 | ◉ *#groupinfo* 120 | ◉ *#menuadmin* 121 | ◉ *#profile* [@member / NO WA] 122 | ◉ *#all* [pesan] 123 | ◉ *#reader* [reply pesan bot] 124 | ◉ *#tag* [pesan] 125 | ◉ *#getpic* 126 | ◉ *#listbadword* 127 | ◉ *#santet* [@member | alasan] 128 | 129 | 👑 *ᴀᴅᴍɪɴ ɢʀᴏᴜᴘ ᴛᴏᴏʟꜱ* 👑 130 | ◉ *#on / #off* 131 | ◉ *#filter* [on / off] 132 | ◉ *#antilink* [on / off] 133 | ◉ *#antisticker* [on / off] 134 | ◉ *#resetsticker* [NO WA / @member] 135 | ◉ *#resetbadword* [NO WA / @member] 136 | ◉ *#add* [NO WA] 137 | ◉ *#kick* [@member] 138 | ◉ *#promote* [@member] 139 | ◉ *#demote* [@member] 140 | ◉ *#setdp* [send image] 141 | ◉ *#getlink* 142 | ◉ *#resetlink* 143 | ◉ *#grouplock* 144 | ◉ *#groupunlock* 145 | 146 | 📢 *ᴍɢ ʙᴏᴛ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ* 📢 147 | ◉ *#about* 148 | ◉ *#cekprem* 149 | ◉ *#donasi* 150 | ◉ *#getbot* 151 | ◉ *#min* [Pesan] 152 | ◉ *#req* [fitur] 153 | ◉ *#bug* [deskripsi bug] 154 | ◉ *#ping* 155 | ◉ *#update* 156 | ◉ *#stat* 157 | ◉ *#info* 158 | ₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋ 159 | ⏰ *ᴡᴀᴋᴛᴜ ꜱᴇʀᴠᴇʀ ʙᴏᴛ* : ${moment} WIB 160 | 🗓️ *ᴛᴀɴɢɢᴀʟ* : ${tgl} 161 | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ 162 | 163 | 🛠 _*Menemukan bug? bot error? laporkan ke admin bot, kirim #bug [DESKRIPSI BUG]*_ 164 | 🛠 _*Mau Request fitur? kirim #req [DESKRIPSI FITUR]*_ 165 | 🛠 _*Mau Chat admin bot? kirim #min [PESAN KAMU]*_ 166 | 167 | _ᴄᴏᴅᴇᴅ ᴡɪᴛʜ ❤ ꜰʀᴏᴍ ᴍᴀɢᴇʟᴀɴɢ_` 168 | } 169 | 170 | exports.textNulis = () => { 171 | return ` 172 | *▸ Menu Bot Nulis* 173 | a. *#nuliskiri teks* = nulis di buku tulis lembar kiri 174 | b. *#nuliskanan teks* = nulis di buku tulis lembar kanan 175 | c. *#foliokiri teks* = nulis di kertas folio lembar kiri 176 | d. *#foliokanan teks* = nulis di kertas folio lembar kanan` 177 | } 178 | 179 | exports.textAdmin = () => { 180 | return ` 181 | 👑 *ᴀᴅᴍɪɴ ɢʀᴏᴜᴘ ᴛᴏᴏʟꜱ* 👑 182 | ◉ *#on / #off* 183 | ◉ *#filter* [on / off] 184 | ◉ *#add* [NO WA] 185 | ◉ *#kick* [@member] 186 | ◉ *#promote* [@member] 187 | ◉ *#demote* [@member] 188 | ◉ *#setdp* [send image] 189 | ◉ *#getlink* 190 | ◉ *#resetlink* 191 | ◉ *#grouplock* 192 | ◉ *#groupunlock*` 193 | } 194 | 195 | exports.textPrem = () => { 196 | return ` 197 | *Fitur Premium* 198 | 199 | a. Stiker No Background 200 | b. Join grup 201 | c. Brainly 202 | d. SimSimi chat 203 | e. Unlimited Quota bot 204 | f. Gift quota bot 205 | d. Ig stories download` 206 | } 207 | 208 | exports.textRules = () => { 209 | return ` 210 | Rules Penggunaan *MG-Bot* 211 | - Dilarang Download Lagu/Video/File diatas 10 Menit 212 | - Dilarang Call/Telpon Bot karena akan terblokir otomatis oleh bot 213 | - Dilarang spam bot kalau bot tidak merespon 214 | 215 | [i] Apa itu limit quota? 216 | => Setiap pengguna bot akan diberi quota sebanyak 50 217 | => Cek limit dengan mengirimkan #limit 218 | => Jika quota telah habis, maka tidak dapat menggunakan bot 219 | => Limit quota bot akan di reset setiap pukul 00.00 WIB 220 | => Unlimited Quota bot untuk member premium 221 | => Untuk melihat status bot dan waktu bot, kirim #ping 222 | 223 | 1. Kami tidak bertanggung jawab jika terjadi sesuatu akibat penggunaan bot ini 224 | 2. Privasi data pengguna tetap kami jaga 225 | 3. Data chat yang anda kirimkan ke bot akan dihapus setiap 2 hari 226 | 4. Lapor jika terjadi masalah atau bot tidak bekerja caranya kirim #min penjelasan bug/error 227 | 5. Sebelum menggunakan bot, Tolong BACA #INFO dan pahami penjelasan penggunaan bot 228 | 229 | Apabila tidak mematuhi Syarat & Ketentuan maka akan dibanned 230 | 231 | Jika sewaktu - waktu bot mati karena banned oleh pihak WhatsApp, silahkan join channel telegram untuk mengetahui informasi update tentang bot ini 232 | Link Channel = t.me/infomg 233 | Group WA = https://chat.whatsapp.com/Gr3RSBZz48J9rYGOsAON3N` 234 | } 235 | 236 | exports.textLang = () => { 237 | return ` 238 | *Daftar kode bahasa* 239 | 240 | af: Afrikaans sq: Albanian 241 | am: Amharic ar: Arabic 242 | hy: Armenian az: Azerbaijani 243 | eu: Basque be: Belarusian 244 | bn: Bengali bs: Bosnian 245 | bg: Bulgarian ca: Catalan 246 | ceb: Cebuano ny: Chichewa 247 | co: Corsican hr: Croatian 248 | cs: Czech da: Danish 249 | nl: Dutch en: English 250 | eo: Esperanto et: Estonian 251 | tl: Filipino fi: Finnish 252 | fr: French fy: Frisian 253 | gl: Galician ka: Georgian 254 | de: German el: Greek 255 | gu: Gujarati ht: Haitian Creole 256 | ha: Hausa haw: Hawaiian 257 | iw: Hebrew hi: Hindi 258 | hmn: Hmong hu: Hungarian 259 | is: Icelandic ig: Igbo 260 | id: Indonesian ga: Irish 261 | it: Italian ja: Japanese 262 | jw: Javanese kn: Kannada 263 | kk: Kazakh km: Khmer 264 | ko: Korean ku: Kurdish 265 | ky: Kyrgyz lo: Lao 266 | la: Latin lv: Latvian 267 | lt: Lithuanian lb: Luxembourgish 268 | mk: Macedonian mg: Malagasy 269 | ms: Malay ml: Malayalam 270 | mt: Maltese mi: Maori 271 | mr: Marathi mn: Mongolian 272 | my: Myanmar ne: Nepali 273 | no: Norwegian ps: Pashto 274 | fa: Persian pl: Polish 275 | pt: Portuguese ma: Punjabi 276 | ro: Romanian ru: Russian 277 | sm: Samoan gd: Scots Gaelic 278 | sr: Serbian st: Sesotho 279 | sn: Shona sd: Sindhi 280 | si: Sinhala sk: Slovak 281 | sl: Slovenian so: Somali 282 | es: Spanish su: Sundanese 283 | sw: Swahili sv: Swedish 284 | tg: Tajik ta: Tamil 285 | te: Telugu th: Thai 286 | tr: Turkish uk: Ukrainian 287 | ur: Urdu uz: Uzbek 288 | vi: Vietnamese cy: Welsh 289 | xh: Xhosa yi: Yiddish 290 | yo: Yoruba zu: Zulu` 291 | } -------------------------------------------------------------------------------- /lib/scraper.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const request = require('request') 3 | const htmlToText = require('html-to-text'); 4 | const moment = require('moment-timezone'); 5 | const { parseString } = require('xml2js'); 6 | moment.tz.setDefault('Asia/Jakarta').locale('id') 7 | var masgi = 'https://test.mumetndase.my.id' 8 | var baseuri = 'https://dataservice.accuweather.com' 9 | var getkey = '/locations/v1/search?apikey=' 10 | var getloc = '/locations/v1/cities/geoposition/search?apikey=' 11 | var getdata = '/currentconditions/v1/' 12 | var lang = '&language=id-id&details=true&offset=25' 13 | var accuweatherkey = 'get apikey here https://developer.accuweather.com/user/register' 14 | 15 | // get javanesse pasaran 16 | const tanggal = () => new Promise(resolve => { 17 | var pasaran = new Array('Legi', 'Pahing', 'Pon', 'Wage', 'Kliwon'); 18 | var hari = moment().format('dddd'); 19 | var tgal = moment().format('DD MMMM YYYY') 20 | var d2 = moment('2014-01-27'); 21 | var d1 = moment(); 22 | var selisih = Math.floor(Math.abs(d1 - d2) / 86400000); 23 | var pasar = pasaran[selisih % 5]; 24 | const tgl = `${hari} ${pasar}, ${tgal}` 25 | resolve(tgl) 26 | }) 27 | 28 | const lirik1 = async (judul) => new Promise(async (resolve, reject) => { 29 | const baseuri = 'http://scrap.terhambar.com' 30 | axios.get(baseuri + '/lirik?word=' + judul, { 31 | headers: { 32 | 'Content-Type': 'application/json' 33 | } 34 | }).then(res => { 35 | const hasil = res.data.result.lirik 36 | const status = res.data.status 37 | if (status == false) { 38 | resolve('ga ada') 39 | } else { 40 | resolve(hasil) 41 | } 42 | }).catch(err => { 43 | reject(err) 44 | }) 45 | }) 46 | 47 | const lirik2 = async (judul) => new Promise(async (resolve, reject) => { 48 | axios.get(uri + '/lirik?q=' + judul, { 49 | headers: { 50 | 'Content-Type': 'application/json' 51 | } 52 | }).then(res => { 53 | const mentah = res.data.result.result[0] 54 | if (mentah == undefined) { 55 | resolve('ga ada') 56 | } else { 57 | const hasil = mentah.url 58 | request.get(masgi + '/getlirik?url=' + hasil, {json: true}, (err, resp, body) => { 59 | const resul = body.result 60 | resolve(resul) 61 | }) 62 | } 63 | }).catch(err => { 64 | reject(err) 65 | }) 66 | }) 67 | 68 | const finder = async (judul) => new Promise(async (resolve, reject) => { 69 | const baseurl = 'https://api.haipbis.xyz/findlyric?q=' 70 | axios.get(baseurl + judul, { 71 | headers: { 72 | 'Content-Type': 'application/json' 73 | } 74 | }).then(async(res) => { 75 | const data = res.data.slice(0, 6) 76 | if (data == undefined) { 77 | resolve('ga ada') 78 | } else { 79 | let hasil = `🔎 *hasil pencarian lirik '${judul}'* 🔍\nCara get lirik, copy link lalu kirimkan #lirik link\n` 80 | hasil += ``; 81 | Object.keys(data).forEach(function (i) { 82 | hasil += `\n● Judul : ${data[i].title}\n● Artis : ${data[i].artist}\n● Link : ${data[i].link.replace('/add', '')}\n`; 83 | }); 84 | hasil += '\n♪ *mg_BOT* ♪'; 85 | resolve(hasil) 86 | } 87 | }).catch(err => { 88 | reject(err) 89 | }) 90 | }) 91 | 92 | const getlirik = async (url) => new Promise(async (resolve, reject) => { 93 | const baseurl = 'https://api.haipbis.xyz/getlyric?url=' 94 | axios.get(baseurl + url, { 95 | headers: { 96 | 'Content-Type': 'application/json' 97 | } 98 | }).then(res => { 99 | const body = res.data 100 | if (body == 'You may want to head back to the homepage.If you think something is broken, report a problem.') { 101 | resolve('ga ada') 102 | } else { 103 | const hasil = body.lyric.replace('🇮🇹 Made with love & passion in Italy.\n 🌎 Enjoyed everywhere', 'Error, lirik tidak ditemukan') 104 | resolve(hasil) 105 | } 106 | }).catch(() => { 107 | reject(err) 108 | }) 109 | }) 110 | 111 | const cuaca = async (kota) => new Promise(async (resolve, reject) => { 112 | axios.get(masgi + '/cuaca?kota=' + kota, { 113 | headers: { 114 | 'Content-Type':'application/json'} 115 | }) 116 | .then(res => { 117 | const eror = res.data.status 118 | const body = res.data.result 119 | if (eror == false) { 120 | resolve('Kota tidak ada dalam database') 121 | } else { 122 | const p = `🌤Prakiraan Cuaca🌦\nWilayah *_${body.kota}_*\n${body.hari}\n\n*Cuaca :* _${body.cuaca}_\n*Deskripsi :* _${body.deskripsi}_\n*Suhu Terasa :* _${body.suhu}_\n*Tekanan Udara :* _${body.tekanan}_\n*Kelembaban :* _${body.kelembapan}_\n*Kecepatan Angin :* _${body.angin}_` 123 | resolve(p) 124 | } 125 | }) 126 | .catch(err => { 127 | reject(err) 128 | }) 129 | }) 130 | 131 | const sholat = async (kota) => new Promise(async (resolve, reject) => { 132 | axios.get(masgi + '/sholat?kota=' + kota, { 133 | headers: { 134 | 'Content-Type':'application/json'} 135 | }) 136 | .then(res => { 137 | const eror = res.data.status 138 | const body = res.data 139 | if (eror == false) { 140 | resolve('Kota tidak ada dalam database') 141 | } else { 142 | const mentah = (body.data[0]) 143 | const waktu = (body.data[0].tanggal) 144 | const wilayah = ('*Jadwal Sholat*\n' + `Wilayah *_${kota}_ dan sekitarnya*\n${waktu}\n\n`) 145 | const imsak = ('● *Imsak :* ' + `${mentah.imsak}\n`) 146 | const subuh = ('● *Subuh :* ' + `${mentah.subuh}\n`) 147 | const terbit = ('● *Terbit :* ' + `${mentah.terbit}\n`) 148 | const dzuhur = ('● *Dzuhur :* ' + `${mentah.dzuhur}\n`) 149 | const ashar = ('● *Ashar :* ' + `${mentah.ashar}\n`) 150 | const maghrib = ('● *Maghrib :* ' + `${mentah.maghrib}\n`) 151 | const isya = ('● *Isya :* ' + `${mentah.isya}\n`) 152 | const text = (wilayah + imsak + subuh + terbit + dzuhur + ashar + maghrib + isya + '\n\n_*ᴍɢ ʙᴏᴛ ᴊᴀᴅᴡᴀʟ ꜱʜᴏʟᴀᴛ*_') 153 | resolve(text) 154 | } 155 | }) 156 | .catch(err => { 157 | reject(err) 158 | }) 159 | }) 160 | 161 | const kbbi = async (kata) => new Promise(async (resolve, reject) => { 162 | const baseuri = 'https://rest.farzain.com/api/kbbi.php?id=' 163 | const apikey = '???' 164 | axios.get(baseuri + kata + '&apikey=' + apikey, { 165 | headers: { 166 | 'Content-Type':'application/json'} 167 | }) 168 | .then(res => { 169 | const body = res.data 170 | if (body === "

") { 171 | resolve('ga ada') 172 | } else { 173 | const hasil = htmlToText.fromString(body, { 174 | wordwrap: 500 175 | }); 176 | resolve(hasil) 177 | } 178 | }) 179 | .catch(err => { 180 | reject(err) 181 | }) 182 | }) 183 | 184 | const wiki = async (kata) => new Promise(async (resolve, reject) => { 185 | const baseuri = 'https://api-mumetndase.herokuapp.com/api/wiki?q=' 186 | axios.get(baseuri + kata, { 187 | headers: { 188 | 'Content-Type':'application/json'} 189 | }) 190 | .then(res => { 191 | const body = res.data.result 192 | const status = res.data.status 193 | if (status === false) { 194 | resolve('ga ada') 195 | } else { 196 | resolve(body) 197 | } 198 | }) 199 | .catch(err => { 200 | reject(err) 201 | }) 202 | }) 203 | 204 | const mojok = () => new Promise(async (resolve, reject) => { 205 | axios.get(masgi + '/mojok', { 206 | headers: { 207 | 'Content-Type':'application/json'} 208 | }) 209 | .then(res => { 210 | const eror = res.data.status 211 | const data = res.data.data 212 | const caption = `*Link :* ${data.url}\n*Judul :* ${data.judul}\n*Post date :* ${data.date}\n*Kategori :* ${data.category}\n\n${data.article}` 213 | if (eror == false) { 214 | resolve('Error') 215 | } else { 216 | resolve(caption) 217 | } 218 | }) 219 | .catch(err => { 220 | reject(err) 221 | }) 222 | }) 223 | 224 | const puisi1 = () => new Promise(async (resolve, reject) => { 225 | axios.get(masgi + '/puisi1', { 226 | headers: { 227 | 'Content-Type':'application/json'} 228 | }) 229 | .then(res => { 230 | const eror = res.data.status 231 | const data = res.data.data 232 | if (eror == false) { 233 | resolve('Error') 234 | } else { 235 | resolve(data) 236 | } 237 | }) 238 | .catch(err => { 239 | reject(err) 240 | }) 241 | }) 242 | 243 | const puisi2 = () => new Promise(async (resolve, reject) => { 244 | axios.get(masgi + '/puisi2', { 245 | headers: { 246 | 'Content-Type':'application/json'} 247 | }) 248 | .then(res => { 249 | const eror = res.data.status 250 | const data = res.data.data 251 | if (eror == false) { 252 | resolve('Error') 253 | } else { 254 | resolve(data) 255 | } 256 | }) 257 | .catch(err => { 258 | reject(err) 259 | }) 260 | }) 261 | 262 | const puisi3 = () => new Promise(async (resolve, reject) => { 263 | axios.get(masgi + '/puisi3', { 264 | headers: { 265 | 'Content-Type':'application/json'} 266 | }) 267 | .then(res => { 268 | const eror = res.data.status 269 | const data = res.data.data 270 | if (eror == false) { 271 | resolve('Error') 272 | } else { 273 | resolve(data) 274 | } 275 | }) 276 | .catch(err => { 277 | reject(err) 278 | }) 279 | }) 280 | 281 | const covid = () => new Promise(async (resolve, reject) => { 282 | const covid = 'https://coronavirus-19-api.herokuapp.com/countries/Indonesia' 283 | axios.get(covid, { 284 | headers: { 285 | 'Content-Type':'application/json'} 286 | }) 287 | .then(res => { 288 | const body = res.data 289 | const judul = ('*Update Data Covid-19 Indonesia*') 290 | const positif = ('\n\n😷 *Positif :* ' + body.cases) 291 | const todaypositif = ('\n😷 *Hari ini :* ' + body.todayCases) 292 | const meninggal = ('\n☠ *Meninggal :* ' + body.deaths) 293 | const todaymeninggal = ('\n☠ *Hari ini :* ' + body.todayDeaths) 294 | const sembuh = ('\n☺ *Sembuh :* ' + body.recovered) 295 | const kata = ('\n\nTetap jaga kesehatan dan ikuti protokol kesehatan\n_#STAYATHOME-PAKAIMASKER_') 296 | const hasil = judul + positif + todaypositif + meninggal + todaymeninggal + sembuh + kata 297 | resolve(hasil) 298 | }) 299 | .catch(err => { 300 | reject(err) 301 | }) 302 | }) 303 | 304 | const accuweather = async (kota) => new Promise(async (resolve, reject) => { 305 | // GET KEY LOKASI BY TEXT 306 | const lokasi = kota 307 | axios.get(baseuri + getkey + accuweatherkey + '&q=' + lokasi + lang, { 308 | headers: { 309 | 'Contet-Type': 'application/json' 310 | } 311 | }).then(res => { 312 | const mentah = res.data[0] 313 | if (mentah === undefined) { 314 | resolve('Wilayahmu tidak ada dalam database') 315 | } else { 316 | const locKey = mentah.Key 317 | //console.log(locKey) 318 | const daerah = mentah.LocalizedName 319 | const prov = mentah.AdministrativeArea.LocalizedName 320 | //GET CUACA BY KEY 321 | axios.get(baseuri + getdata + locKey + '?apikey=' + apiKey + '&language=id-id&details=true', {headers:{'Content-Type':'application/json'}}) 322 | .then(res => { 323 | const datamentah = res.data[0] 324 | const waktu = moment(datamentah.EpochTime * 1000).format('HH:mm') 325 | const tgl = moment(datamentah.EpochTime * 1000).format('dddd, DD MMMM YYYY') 326 | const info = datamentah.WeatherText 327 | const temp = datamentah.RealFeelTemperature.Metric.Value + ' ℃' 328 | const lembab = datamentah.RelativeHumidity + ' %' 329 | const angin = datamentah.Wind.Speed.Metric.Value + ' ' + datamentah.Wind.Speed.Metric.Unit 330 | const angink = datamentah.WindGust.Speed.Metric.Value + ' ' + datamentah.WindGust.Speed.Metric.Unit 331 | const pandang = datamentah.Visibility.Metric.Value + ' ' + datamentah.Visibility.Metric.Unit 332 | const tekanan = datamentah.Pressure.Metric.Value + ' ' + datamentah.Pressure.Metric.Unit 333 | const awan = datamentah.CloudCover + ' %' 334 | const data = `Kondisi cuaca _*${daerah}, ${prov}*_\n𝐉𝐚𝐦 : ${waktu}\n𝐓𝐚𝐧𝐠𝐠𝐚𝐥 : ${tgl}\n₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋\n● Deskripsi : ${info}\n● Temperatur : ${temp}\n● Kelembapan : ${lembab}\n● Angin : ${angin}\n● Angin Kencang : ${angink}\n● Jarak Pandang : ${pandang}\n● Tekanan Udara : ${tekanan}\n● Tutupan Awan : ${awan}\n⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻\n_*ᴍɢ ʙᴏᴛ ᴡᴇᴀᴛʜᴇʀ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ*_` 335 | //console.log(data) 336 | resolve(data) 337 | }).catch(err => { 338 | //console.log(err) 339 | reject('Wilayahmu tidak ada dalam database' + err) 340 | }) 341 | } 342 | }).catch(err => { 343 | reject(err) 344 | console.log(err) 345 | }) 346 | }) 347 | 348 | 349 | const accuweatherloc = async (latitude, longitude) => new Promise(async (resolve, reject) => { 350 | // GET KEY LOKASI BY LONG LAT 351 | const lat = latitude 352 | const long = longitude 353 | axios.get(baseuri + getloc + accuweatherkey + '&q=' + lat + '%2C' + long + '&language=id-id&details=true', { 354 | headers: { 355 | 'Contet-Type': 'application/json' 356 | } 357 | }).then(res => { 358 | //console.log(res) 359 | const mentah = res.data 360 | if (mentah === undefined) { 361 | resolve('Wilayahmu tidak ada dalam database') 362 | } else { 363 | const locKey = mentah.Key 364 | //console.log(locKey) 365 | const daerah = mentah.LocalizedName 366 | const prov = mentah.AdministrativeArea.LocalizedName 367 | //GET CUACA BY KEY 368 | axios.get(baseuri + getdata + locKey + '?apikey=' + apiKey + '&language=id-id&details=true', {headers:{'Content-Type':'application/json'}}) 369 | .then(res => { 370 | const datamentah = res.data[0] 371 | const waktu = moment(datamentah.EpochTime * 1000).format('HH:mm') 372 | const tgl = moment(datamentah.EpochTime * 1000).format('dddd, DD MMMM YYYY') 373 | const info = datamentah.WeatherText 374 | const temp = datamentah.RealFeelTemperature.Metric.Value + ' ℃' 375 | const lembab = datamentah.RelativeHumidity + ' %' 376 | const angin = datamentah.Wind.Speed.Metric.Value + ' ' + datamentah.Wind.Speed.Metric.Unit 377 | const angink = datamentah.WindGust.Speed.Metric.Value + ' ' + datamentah.WindGust.Speed.Metric.Unit 378 | const pandang = datamentah.Visibility.Metric.Value + ' ' + datamentah.Visibility.Metric.Unit 379 | const tekanan = datamentah.Pressure.Metric.Value + ' ' + datamentah.Pressure.Metric.Unit 380 | const awan = datamentah.CloudCover + ' %' 381 | const data = `Kondisi cuaca _*${daerah}, ${prov}*_\n𝐉𝐚𝐦 : ${waktu}\n𝐓𝐚𝐧𝐠𝐠𝐚𝐥 : ${tgl}\n₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋\n● Deskripsi : ${info}\n● Temperatur : ${temp}\n● Kelembapan : ${lembab}\n● Angin : ${angin}\n● Angin Kencang : ${angink}\n● Jarak Pandang : ${pandang}\n● Tekanan Udara : ${tekanan}\n● Tutupan Awan : ${awan}\n⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻\n_*ᴍɢ ʙᴏᴛ ᴡᴇᴀᴛʜᴇʀ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ*_` 382 | //console.log(data) 383 | resolve(data) 384 | }).catch(err => { 385 | //console.log(err) 386 | reject(err) 387 | }) 388 | } 389 | }).catch(err => { 390 | reject(err) 391 | console.log(err) 392 | }) 393 | }) 394 | 395 | const simi = async (tanya) => new Promise(async (resolve, reject) => { 396 | var apiKey = 'get apikey here https://workshop.simsimi.com/en/login' 397 | const takon = tanya 398 | const headers = { 399 | "Content-Type": "application/json", 400 | "x-api-key": apiKey, 401 | }; 402 | const options = { 403 | utext: takon, 404 | lang: "id", 405 | country: ["ID"], 406 | atext_bad_prob_max: 0.5, 407 | } 408 | await axios.post("https://wsapi.simsimi.com/190410/talk",options,{headers: headers,}) 409 | .then(re => { 410 | resolve(re.data.atext); 411 | }) 412 | .catch(error => { 413 | //console.log(error) 414 | resolve(`Simsimi Error`); 415 | }); 416 | }) 417 | 418 | const gempa = () => new Promise(async (resolve, reject) => { 419 | const uri = 'https://data.bmkg.go.id/autogempa.xml' 420 | axios.get(uri,).then(res => { 421 | parseString(res.data, function (err, result) { 422 | result = result.Infogempa.gempa[0]; 423 | let hasils = `_*Informasi Gempa BMKG*_ 424 | ₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋₋ 425 | ● Tanggal : ${result.Tanggal} 426 | ● Jam : ${result.Jam} 427 | ● Magnitudo : ${result.Magnitude} 428 | ● Kedalaman : ${result.Kedalaman} 429 | ● Lintang : ${result.Lintang} 430 | ● Bujur : ${result.Bujur} 431 | ● Lokasi 1 : ${result.Wilayah1} 432 | ● Lokasi 2 : ${result.Wilayah2} 433 | ● Lokasi 3 : ${result.Wilayah3} 434 | ● Lokasi 4 : ${result.Wilayah4} 435 | ● Lokasi 5 : ${result.Wilayah5} 436 | ● Potensi : ${result.Potensi} 437 | ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ 438 | _*ᴍɢ ʙᴏᴛ ʙᴍᴋɢ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ*_` 439 | resolve(hasils) 440 | }) 441 | }) 442 | }) 443 | 444 | module.exports = { 445 | lirik1, 446 | lirik2, 447 | finder, 448 | getlirik, 449 | cuaca, 450 | sholat, 451 | kbbi, 452 | wiki, 453 | tanggal, 454 | mojok, 455 | puisi1, 456 | puisi2, 457 | puisi3, 458 | covid, 459 | accuweather, 460 | accuweatherloc, 461 | simi, 462 | gempa, 463 | }; 464 | --------------------------------------------------------------------------------