NodeJS Cookie

back.DEV

Известный
Автор темы
71
6
На сайте сервера arizona-rp.com есть вот такая тема
EOajpJm.png

Так вот я делаю запрос к сайту для получения вот этого куки

HTML:
<script language="javascript">document.cookie="R3ACTLB=eebdbfd51ddb46a72b4326036ed39945 ; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";setTimeout("location.href='https://arizona-rp.com:443/mon/fraction/8/1';",5000);</script>

Получаю я его вот таким образом:
JavaScript:
let cookie; // хранение куки

getOnline()
async function getOnline() {

     await needle.get('https://arizona-rp.com', function(err, response) {

         try {
             cookie = response.body.split("R3ACTLB=")[1].split(" ;")[0];
             console.log(cookie);
         } catch (err) {
             console.log(err);
         }
     });
    
/* потом я делаю запрос опять к этому сайту и уже с использованием этого куки для получения инфы с сайта*/
    
// Делаю я это таким образом:
    

    await needle.get('https://arizona-rp.com/mon/fraction/8/1', function(err, response) {
             try {
                 console.log(response.body);
             } catch (err) {
                 console.log(err);
             }
         });
    
});

Каким образом я во втором запросе могу заюзать этот куки, чтобы мне response.body выводился именно уже с сайта, а не с инфой которая на скрине под спойлером.
Юзаю библиотеку needle.
 

back.DEV

Известный
Автор темы
71
6
я конечно нихуя не жсер но разве ты не должен в заголовках передать куку а не просто спарсить и засейвить ее в переменную?
я в прошлой библиотеке requestify делал именно так как сейчас и передавал как-то через header и всё работало, но она тупит, эта библиотека более стабильно работает, вот и думаю как это реализовать с этой библиотекой
В прошлой библиотеке вот так передавал:
JavaScript:
requestify.get('https://arizona-rp.com', {cookies: {R3ACTLB: cookie}}).then(function(response)) // и т.д и т.п

В этой я так понял по другому все работает.
 

Azller Lollison

я узбек
Друг
1,342
2,266
я в прошлой библиотеке requestify делал именно так как сейчас и передавал как-то через header и всё работало, но она тупит, эта библиотека более стабильно работает, вот и думаю как это реализовать с этой библиотекой
передай в массиве вторым аргументом ее

JavaScript:
var options = {
  compressed : true,
  follow     : 10,
  accept     : 'application/vnd.github.full+json'
}

needle.get('api.github.com/users/tomas', options, function(err, resp, body) {
  // body will contain a JSON.parse(d) object
  // if parsing fails, you'll simply get the original body
});

пример с гита либы https://github.com/tomas/needle#custom-accept-header-deflate
 

back.DEV

Известный
Автор темы
71
6
Если я правильно понял то всеравно возвращает ту же страницу первую.

JavaScript:
getOnline()
async function getOnline() {

    await needle.get('https://arizona-rp.com', function(err, response) {

        try {
            cookie = response.body.split("R3ACTLB=")[1].split(" ;")[0];
            console.log(cookie);
        } catch (err) {
            console.log(err);
        }
    });

    const options = {
        compressed: true,
        follow: 10,
        accept: cookie
    }

        await needle.get('https://arizona-rp.com/mon/fraction/8/1', options, function(err, response) {
            try {
                console.log(response.body);
            } catch (err) {
                console.log(err);
            }
        });

}


Вывело мне с первой функции в консольку вот это куки которое оно взяло со страницы и во второй функции вывело уже всю эту страницу которая на скрине выше была.
 

Azller Lollison

я узбек
Друг
1,342
2,266

Livarka

Известный
156
65
решил проблему, немного посмотрел
Решение:
const options = {
compressed: true,
follow: 10,
cookies: {R3ACTLB: cookie}
}
вот тебе сурс защиты самого стабильного хостинга
 
  • Нравится
Реакции: back.DEV

Philipp Zelinski

Новичок
5
2
Предлагаю использовать axios:
Получение необходимого куки:
const { get } = require('axios');

async function getCookie(url) {
  // Запрашиваем HTML у сайта
  const res = await get(url);
  const isSuccess = res && res.status === 200 && res.data;
  if (!isSuccess) throw new Error('Неудачный запрос');

  // Проверяем наличие необходимого куки в странице
  if (!res.data.includes('R3ACTLB')) return null;
  const foundCookie = res.data.split('R3ACTLB=')[1].split(' ;')[0];
  if (!foundCookie) throw new Error('Ошибка при поиске куки на странице');

  return foundCookie;
}

Для получения онлайна можно использовать функцию из моей библиотеки:
Получение онлайна:
const { getFractionPlayers } = require('@nieopierzony/core');

// Получение списка игроков во фракции
(async () => {
  const serverID = 8;
  const fractionID = 1;

  // Использую URL форума, т.к. на основном сайте эту систему отключили
  const players = await getFractionPlayers(serverID, fractionID, {
    headers: {
      Cookie: `R3ACTLB=${await getCookie('http://forum.arizona-rp.com')}`,
    },
  });

  console.log(players);
  // => [
  //      { id: '1', nickname: 'Skezy_Sparta', rank: 1, online: false },
  //      { id: '2', nickname: 'Langris_Lout', rank: 3, online: true },
  //      ... 24 more items
  //    ];
})();

На основном сайте аризоны уже убрали ту систему и для входа на сайт, куки не требуется, но все же.
 
Последнее редактирование:
  • Нравится
Реакции: back.DEV