wppconnect icon indicating copy to clipboard operation
wppconnect copied to clipboard

Promise que não resolve nunca na sendText()

Open claudioscarpafilho opened this issue 4 years ago • 11 comments

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?

claudioscarpafilho avatar Jul 29 '21 14:07 claudioscarpafilho

Também passo por isso, é o meu principal problema hoje inclusive

igorgazoni avatar Jul 29 '21 20:07 igorgazoni

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

leobevi avatar Jul 29 '21 22:07 leobevi

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.

joaovrgumiero avatar Jul 29 '21 22:07 joaovrgumiero

Tenho ha um bom tempo minha aplicação rodando desta forma e não tenho problemas.

leobevi avatar Jul 29 '21 22:07 leobevi

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.

edgardmessias avatar Jul 31 '21 01:07 edgardmessias

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 */)

tadeubdev avatar Aug 05 '21 15:08 tadeubdev

Dentro do WA-JS já implementei uma solução para isso, onde é possível definir a espera do envio da mensagem

edgardmessias avatar Jan 19 '22 01:01 edgardmessias

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?

igorgazoni avatar Jan 20 '22 14:01 igorgazoni

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});



edgardmessias avatar Jan 20 '22 15:01 edgardmessias

Alguns outros exemplos podem ser encontrados aqui: https://wppconnect-team.github.io/wa-js/interfaces/chat.SendMessageOptions.html

edgardmessias avatar Jan 20 '22 15:01 edgardmessias

Acho que o WA mudou alguma coisa. Retira o + do início do telefone que deve funcionar

guilhermenicolini avatar Mar 25 '22 19:03 guilhermenicolini