wppconnect
wppconnect copied to clipboard
Promise que não resolve nunca na sendText()
Pessoal, queria compartilhar um caso aqui com vocês e entender se isso é um problema ou uma situação esperada.
Eu faço o envio de mensagens usando "const message = await sessao.sendText()". Dai eu pego dentro dessa constante message o messageId. E insiro tudo num banco de dados. O messageId é importante porque é com ele que eu vinculo para depois atualizar os Acks no evento onAck.
Isso funciona muito bem até que o celular perca a conexão. As vezes, mesmo o celular estando conectado dá uns TIMEOUT durante o dia. Quando eu tento enviar uma mensagem com a sessão em TIMEOUT a função sendText() não resolve nem rejeita a promise nunca. Fica uma requisição infinita. Porém, a mensagem foi inserida no WhatsApp Web normal. A mensagem ainda não foi enviada pq o aparelho está desconectado, Mas a mensagem já está lá no WhatsApp Web como o reloginho aguardando conexão para ser enviada.
O problema é que eu não consigo retornar para a aplicação se a mensagem foi ou não enviada e o messageId dessa mensagem. Como parece que a mensagem não foi enviada o pessoal acaba enviando 2 vezes.
Vocês também passam por isso? tem como contornar?
Também passo por isso, é o meu principal problema hoje inclusive
Então neste caso você pode fazer uma validação do status de conexão antes de enviar a mensagem, SE for TIMEOUT ou outro status você não envia a mensagem. Dê uma olhada neste exmplo: https://github.com/wppconnect-team/wppconnect/blob/master/examples/rest/index.js
Então neste caso você pode fazer uma validação do status de conexão antes de enviar a mensagem, SE for TIMEOUT ou outro status você não envia a mensagem. Dê uma olhada neste exmplo: https://github.com/wppconnect-team/wppconnect/blob/master/examples/rest/index.js
Isso não resolve 100%, a conexão pode cair após a verificação, eu mesmo já adicionei essa validação e mesmo assim tenho o problema mencionado no post.
Tenho ha um bom tempo minha aplicação rodando desta forma e não tenho problemas.
Esse é um recurso muito interessante, mas quero implementa-lo na versão 2.0 da api, pois o jeito que está hoje é horrível de se fazer isso.
Passei por isso um tempo atrás, e a forma que resolvi foi a seguinte... Criava um setTimeout pra executar depois de um certo tempo, se uma certa variável tivesse o valor definido ele ignorava, se não, ele disparava um mensagem de erro. Mais ou menos assim... não testei o código, mas a ideia é essa.
function mensagemNaoFoiEnviada() {
clearTimerChecaMensagem();
// faz alguma coisa
}
function clearTimerChecaMensagem() {
clearTimeout(timerChecaMensagem);
timerChecaMensagem = null;
}
let msgEnviada = false;
const timeDisparar = /* tempo pra checar */;
let timerChecaMensagem = setTimeout(() => mensagemNaoFoiEnviada(), timeDisparar);
whatsapp.sendText(mensagem, numero).then(response => {
// foi enviada, apaga o timer
clearTimerChecaMensagem();
// outras tarefas
}).catch(/* error */)
Dentro do WA-JS já implementei uma solução para isso, onde é possível definir a espera do envio da mensagem
Dentro do WA-JS já implementei uma solução para isso, onde é possível definir a espera do envio da mensagem
Edgard, poderia enviar um exemplo de como chamar a função passando esse tempo de espera? As funções sendPtt, sendFile e a função de enviar vcard também possuem essa implementação nova do tempo de espera?
Somente com a LIB você não vai conseguir, mas você pode chamas qualquer função do WA-JS usando o page.evaluate
Documentação do evaluate: https://pptr.dev/#?product=Puppeteer&version=v13.1.1&show=api-pageevaluatepagefunction-args
Exemplo:
const numero = '<number>@c.us';
const text = 'Example message';
const result = await client.page.evaluate(({numero, texto}) =>
WPP.chat.sendTextMessage(numero, texto, {
waitForAck: false
}), {numero, texto});
Alguns outros exemplos podem ser encontrados aqui: https://wppconnect-team.github.io/wa-js/interfaces/chat.SendMessageOptions.html
Acho que o WA mudou alguma coisa. Retira o + do início do telefone que deve funcionar