Сбой в сети при выполнении поиска по аутентифицированной конечной точке не всегда (иногда) - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь выполнить очистку веб-страниц для автоматизации поиска данных. Поиск, который мне нужно выполнить, требует, чтобы я вошел в свою учетную запись, для которой у меня есть учетные данные. Я провел небольшое тестирование и смог получить необходимые данные, если вручную назначил свои переменные dev и cookie (cookie - это файл cookie, который я получаю из заголовка запроса инструментов разработчика chrome, когда делаю запрос в браузере).

const dev = 'abcxyz';
const cookie  = '123456'

const searchOptions = {
    url:`https://someendpoint.com/device-detail?serial==${dev}`,
    headers: {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'en-US,en;q=0.9',
        'Content-Type': 'text/html; charset=UTF-8',
        'Connection': 'keep-alive',
        'Cookie': `${cookie}`,
        'Host': 'someendpoint.com',
        'Referer': `https://someendpoint.com/device-detail`,
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    }

}

request(searchOptions, (err, res, body) => {
    const $ = cheerio.load(body);

    const tabletID = $('#mdtDevice');
    console.log(tabletID.text());
})

в моем console.log(tabletID.text()); это распечатывает серийный номер устройства, скопированный с веб-сайта, так что все работает с этим.

Проблема в том, что мне нужно явно получить cookie-файлы и устройства без их ручного ввода, для этого я сделал это

const cheerio = require('cheerio');
const request = require('request');
const parse = require('csv-parse');
const rp = require('request-promise');
const fs = require('fs');

main();

function login(){
    const loginOptions = {
        url: 'https://someendpoint.com/devices.php',
        auth: {
            username: 'xxx',
            password: 'xxx',
        }
    };

    return new Promise((resolve, reject) => {
        request(loginOptions, (err, res, body) => {
            if(!err && res.statusCode === 200){
                resolve(res.headers["set-cookie"].join());
            }else {
                reject(err);
            }
        });
    });
}

async function main(){
   let rawCookie = await login();
   let cookie = rawCookie.slice(0, rawCookie.indexOf(';'));
   const devices = [];
   const path = './tvgs.txt';

    fs.createReadStream(path, 'utf8')
     .pipe(parse())
     .on('data', csvrow => {   
        devices.push(...csvrow);
     })
     .on('end', function() {
         search(devices, cookie);
     });
}

function search(devices, cookie){
    let tablets = [];
    console.log('devices', devices);
    console.log('cookie', cookie);

    for(const device of devices){  
        const searchOptions = {
            url:`https://someendpoint.com/device-detail??serial=${device}`,
            headers: {
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'en-US,en;q=0.9',
                'Content-Type': 'text/html; charset=UTF-8',
                'Connection': 'keep-alive',
                'Cookie': `${cookie}`,
                'Host': 'someendpoint.com',
                'Referer': `https://someendpoint.com`,
                'Upgrade-Insecure-Requests': '1',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
            }

        }

        request(searchOptions, (err, res, body) => {
            if(!err && res.statusCode === 200){
                const $ = cheerio.load(body);
                const tabletID = $('#mdtDevice').text();
                console.log(tabletID);
            }
        });

    }
}

проблема здесь в том, что когда я console.log(tabletID) here I get nothing back. If I console.log ('body') `` html, который я получаю, это разметка страницы входа. Если я использую браузер, то при поиске я получаю только эту страницу входа в систему, если я не вошел в систему.

Мне непонятно, почему, если мой вход в систему был успешным из-за моей функции login(), которую я подтвердил, установив cookie, я не получаю ожидаемые данные при входе в систему программно, но если я жестко закодировал cookie, это работает нормально?

Снова я подумал, что, может быть, cookie не был установлен, но я могу увидеть cookie, если я console.log(cookie) в верхней части моей функции поиска.

Может быть какая-то странность, связанная с тем, что функция search срабатывает до завершения функции login, хотя я получил вызов login с использованием await?

...