node.jsnightmare

How to remember authorization when parsing a site on nodejs cookies


i go to the site and look for an authorization form, if I find it, then I log in, if not, then I do the actions I need

let cookie_ = fs.readFileSync("cookies.json");//I am looking for a file with saved cookies
cookie = JSON.parse(cookie_);//Converting to json

nightmare
.goto('https://site.ru/login')//I go to the site
.cookies.set(cookie)//I substitute cookies from the file
.evaluate(function () {
    return document.querySelector('input[id="email"]');//I am looking for a field to enter mail
})
.then(function (page) {
    if(page) {//I check if there is a field for entering mail
        f().then(function (cookies) {//We get the result from the function
            require('fs').writeFileSync(//And write to file
                'cookies.json',
                JSON.stringify(cookies)
            );
        })

    } else {
        console.log('You are logged in');
    }
})
async function f() {//I call the function if we are not authorized
        return new Promise((resolve, reject) => {
            nightmare
                .goto('https://site.ru/login')
                .type('input[id="email"]', 'login')//Enter mail
                .type('input[id="password"]', 'passord')//Enter your password
                .click('.btn.btn-danger')//Click on the authorization button
                .wait(2000)//We wait 2 seconds
                .cookies.get()//We receive cookies
                .then(resolve)

        });
    }

The file is created, cookies are written, but with the next attempts to run the script, the authorization form still appears

I also tried first to go to - goto('about: blank') then set cookies and then go to goto('https://site.ru/login') Error - UnhandledPromiseRejectionWarning: Error: Setting cookie failed


Solution

  • Unfortunately, it was not possible to solve the problem through nightmare Solved with puppeteer

    Example - saving cookies to file

    const puppeteer = require('puppeteer')
    const fs = require('fs');
    
    (async () => {
      const browser = await puppeteer.launch()
      const page = await browser.newPage()
    
      await page.goto('https://github.com/login')
    
      await page.type('#login_field', process.env.GITHUB_USER)
      await page.type('#password', process.env.GITHUB_PWD)
    
      await page.waitForSelector('.js-cookie-consent-reject')
      await page.click('.js-cookie-consent-reject')
      await page.$eval('[name="commit"]', (elem) => elem.click())
      await page.waitForNavigation()
    
      const cookies = await page.cookies()
      const cookieJson = JSON.stringify(cookies)
    
      fs.writeFileSync('cookies.json', cookieJson)
    
      await browser.close()
    })()
    

    Reading cookies from a file

    const puppeteer = require('puppeteer')
    const fs = require('fs');
    
    (async () => {
      const browser = await puppeteer.launch()
      const page = await browser.newPage()
    
      const cookies = fs.readFileSync('cookies.json', 'utf8')
    
      const deserializedCookies = JSON.parse(cookies)
      await page.setCookie(...deserializedCookies)
    
      await page.goto(`https://github.com/${process.env.GITHUB_USER}`)
    
      await browser.close()
    })()
    

    Article