UNPKG

wabot

Version:

Whatsapp Bot Module for automate response and interact whit users

207 lines (195 loc) 8.21 kB
const convertBase64 = require('./convertBase64'); const convert64 = new convertBase64(); const request = require('request'); const imagemin = require('imagemin'); const imageminWebp = require('imagemin-webp'); const fs = require('fs'); const path = require('path'); const randomUUI = (a,b) => {for(b=a='';a++<36;b+=a*51&52?(a^15?8^Math.random()*(a^20?16:4):4).toString(16):'');return b} class Sticker { constructor(apiKeys = []){ this.removebgApikeys = apiKeys; this.apiKeyData = []; this.validApiKeys(); let _this = this; /*CADA UNA HORA SE ACTUALIZA LA INFO DE LAS APIKEYS*/ setInterval(function(){ _this.validApiKeys(); }, 60000 * 60); } getInfoAccount(in_apiKey){ return new Promise(function(resolve, reject) { request({ url: 'https://api.remove.bg/v1.0/account', headers: { 'X-Api-Key': in_apiKey }, encoding: null }, function(error, response, body) { if(error){ reject(error); }else if(response.statusCode != 200){ reject(body.toString('utf8')); }else{ let info_ = JSON.parse(body); resolve({'apiKey': in_apiKey, 'info': info_.data.attributes.api}); } }); }) } validApiKeys(){ this.removebgApikeys.forEach(apiKey => { this.getInfoAccount(apiKey) .then(data => { if(this.apiKeyData.length > 0){ let exists_ = false; for(var x=0; x<this.apiKeyData.length; x++){ if(this.apiKeyData[x].apiKey === data.apiKey){ exists_ = true; this.apiKeyData[x].credits = data.info.free_calls } } if(!exists_){ this.apiKeyData.push({'apiKey': data.apiKey, 'credits': data.info.free_calls}); } }else{ this.apiKeyData.push({'apiKey': data.apiKey, 'credits': data.info.free_calls}); } }) }) } getApiValid(){ let apis_ = this.apiKeyData.filter(obj => (obj.credits > 0)); let apiKey = ''; if(apis_.length > 0){ let index = Math.floor(Math.random() * apis_.length); apiKey = apis_[index].apiKey; console.log('Remaining Credits for Api', apis_[index].credits); } return apiKey; } updCreditsKey(in_apiKey){ for(var x=0; x<this.apiKeyData.length; x++){ if(this.apiKeyData[x].apiKey === in_apiKey){ this.apiKeyData[x].credits = this.apiKeyData[x].credits -1; } } } removeBg(in_imageBase64, contIntentos){ let _this = this; return new Promise(function(resolve, reject) { let apiKey = _this.getApiValid(); if(apiKey === ''){ reject({'error': 'There are no apiKey available that contain enough credits'}) }else{ request.post({ url: 'https://api.remove.bg/v1.0/removebg', formData: { image_file_b64: in_imageBase64, size: 'auto' }, headers: { 'X-Api-Key': apiKey }, encoding: null }, async function(error, response, body) { if(error) { /*EN CASO DE QUE NOS HAYAMOS QUEDADOS SIN CREDITOS O SE HAYA INTENTADO MÁS DE 3 VECES SE REPORTA ERROR*/ let err_ = JSON.stringify(error); if(err_.toUpperCase().indexOf('credits') !== -1 || contIntentos >= 3){ reject({"error": error}) }else{ contIntentos++; _this.removeBg(in_url, contIntentos) .then(data => { resolve(data) }) .catch(err => { reject(err) }) } }else{ if(response.statusCode != 200) { reject({"error": body.toString('utf8')}) }else{ _this.updCreditsKey(apiKey); resolve(body); } } }); } }) } makeSticker(_url){ let _this = this; return new Promise((resolve, reject) => { convert64.convert(_url) .then((res) => { let contIntentos = 0; _this.removeBg(res, contIntentos) .then(async (body) => { let _uui = randomUUI(); let nameFile = path.join(__dirname,`./stickers/sticker${_uui}.png`); let nameSticker = path.join(__dirname, `./stickers/sticker${_uui}.webp`); // Create image fs.writeFileSync(nameFile, body); // Convert image to webp await imagemin([`./lib/stickers/sticker${_uui}.png`], { destination: './lib/stickers', plugins: [ imageminWebp({quality: 50, resize: {width:512,height:512}}) ] }); // Delete image fs.unlinkSync(nameFile); // Convert webp to base64 convert64.convert(nameSticker) .then((data) => { // Delete webp fs.unlinkSync(nameSticker); resolve({"file": data.split(';base64,').pop()}) }) .catch((err) => { // Delete webp fs.unlinkSync(nameSticker); reject(err); }); }) .catch(async (err) => { let _uui = randomUUI(); let nameFile = path.join(__dirname, `./stickers/sticker${_uui}.jpeg`); let nameSticker = path.join(__dirname, `./stickers/sticker${_uui}.webp`); // Create image fs.writeFileSync(nameFile, res.split(';base64,').pop(), {encoding: 'base64'}, (err) => { if (err) console.error(err); }) // Convert image to webp await imagemin([`./lib/stickers/sticker${_uui}.jpeg`], { destination: './lib/stickers/', plugins: [ imageminWebp({quality: 50, resize: {width:512,height:512}}) ] }); // Delete image fs.unlinkSync(nameFile); // Convert webp to base64 convert64.convert(nameSticker) .then((data) => { // Delete webp fs.unlinkSync(nameSticker); resolve({"file": data.split(';base64,').pop()}) }) .catch((err) => { // Delete webp fs.unlinkSync(nameSticker); reject(err); }); }); }) .catch(err => { reject(err); }) }); } } module.exports = Sticker;