whatsapp-web.js: Getting stuck at LOADING SCREEN 100 WhatsApp and not getting "Authenticated" or "ready" message
Is there an existing issue for this?
- I have searched the existing issues
Describe the bug
The code was working from years. I had been using it from years. I even checked it few weeks back and it was working as it was supposed to but suddenly the code is stucked at
LOADING SCREEN 100 WhatsApp
it is not showing any authentication or ready status. It stucks there. in both headless true and false method. It shows that whatsapp web is loading properly but for some reason client is not getting ready.
Expected behavior
As a user i was expecting “ready” status but it is stuck on LOADING SCREEN 100 WhatsApp
Steps to Reproduce the Bug or Issue
Just loading it and you will see it. I had tried everything
Relevant Code
const { Client, Location, List, Buttons, LocalAuth } = require(‘whatsapp-web.js’); const express = require(“express”); const mainRouter = express.Router(); const apiRouter = express.Router(); const apitextRouter = express.Router(); const app = express(); const qrcode = require(‘qrcode-terminal’); const cors = require(‘cors’); const port = process.env.PORT || “9000”; const https = require(‘https’);
const client = new Client({ authStrategy: new LocalAuth(), // proxyAuthentication: { username: ‘username’, password: ‘password’ }, puppeteer: { // args: [‘–proxy-server=proxy-server-that-requires-authentication.example.com’], headless: false } });
client.initialize();
client.on(‘loading_screen’, (percent, message) => { console.log(‘LOADING SCREEN’, percent, message); });
client.on(‘qr’, (qr) => { // NOTE: This event will not be fired if a session is specified. console.log(‘QR RECEIVED’, qr); });
client.on(‘authenticated’, () => { console.log(‘AUTHENTICATED’); });
client.on(‘auth_failure’, msg => { // Fired if session restore was unsuccessful console.error(‘AUTHENTICATION FAILURE’, msg); });
client.on(‘ready’, () => { console.log(‘READY’); });
client.on(‘message’, async msg => { console.log(‘MESSAGE RECEIVED’, msg);
if (msg.body === '!ping reply') {
// Send a new message as a reply to the current one
msg.reply('pong');
} else if (msg.body === '!ping') {
// Send a new message to the same chat
client.sendMessage(msg.from, 'pong');
} else if (msg.body.startsWith('!sendto ')) {
// Direct send a new message to specific id
let number = msg.body.split(' ')[1];
let messageIndex = msg.body.indexOf(number) + number.length;
let message = msg.body.slice(messageIndex, msg.body.length);
number = number.includes('@c.us') ? number : `${number}@c.us`;
let chat = await msg.getChat();
chat.sendSeen();
client.sendMessage(number, message);
} else if (msg.body.startsWith('!subject ')) {
// Change the group subject
let chat = await msg.getChat();
if (chat.isGroup) {
let newSubject = msg.body.slice(9);
chat.setSubject(newSubject);
} else {
msg.reply('This command can only be used in a group!');
}
} else if (msg.body.startsWith('!echo ')) {
// Replies with the same message
msg.reply(msg.body.slice(6));
} else if (msg.body.startsWith('!desc ')) {
// Change the group description
let chat = await msg.getChat();
if (chat.isGroup) {
let newDescription = msg.body.slice(6);
chat.setDescription(newDescription);
} else {
msg.reply('This command can only be used in a group!');
}
} else if (msg.body === '!leave') {
// Leave the group
let chat = await msg.getChat();
if (chat.isGroup) {
chat.leave();
} else {
msg.reply('This command can only be used in a group!');
}
} else if (msg.body.startsWith('!join ')) {
const inviteCode = msg.body.split(' ')[1];
try {
await client.acceptInvite(inviteCode);
msg.reply('Joined the group!');
} catch (e) {
msg.reply('That invite code seems to be invalid.');
}
} else if (msg.body === '!groupinfo') {
let chat = await msg.getChat();
if (chat.isGroup) {
msg.reply(`
*Group Details*
Name: ${chat.name}
Description: ${chat.description}
Created At: ${chat.createdAt.toString()}
Created By: ${chat.owner.user}
Participant count: ${chat.participants.length}
`);
} else {
msg.reply('This command can only be used in a group!');
}
} else if (msg.body === '!chats') {
const chats = await client.getChats();
client.sendMessage(msg.from, `The bot has ${chats.length} chats open.`);
} else if (msg.body === '!info') {
let info = client.info;
client.sendMessage(msg.from, `
*Connection info*
User name: ${info.pushname}
My number: ${info.wid.user}
Platform: ${info.platform}
`);
} else if (msg.body === '!mediainfo' && msg.hasMedia) {
const attachmentData = await msg.downloadMedia();
msg.reply(`
*Media info*
MimeType: ${attachmentData.mimetype}
Filename: ${attachmentData.filename}
Data (length): ${attachmentData.data.length}
`);
} else if (msg.body === '!quoteinfo' && msg.hasQuotedMsg) {
const quotedMsg = await msg.getQuotedMessage();
quotedMsg.reply(`
ID: ${quotedMsg.id._serialized}
Type: ${quotedMsg.type}
Author: ${quotedMsg.author || quotedMsg.from}
Timestamp: ${quotedMsg.timestamp}
Has Media? ${quotedMsg.hasMedia}
`);
} else if (msg.body === '!resendmedia' && msg.hasQuotedMsg) {
const quotedMsg = await msg.getQuotedMessage();
if (quotedMsg.hasMedia) {
const attachmentData = await quotedMsg.downloadMedia();
client.sendMessage(msg.from, attachmentData, { caption: 'Here\'s your requested media.' });
}
if (quotedMsg.hasMedia && quotedMsg.type === 'audio') {
const audio = await quotedMsg.downloadMedia();
await client.sendMessage(msg.from, audio, { sendAudioAsVoice: true });
}
} else if (msg.body === '!isviewonce' && msg.hasQuotedMsg) {
const quotedMsg = await msg.getQuotedMessage();
if (quotedMsg.hasMedia) {
const media = await quotedMsg.downloadMedia();
await client.sendMessage(msg.from, media, { isViewOnce: true });
}
} else if (msg.body === '!location') {
msg.reply(new Location(37.422, -122.084, 'Googleplex\nGoogle Headquarters'));
} else if (msg.location) {
msg.reply(msg.location);
} else if (msg.body.startsWith('!status ')) {
const newStatus = msg.body.split(' ')[1];
await client.setStatus(newStatus);
msg.reply(`Status was updated to *${newStatus}*`);
} else if (msg.body === '!mention') {
const contact = await msg.getContact();
const chat = await msg.getChat();
chat.sendMessage(`Hi @${contact.number}!`, {
mentions: [contact]
});
} else if (msg.body === '!delete') {
if (msg.hasQuotedMsg) {
const quotedMsg = await msg.getQuotedMessage();
if (quotedMsg.fromMe) {
quotedMsg.delete(true);
} else {
msg.reply('I can only delete my own messages');
}
}
} else if (msg.body === '!pin') {
const chat = await msg.getChat();
await chat.pin();
} else if (msg.body === '!archive') {
const chat = await msg.getChat();
await chat.archive();
} else if (msg.body === '!mute') {
const chat = await msg.getChat();
// mute the chat for 20 seconds
const unmuteDate = new Date();
unmuteDate.setSeconds(unmuteDate.getSeconds() + 20);
await chat.mute(unmuteDate);
} else if (msg.body === '!typing') {
const chat = await msg.getChat();
// simulates typing in the chat
chat.sendStateTyping();
} else if (msg.body === '!recording') {
const chat = await msg.getChat();
// simulates recording audio in the chat
chat.sendStateRecording();
} else if (msg.body === '!clearstate') {
const chat = await msg.getChat();
// stops typing or recording in the chat
chat.clearState();
} else if (msg.body === '!jumpto') {
if (msg.hasQuotedMsg) {
const quotedMsg = await msg.getQuotedMessage();
client.interface.openChatWindowAt(quotedMsg.id._serialized);
}
} else if (msg.body === '!buttons') {
let button = new Buttons('Button body', [{ body: 'bt1' }, { body: 'bt2' }, { body: 'bt3' }], 'title', 'footer');
client.sendMessage(msg.from, button);
} else if (msg.body === '!list') {
let sections = [{ title: 'sectionTitle', rows: [{ title: 'ListItem1', description: 'desc' }, { title: 'ListItem2' }] }];
let list = new List('List body', 'btnText', sections, 'Title', 'footer');
client.sendMessage(msg.from, list);
} else if (msg.body === '!reaction') {
msg.react('👍');
} else if (msg.body === '!edit') {
if (msg.hasQuotedMsg) {
const quotedMsg = await msg.getQuotedMessage();
if (quotedMsg.fromMe) {
quotedMsg.edit(msg.body.replace('!edit', ''));
} else {
msg.reply('I can only edit my own messages');
}
}
} else if (msg.body === '!updatelabels') {
const chat = await msg.getChat();
await chat.changeLabels([0, 1]);
} else if (msg.body === '!addlabels') {
const chat = await msg.getChat();
let labels = (await chat.getLabels()).map(l => l.id);
labels.push('0');
labels.push('1');
await chat.changeLabels(labels);
} else if (msg.body === '!removelabels') {
const chat = await msg.getChat();
await chat.changeLabels([]);
}
});
client.on(‘message_create’, (msg) => { // Fired on all message creations, including your own if (msg.fromMe) { // do stuff here } });
client.on(‘message_revoke_everyone’, async (after, before) => { // Fired whenever a message is deleted by anyone (including you) console.log(after); // message after it was deleted. if (before) { console.log(before); // message before it was deleted. } });
client.on(‘message_revoke_me’, async (msg) => { // Fired whenever a message is only deleted in your own view. console.log(msg.body); // message before it was deleted. });
client.on(‘message_ack’, (msg, ack) => { /* == ACK VALUES == ACK_ERROR: -1 ACK_PENDING: 0 ACK_SERVER: 1 ACK_DEVICE: 2 ACK_READ: 3 ACK_PLAYED: 4 */
if (ack == 3) {
// The message was read
}
});
client.on(‘group_join’, (notification) => { // User has joined or been added to the group. console.log(‘join’, notification); notification.reply(‘User joined.’); });
client.on(‘group_leave’, (notification) => { // User has left or been kicked from the group. console.log(‘leave’, notification); notification.reply(‘User left.’); });
client.on(‘group_update’, (notification) => { // Group picture, subject or description has been updated. console.log(‘update’, notification); });
client.on(‘change_state’, state => { console.log(‘CHANGE STATE’, state); });
// Change to false if you don’t want to reject incoming calls let rejectCalls = true;
client.on(‘call’, async (call) => {
console.log(‘Call received, rejecting. GOTO Line 261 to disable’, call);
if (rejectCalls) await call.reject();
await client.sendMessage(call.from, [${call.fromMe ? 'Outgoing' : 'Incoming'}] Phone call from ${call.from}, type ${call.isGroup ? 'group' : ''} ${call.isVideo ? 'video' : 'audio'} call. ${rejectCalls ? 'This call was automatically rejected by the script.' : ''});
});
client.on(‘disconnected’, (reason) => { console.log(‘Client was logged out’, reason); });
client.on(‘contact_changed’, async (message, oldId, newId, isContact) => { /** The time the event occurred. */ const eventTime = (new Date(message.timestamp * 1000)).toLocaleString();
console.log(
`The contact ${oldId.slice(0, -5)}` +
`${!isContact ? ' that participates in group ' +
`${(await client.getChatById(message.to ?? message.from)).name} ` : ' '}` +
`changed their phone number\nat ${eventTime}.\n` +
`Their new phone number is ${newId.slice(0, -5)}.\n`);
/**
* Information about the @param {message}:
*
* 1. If a notification was emitted due to a group participant changing their phone number:
* @param {message.author} is a participant's id before the change.
* @param {message.recipients[0]} is a participant's id after the change (a new one).
*
* 1.1 If the contact who changed their number WAS in the current user's contact list at the time of the change:
* @param {message.to} is a group chat id the event was emitted in.
* @param {message.from} is a current user's id that got an notification message in the group.
* Also the @param {message.fromMe} is TRUE.
*
* 1.2 Otherwise:
* @param {message.from} is a group chat id the event was emitted in.
* @param {message.to} is @type {undefined}.
* Also @param {message.fromMe} is FALSE.
*
* 2. If a notification was emitted due to a contact changing their phone number:
* @param {message.templateParams} is an array of two user's ids:
* the old (before the change) and a new one, stored in alphabetical order.
* @param {message.from} is a current user's id that has a chat with a user,
* whos phone number was changed.
* @param {message.to} is a user's id (after the change), the current user has a chat with.
*/
});
client.on(‘group_admin_changed’, (notification) => {
if (notification.type === ‘promote’) {
/**
* Emitted when a current user is promoted to an admin.
* {@link notification.author} is a user who performs the action of promoting/demoting the current user.
/
console.log(You were promoted by ${notification.author});
} else if (notification.type === ‘demote’)
/* Emitted when a current user is demoted to a regular user. */
console.log(You were demoted by ${notification.author});
});
Browser Type
Chromium
WhatsApp Account Type
WhatsApp Business
Does your WhatsApp account have multidevice enabled?
Yes, I am using Multi Device
Environment
Windows 10 latest version of everything
Additional context
No response
About this issue
- Original URL
- State: closed
- Created 10 months ago
- Reactions: 1
- Comments: 22
Or the pre-release: https://github.com/pedroslopez/whatsapp-web.js/releases/tag/v1.22.2-alpha.0
sorry but not work for me, i cannot get authenticated, and events are not working anymore…i can’t see the console.log for “client ready”
Try to use this commit: https://github.com/pedroslopez/whatsapp-web.js/commit/abac063b779570729476cf42e29dc694e5345ca6
This was fixed my issue
npm r whatsapp-web.js
set this version in package.json “whatsapp-web.js”: “https://github.com/Julzk/whatsapp-web.js/tarball/jkr_hotfix_7”
npm install
Same
For me, this alternative worked
still not fixed
@dudagervasio Thx, bro. Up and running again
The same thing happens to me, but I do not understand what happens, I run the docker image on my pc and it works fine, but when I pass it to the server with ubuntu it stays in LOAD SCREEN 100. I find it strange because it is a docker, it should work xd
I don’t know, but I’m starting to think it might be a hardware limitation, maybe(?
Yes i`m also