Node.js 使用Puppeter和express js发送自动whatsapp消息
我正在尝试使用express server中的Puppeter库将whatsapp消息发送给我的联系人之一。要发送信息,我必须通过web.whatsapp.com二维码授权我的whatsapp 使用Puppeter,我试图截取whatsapp web qrcode的屏幕截图,并在我的express服务器中作为HTTP GET请求的响应发送。但是当我尝试扫描qrcode时,我得到了一个错误,如“无法扫描代码。请确保您在whatsapp网站上,然后重试”。以下代码相同Node.js 使用Puppeter和express js发送自动whatsapp消息,node.js,express,puppeteer,qr-code,whatsapp,Node.js,Express,Puppeteer,Qr Code,Whatsapp,我正在尝试使用express server中的Puppeter库将whatsapp消息发送给我的联系人之一。要发送信息,我必须通过web.whatsapp.com二维码授权我的whatsapp 使用Puppeter,我试图截取whatsapp web qrcode的屏幕截图,并在我的express服务器中作为HTTP GET请求的响应发送。但是当我尝试扫描qrcode时,我得到了一个错误,如“无法扫描代码。请确保您在whatsapp网站上,然后重试”。以下代码相同 app.get("/
app.get("/handshake",((req,res,next)=>{
console.log(req.body);
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3641.0 Safari/537.36');
await page.goto(WHATSAPP_LOGIN_URL, {
waitUntil: "networkidle2",
});
await page.setViewport({
width: 1024,
height: 800,
});
const qrElement = await page.$("#app > div > div > div.landing-window > div.landing-main > div > div._3l6Cf > div");
await qrElement.screenshot({path:"./whatsapp.jpg",type:"jpeg"});
await browser.close();
res.sendFile("./whatsapp.jpg",{root:__dirname});
})()
}))
app.get("/handshake",((req,res,next)=>{
console.log(req.body);
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3641.0 Safari/537.36');
await page.goto(WHATSAPP_LOGIN_URL, {
waitUntil: "networkidle2",
});
await page.setViewport({
width: 1024,
height: 800,
});
const dataref = await page.evaluate(()=>{
return document.getElementsByClassName('_1yHR2')[0].dataset.ref;
})
console.log(dataref);
const qrElement = await page.$("#app > div > div > div.landing-window > div.landing-main > div > div._3l6Cf > div");
await qrElement.screenshot({path:"./whatsapp.jpg",type:"jpeg"});
await browser.close();
res.send(QRCode.toString(dataref,{type:"png"},function(err,url){
console.log(url)
}))
})()
}))
作为一种解决方法,使用Puppeter,我能够访问包含二维码div的div,在该div中,我获取数据ref属性的值,并使用qrcode npm模块将该值转换为二维码,我将该模块作为对express server中我的GET HTTP req的响应发送。如果我尝试扫描二维码,whatsapp会显示相同的错误“无法扫描二维码。请确保您是whatsapp网站,然后重试。”。下面是我的相同代码
app.get("/handshake",((req,res,next)=>{
console.log(req.body);
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3641.0 Safari/537.36');
await page.goto(WHATSAPP_LOGIN_URL, {
waitUntil: "networkidle2",
});
await page.setViewport({
width: 1024,
height: 800,
});
const qrElement = await page.$("#app > div > div > div.landing-window > div.landing-main > div > div._3l6Cf > div");
await qrElement.screenshot({path:"./whatsapp.jpg",type:"jpeg"});
await browser.close();
res.sendFile("./whatsapp.jpg",{root:__dirname});
})()
}))
app.get("/handshake",((req,res,next)=>{
console.log(req.body);
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3641.0 Safari/537.36');
await page.goto(WHATSAPP_LOGIN_URL, {
waitUntil: "networkidle2",
});
await page.setViewport({
width: 1024,
height: 800,
});
const dataref = await page.evaluate(()=>{
return document.getElementsByClassName('_1yHR2')[0].dataset.ref;
})
console.log(dataref);
const qrElement = await page.$("#app > div > div > div.landing-window > div.landing-main > div > div._3l6Cf > div");
await qrElement.screenshot({path:"./whatsapp.jpg",type:"jpeg"});
await browser.close();
res.send(QRCode.toString(dataref,{type:"png"},function(err,url){
console.log(url)
}))
})()
}))
以上两种方法都不起作用。但是,当我使用chrome inspect元素手动获取数据ref attr的值,然后粘贴并生成值作为qrcode,并使用移动whatsapp qr扫描仪进行扫描时,whatsapp能够无任何错误地授权我。这怎么可能?我正试图用邮递员做同样的事情
让我知道我错过了什么
尝试查看开源项目(或者实际上您可以使用它,而不是重新创建所有内容)