Skip to content

Instantly share code, notes, and snippets.

@msaulohenrique
Created May 3, 2020 15:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msaulohenrique/bb9c61fa39468354828d926e96e6dc14 to your computer and use it in GitHub Desktop.
Save msaulohenrique/bb9c61fa39468354828d926e96e6dc14 to your computer and use it in GitHub Desktop.
Bot Simples para Whatsapp - Comandos: @ajuda @hORAS @piada.
(() => {
//
// GLOBAL VARS AND CONFIGS
//
var lastMessageOnChat = false;
var ignoreLastMsg = {};
var elementConfig = {
"chats": [0, 0, 5, 2, 0, 3, 0, 0, 0],
"chat_icons": [0, 0, 1, 1, 1, 0],
"chat_title": [0, 0, 1, 0, 0, 0, 0],
"chat_lastmsg": [0, 0, 1, 1, 0, 0],
"chat_active": [0, 0],
"selected_title": [0, 0, 5, 3, 0, 1, 1, 0, 0, 0, 0]
};
const jokeList = [
`
Chegaram 100 mulheres no céu e Deus disse:
- Quem já mexeu no celular do marido escondido chegue mais perto.
Noventa e nove mulheres se aproximaram, só uma ficou.
E Deus disse:
- Traga a surda também!`,
`
Fui almoçar ontem na casa de uma amiga
Quando terminamos de almoçar, ela me disse:
Fiz o almoço, agora a louca é sua.
Peguei a louça, coloquei tudo em um saco plástico e fui embora.
Agora a mulher aqui na frente de casa com a polícia querendo a louça de volta...`,
`
O bêbado atravessa a rua com o farol fechado
e um carro passa e buzina "BIBI"...
O bêbado olha para o carro e diz:
"EU TAMBÉM BIBI E MUITO..."`,
`
O sujeito bate à porta de uma casa e, assim que um homem abre, ele diz:
-O senhor poderia contribuir com o Lar dos Idosos?
-Claro! Espere um pouco, que vou buscar minha sogra!`
]
//
// FUNCTIONS
//
// Get random value between a range
function rand(high, low = 0) {
return Math.floor(Math.random() * (high - low + 1) + low);
}
function getElement(id, parent){
if (!elementConfig[id]){
return false;
}
var elem = !parent ? document.body : parent;
var elementArr = elementConfig[id];
elementArr.forEach(function(pos) {
if (!elem.childNodes[pos]){
return false;
}
elem = elem.childNodes[pos];
});
return elem;
}
function getLastMsg(){
var messages = document.querySelectorAll('.msg');
var pos = messages.length-1;
while (messages[pos] && (messages[pos].classList.contains('msg-system') || messages[pos].querySelector('.message-in'))){
pos--;
if (pos <= -1){
return false;
}
}
if (messages[pos] && messages[pos].querySelector('.selectable-text')){
return messages[pos].querySelector('.selectable-text').innerText.trim();
} else {
return false;
}
}
function getUnreadChats(){
var unreadchats = [];
var chats = getElement("chats");
if (chats){
chats = chats.childNodes;
for (var i in chats){
if (!(chats[i] instanceof Element)){
continue;
}
var icons = getElement("chat_icons", chats[i]).childNodes;
if (!icons){
continue;
}
for (var j in icons){
if (icons[j] instanceof Element){
if (!(icons[j].childNodes[0].getAttribute('data-icon') == 'muted' || icons[j].childNodes[0].getAttribute('data-icon') == 'pinned')){
unreadchats.push(chats[i]);
break;
}
}
}
}
}
return unreadchats;
}
function didYouSendLastMsg(){
var messages = document.querySelectorAll('.msg');
if (messages.length <= 0){
return false;
}
var pos = messages.length-1;
while (messages[pos] && messages[pos].classList.contains('msg-system')){
pos--;
if (pos <= -1){
return -1;
}
}
if (messages[pos].querySelector('.message-out')){
return true;
}
return false;
}
// Call the main function again
const goAgain = (fn, sec) => {
// const chat = document.querySelector('div.chat:not(.unread)')
// selectChat(chat)
setTimeout(fn, sec * 1000)
}
// Dispath an event (of click, por instance)
const eventFire = (el, etype) => {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent(etype, true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
el.dispatchEvent(evt);
}
// Select a chat to show the main box
const selectChat = (chat, cb) => {
const title = getElement("chat_title",chat).title;
eventFire(chat.firstChild.firstChild, 'mousedown');
if (!cb) return;
const loopFewTimes = () => {
setTimeout(() => {
const titleMain = getElement("selected_title").title;
if (titleMain !== undefined && titleMain != title){
console.log('not yet');
return loopFewTimes();
}
return cb();
}, 300);
}
loopFewTimes();
}
// Send a message
const sendMessage = (chat, message, cb) => {
//avoid duplicate sending
var title;
if (chat){
title = getElement("chat_title",chat).title;
} else {
title = getElement("selected_title").title;
}
ignoreLastMsg[title] = message;
messageBox = document.querySelectorAll("[contenteditable='true']")[1];
//add text into input field
messageBox.innerHTML = message.replace(/ /gm,'');
//Force refresh
event = document.createEvent("UIEvents");
event.initUIEvent("input", true, true, window, 1);
messageBox.dispatchEvent(event);
//Click at Send Button
eventFire(document.querySelector('span[data-icon="send"]'), 'click');
cb();
}
//
// MAIN LOGIC
//
const start = (_chats, cnt = 0) => {
// get next unread chat
const chats = _chats || getUnreadChats();
const chat = chats[cnt];
var processLastMsgOnChat = false;
var lastMsg;
if (!lastMessageOnChat){
if (false === (lastMessageOnChat = getLastMsg())){
lastMessageOnChat = true; //to prevent the first "if" to go true everytime
} else {
lastMsg = lastMessageOnChat;
}
} else if (lastMessageOnChat != getLastMsg() && getLastMsg() !== false && !didYouSendLastMsg()){
lastMessageOnChat = lastMsg = getLastMsg();
processLastMsgOnChat = true;
}
if (!processLastMsgOnChat && (chats.length == 0 || !chat)) {
console.log(new Date(), 'nada a fazer agora... (1)', chats.length, chat);
return goAgain(start, 3);
}
// get infos
var title;
if (!processLastMsgOnChat){
title = getElement("chat_title",chat).title + '';
lastMsg = (getElement("chat_lastmsg", chat) || { innerText: '' }).title.replace(/[\u2000-\u206F]/g, ""); //.last-msg returns null when some user is typing a message to me
} else {
title = getElement("selected_title").title;
}
// avoid sending duplicate messaegs
if (ignoreLastMsg[title] && (ignoreLastMsg[title]) == lastMsg) {
console.log(new Date(), 'nada a fazer agora... (2)', title, lastMsg);
return goAgain(() => { start(chats, cnt + 1) }, 0.1);
}
// what to answer back?
let sendText
if (lastMsg.toUpperCase().indexOf('@AJUDA') > -1){
sendText = `
Legal ${title}! Alguns comandos que você pode me enviar:
1. *@HORAS*
2. *@PIADA*`
}
if (lastMsg.toUpperCase().indexOf('@HORAS') > -1){
sendText = `
Você não tem relógio, cara?
*${new Date()}*`
}
if (lastMsg.toUpperCase().indexOf('@NUDES') > -1){
sendText = `TÁ SAFADA EM?!`
}
if (lastMsg.toUpperCase().indexOf('@PIADA') > -1){
sendText = jokeList[rand(jokeList.length - 1)];
}
// that's sad, there's not to send back...
if (!sendText) {
ignoreLastMsg[title] = lastMsg;
console.log(new Date(), 'nova mensagem ignorada -> ', title, lastMsg);
return goAgain(() => { start(chats, cnt + 1) }, 0.1);
}
console.log(new Date(), 'nova mensagem para processar, uhull -> ', title, lastMsg);
// select chat and send message
if (!processLastMsgOnChat){
selectChat(chat, () => {
sendMessage(chat, sendText.trim(), () => {
goAgain(() => { start(chats, cnt + 1) }, 1);
});
})
} else {
sendMessage(null, sendText.trim(), () => {
goAgain(() => { start(chats, cnt + 1) }, 1);
});
}
}
start();
})()
No Chrome aperte F12 e vá em console e cole o código e aperde enter para iniciar.
Peça para alguém lhe enviar o seguinte comando @ajuda.
@Robertofonseca131
Copy link

Olá,
Aqui parou de funcionar. Penso que é algo com a função getUnreadMessage, talves alguma troca de elemento.
Alguma idéia?

@msaulohenrique
Copy link
Author

Olá,
Aqui parou de funcionar. Penso que é algo com a função getUnreadMessage, talves alguma troca de elemento.
Alguma idéia?

O autor é https://github.com/bruno222/whatsapp-web-bot
Fiz apenas uma modificação simples, esse gits era para estar privado, esqueci de pôr.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment