Я пытаюсь выполнить очистку веб-страниц для автоматизации поиска данных. Поиск, который мне нужно выполнить, требует, чтобы я вошел в свою учетную запись, для которой у меня есть учетные данные. Я провел небольшое тестирование и смог получить необходимые данные, если вручную назначил свои переменные 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
?