Добрый вечер, я совсем новичек в этом деле, начинаю с самого простого, но уже нужна помощь более опытных)
Помогите пожалуйста мне извлечь данные из сайта при некоторых условиях, а именно:
1 data-server=9792
2 data-side=52
3 data-online=1
если все эти 3 параметра совпадают - тогда нужно цену сохранить в файл, но вообще моя цель это сохранить самую дешевую цену из всех(что попали под 3 мои условия выше) в файл или переменную
 

скрытый текст

Выделить код

Код:

<tr data-href="тутURL" data-server="9792" data-side="52" data-online="1">
        <td>ServerAbc</td>
                  <td>Orki</td>
                          <td><div>
                         <a href="тутURL/users/2323/">ProdavecVasia</a> 
                     <span class="label label-success">online</span>
                  <a href="тутURL">ProdavecVasia</a> <span class="label label-success">online</span></div><div class="text-muted">на сайте год, 333 отзывов</div></td>                <td class="text-right">
          49        </td>
        <td class="text-right" data-s="2">
          <div>9.96 ₽</div>
                  </td>
      </tr>


вот собственно что сделал я
скрытый текст

Выделить код

Код:

var macro;
macro =  "CODE:";
macro +=  "TAG POS=1 TYPE=TR ATTR=data-server:9792&&data-side:52&&data-online:1 EXTRACT=TXT " + "\n";
macro +=  "SAVEAS TYPE=EXTRACT FOLDER=D:\\Macros\\test FILE=+_{{!NOW:yyyymmdd_hhnnss}}" + "\n";
iimPlay(macro)


и получил ответ в виде вот такого csv
скрытый текст

Выделить код

Код:

"
        ServerAbc
                  Orki
                          ProdavecVasia onlineна сайте год, 333 отзывов                
          49        
        
          9.96 ₽
                  
      "


Но мне не нужен весь этот текст, а только цена 9.96 (даже без символа ₽)
Я прекрасно понимаю что достал не самую маленькую цену как мне надо, а просто цену и кучу мусора с TAG POS=1 которые попали под мои 3 критерия, но так как сортировка на сайте у меня стояла от дешевого к дорогому, эта цена получается самая низкая, мне очень любопытно посмотреть как правильно решать мою задачу, может не стоит тащить весь этот мусор? ATTR=data-server:9792&&data-side:52&&data-online:1 EXTRACT=TXT ?? может надо просто проверить его наличие? или же вытащить цену с этим мусором, а потом его как-то отрезать?
Или же обьявить переменные и как-то сверять их с этим  ATTR=data-server:9792&&data-side:52&&data-online ? если все верно то вытаскивать data-s (тоесть цену)
вообщем в моей голове появилось несколько вариантов решения моей же задачи, но вот только инструментов для ее реализации там пока недостаточно(
буду признателен тому кто направит на путь истинный...

Потратьте полчаса на изучение селекторов


и сможете извлекать всё что угодно методами

querySelector и querySelectorAll

Знакомьтесь с методом getAttribute() для извлечения значений атрибутов

Вот ваши параметры по отдельности

скрытый текст

Выделить код

Код:

var node = window.document.querySelector('tr[data-href]');

var data_server = node.getAttribute('data-server');
var data_side = node.getAttribute('data-side');
var data_online = node.getAttribute('data-online');

// Значение цены
var price = node.querySelector('.text-right>div').textContent;

// Смотрим в консоль по ctrl + shift + k

window.console.log(data_server);
window.console.log(data_side);
window.console.log(data_online);
window.console.log(price);

// Значение цены без лишнего символа
window.console.log(price.match(/[0-9.]+/)[0]);


Чтобы фильтровать ненужные символы и извлекать из текста необходимое, изучайте регулярные выражения

скрытый текст
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

спасибо за отклик, вы значительно подвинули меня к конечной цели)
ну я снова остановился на условии else

скрытый текст

Выделить код

Код:

var node = window.document.querySelector('tr[data-href]');
var data_server = node.getAttribute('data-server');
var data_side = node.getAttribute('data-side');
var data_online = node.getAttribute('data-online');
var price = node.querySelector('.text-right>div').textContent;
if(data_server==3194&&data_side==52&&data_online==1){ //проверяю чтобы все совпадало
window.console.log(price.match(/[0-9.]+/)[0]);} //вывожу цену если все ок по моим критериям
else{
тут если не совпадает,  хочу сказать чтобы скрипт проверял дальше, следующий var node, как это правильно писать? что почитать на эту тему?
}

Используйте циклы

скрытый текст
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.


Если у вас все ноды tr[data-href] на одной странице, то собираете их в один массивоподобный объект методом querySelectorAll
Потом перебираете в цикле со своим условием
скрытый текст

Выделить код

Код:

var nodes = window.document.querySelectorAll('tr[data-href]');
for (i=0;i<nodes.length;i++) {
  var node = nodes[i];
  var data_server = node.getAttribute('data-server');
  var data_side = node.getAttribute('data-side');
  var data_online = node.getAttribute('data-online');
  var price = node.querySelector('.text-right>div').textContent;
  if(data_server==3194&&data_side==52&&data_online==1)//проверяю чтобы все совпадало
    window.console.log(price.match(/[0-9.]+/)[0]); //вывожу цену если все ок по моим критериям
}


Примеров работы с циклами на формуме масса.

хотелось бы извлечь лишь самую дешевую цену, а не все, чтобы потом попробовать запилить проверку по нику "не принадлежит ли эта самая дешевая цена - мне" если цена моя, то обновляем страницу и поновой чекаем, ну а если цена не моя, а "ProdavecVasia" то там уже совсем другая история) туда пока еще я не дошел

скрытый текст

Выделить код

Код:

var macro;
macro =  "CODE:";
var nodes = window.document.querySelectorAll('tr[data-href]');
for (i=0;i<nodes.length;i++) {
  var node = nodes[i];
  var data_server = node.getAttribute('data-server');
  var data_side = node.getAttribute('data-side');
  var data_online = node.getAttribute('data-online');
  var name = node.querySelector('a').textContent;
  var m_name = "godmode";
  var price = node.querySelector('.text-right>div').textContent;
         if(data_server==3194&&data_side==52&&data_online==1&&name!=godmode)//проверяю чтобы все совпадало          
        window.console.log(price.match(/[0-9.]+/)[0]);
}


когда хотел сделать проверку по нику, не является ли он моим, на эту строку начало ругаться на
скрытый текст

Выделить код

Код:

if(data_server==3194&&data_side==52&&data_online==1&&name!=godmode)

(ReferenceError: godmode is not defined, line 12 (Error code: -991))

как правильно получить результат = самая низкая цена: как-то отрезать все что после первой строки с помощью регулярных выражений? или это можно как-то в циклах указать? чтобы после первой занесенной успешно (самой дешевой цены) остальное не чекать/сохранять в переменную price

gødmøde

gødmøde пишет

(ReferenceError: godmode is not defined, line 12 (Error code: -991))

вам же русским языком написано, нет такой переменной в вашем скрипте, если вы сверяете значение переменной name с текстом, текст обрамляется кавычками

gødmøde пишет

как правильно получить результат = самая низкая цена

для сравнения значений, извлеките их в массив и отсортируйте:

скрытый текст
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

gødmøde пишет

чтобы после первой занесенной успешно (самой дешевой цены) остальное не чекать/сохранять в переменную price

как вы себе представляете возможность не проверяя все числа (цены) - понять, что эта самая низкая?

про кавычки вы правильно подметили, просто в этом коде, такой ошибки нету даже без кавычек

скрытый текст

Выделить код

Код:

var macro;
macro =  "CODE:";
var node = window.document.querySelector('tr[data-href]');
var data_server = node.getAttribute('data-server');
var data_side = node.getAttribute('data-side');
var data_online = node.getAttribute('data-online');
var name = node.querySelector('a').textContent;
var price = node.querySelector('.text-right>div').textContent;
if(data_server==3194&&data_side==52&&data_online==1&&name!=godmode){
window.console.log(price.match(/[0-9.]+/)[0]);
}


по поводу проверки всех чисел чтобы понять какая из них самая низкая :  дело в том что самое первое занесенное число оно всегда самое низкое, потому что сортировка стоит на сайте от большего к меньшему)

gødmøde пишет

про кавычки вы правильно подметили, просто в этом коде, такой ошибки нету даже без кавычек

значит парсер не добрался до этой строки из-за несовпадения условий ранее

gødmøde пишет

дело в том что самое первое занесенное число оно всегда самое низкое, потому что сортировка стоит на сайте от большего к меньшему)

и в чем проблема тогда извлечь цену из

скрытый текст

Выделить код

Код:

<div>9.96 ₽</div>


например так:
скрытый текст

Выделить код

Код:

/<div>(.*?) ₽<\/div>/

я с js как и с программированием в общем знаком 2 дня
если честно я не совсем понимаю что вы написали, а также не совсем понимаю куда это вставлять)

скрытый текст

Выделить код

Код:

/<div>(.*?) ₽<\/div>/


ну дело в том что  мне не просто нужно получить самую верхнюю цену, а чтобы эта цена соответствовала моим критериям
1 data-server=9792
2 data-side=52
3 data-online=1
ну за подсказку с массивом - спасибо, буду дерзать

исходя из вашего кода думаю что тут правильнее было бы написать name!=m_name

gødmøde пишет

ну дело в том что  мне не просто нужно получить самую верхнюю цену, а чтобы эта цена соответствовала моим критериям

ну так вы ее получаете судя по коду:

скрытый текст

Выделить код

Код:

if(data_server==3194&&data_side==52&&data_online==1&&name!=godmode){
window.console.log(price.match(/[0-9.]+/)[0]);
}


только она у вас выводится в консоль
напишите
скрытый текст

Выделить код

Код:

alert(price.match(/[0-9.]+/)[0]);


вместо window.console.log если не умеете пользоваться консолью
если все верно, то в дальнейшем просто замените
скрытый текст

Выделить код

Код:

window.console.log(price.match(/[0-9.]+/)[0]);


на
скрытый текст

Выделить код

Код:

var small_price = price.match(/[0-9.]+/)[0];


где small_price - переменная с минимальной ценой

16-09-2019 01:23:12
если я правильно понимаю то при срабатывании всех условий в:

скрытый текст

Выделить код

Код:

if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name)


вы получите верную самую низкую цену и вопрос собственно только в выходе из цикла?
если да, то после:
скрытый текст

Выделить код

Код:

window.console.log(price.match(/[0-9.]+/)[0]);


пишите break;

консолью я пользуюсь)
и с таким кодом

скрытый текст

Выделить код

Код:

var nodes = window.document.querySelectorAll('tr[data-href]');
    for (i=0;i<nodes.length;i++) {
var node = nodes[i];
var data_server = node.getAttribute('data-server');
var data_side = node.getAttribute('data-side');
var data_online = node.getAttribute('data-online');
var name = node.querySelector('a').textContent;
var m_name = "godmode";
var price = node.querySelector('.text-right>div').textContent;
  if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name)//проверяю чтобы все совпадало          
    window.console.log(price.match(/[0-9.]+/)[0]);
}


я получаю вот такой вот список цен в консоль
скрытый текст

Выделить код

Код:

10.00 
10.01  
10.33 
10.56
11.11 
11.62

gødmøde пишет

я получаю вот такой вот список цен в консоль

на сколько я понимаю, вам нужно остановить цикл сразу после 1й цены равной в данном случае 10.00
если я прав, то смотрите конец моего предыдущего поста, после "Добавлено Сегодня 01:23:12"

написал break; как вы сказали, теперь консоль пустая совсем

скрытый текст

Выделить код

Код:

var nodes = window.document.querySelectorAll('tr[data-href]');
    for (i=0;i<nodes.length;i++) {
var node = nodes[i];
var data_server = node.getAttribute('data-server');
var data_side = node.getAttribute('data-side');
var data_online = node.getAttribute('data-online');
var name = node.querySelector('a').textContent;
var m_name = "godmode";
var price = node.querySelector('.text-right>div').textContent;
  if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name)//проверяю чтобы все совпадало          
    window.console.log(price.match(/[0-9.]+/)[0]);
    break;
}


мне кажется цикл проверил первый href, там не нашел ничего из того что мне подходит и свернулся break;

gødmøde
фигурные скобки пропущены у вас, для одной команды после if не критично, но для двух и более ...

скрытый текст

Выделить код

Код:

if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name){//проверяю чтобы все совпадало          
    window.console.log(price.match(/[0-9.]+/)[0]);
    break;
};


16-09-2019 01:54:07
синтаксис if(...):
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

вот так заработало, спасибо!

gødmøde пишет

ну дело в том что  мне не просто нужно получить самую верхнюю цену, а чтобы эта цена соответствовала моим критериям
1 data-server=9792
2 data-side=52
3 data-online=1

Вы плохо ознакомились с предложенными мануалами.

Пишете селекторы атрибутов без пробелов, чтобы получить только ноды соответствующие значениям data-server="9792", data-side="52" и data-online="1"

Собираете в массив все цены из полученных нод и находите минималную цену

скрытый текст

Выделить код

Код:

var nodes = window.document.querySelectorAll('[data-server="9792"][data-side="52"][data-online="1"]');
var arr = [];
for (i=0;i<nodes.length;i++) {
  var price = nodes[i].querySelector('.text-right>div').textContent;
  // Собираем в массив "arr" значения преобразованные к числу
  arr.push(+price.match(/[0-9.]+/)[0]);
}
// Отфильтровываем из массива "arr" минимальное число
var min_price = Math.min.apply(Math, arr);

// Смотрим в консоль
window.console.log(arr);
window.console.log(min_price);

дело в том что "я" уже написал вот такой код

скрытый текст

Выделить код

Код:

//чекаю свою цену
var nodes = window.document.querySelectorAll('tr[data-href]');
    for (i=0;i<nodes.length;i++) {
var node = nodes[i];
var data_server = node.getAttribute('data-server');
var data_side = node.getAttribute('data-side');
var data_online = node.getAttribute('data-online');
var name = node.querySelector('a').textContent;
var m_name = "godmode";
var m_price = node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0];
  if(data_server==3194&&data_side==52&&data_online==1&&name==m_name){//проверка сервак, сторона, онлайн, мой ник          
    window.console.log(m_price);
    //alert(m_price);
  break;}
}
//чекаю чужую самую низкую цену
var nodes = window.document.querySelectorAll('tr[data-href]');
    for (i=0;i<nodes.length;i++) {
var node = nodes[i];
var data_server = node.getAttribute('data-server');
var data_side = node.getAttribute('data-side');
var data_online = node.getAttribute('data-online');
var name = node.querySelector('a').textContent;
var m_name = "godmode";
var price = node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0];
  if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name){//проверяю чтобы все совпадало          
    window.console.log(price);
  break;} 
}
//проверяю, если цена другого продавца ниже или = моей цене
if(price <= m_price){
alert(price);
}
//проверяю, если моя цена меньше чем другого продавца
else if(m_price < price){
alert(m_price);    
}


ознакомился с вашим кодом с массивом, он выглядит более логичным, но дело в том что как оказалось мне еще потребуется проверка имени продавца, или идентификация себя по этому имени, для последующего сравнения цены своей, с минимальной ценой остальных
если бы можно было бы вот так сделать начало последнего предложенного вами кода
скрытый текст

Выделить код

Код:

var name = "godmode";
var nodes = window.document.querySelectorAll('[data-server="9792"][data-side="52"][data-online="1"][a!=name]');


но походу это не так работает) что бы убедится что цена не моя
начал я проводить эксперименты над регулярными выражениями, ох и головоломка
хочу в цифре 8.496434 оставить лишь 8.49
скрытый текст

Выделить код

Код:

window.console.log(pricetax.match(/^\d+\.\d{0,2}$/));


но мне говорят pricetax.match is not a function, что тут не хватает/подходит? какой функции? пытался менять регулярку на (/[0-9.]+/)[0] но в этой строке он отказывается ее выводить!

pricetax.match is not a function потому что pricetax у вас это уже число а не строка. Метод match() работает со строками а не числами

скрытый текст

Выделить код

Код:

var pricetax = "8.496434";// Сейчас строка

window.console.log(pricetax.match(/\d+\.\d{2}/)[0]);

// Или преобразуем число в строку с помощью метода String()
var pricetax = 8.496434;// Сейчас число

window.console.log(String(pricetax).match(/\d+\.\d{2}/)[0]);


Читайте о типе данных в JS и о преобразовании типов
скрытый текст
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

gødmøde пишет

проверка имени продавца, или идентификация себя по этому имени

Одним циклом всё это сортируете по условию в объект, а потом сравниваете.

большое спасибо за предыдущую помощь, не могли бы вы мне еще объяснить как определить правильно форму?
я постоянно чтобы что-то написать на js ищу похожие образцы кода в "интернетах", если точного аналога нету, начинаю перебирать разные варианты из "похожего"
может есть какой браузер/плагин чтобы при наведении на элемент в коде он мне писал "Вася искомый тобой заветный value="102.2" относится к (условно) getElementsByName('offers[3230][52][price]');
мне кажется что мои способы решения моих задач, аналогичны с попыткой езды на велосипеде с квадратными колесами

скрытый текст

Выделить код

Код:

<input class="form-control price" name="offers[3230][52][price]" value="102.25" autocomplete="off" type="text">


я уже перечитал все гайды, в поиске подобного образца, ну не укладывается в моей голове, хочется понять логику раз и навсегда, а не брутить разные варианты "авось щас заработает!"
в этот раз я собраллся найти графу value = которая принадлежит offers[3230][52][price] и заполнить ее по своему желанию
скрытый текст

Выделить код

Код:

document.getElementsByName('offers[3230][52][price]').value = 25252;
document.getElementsByClassName("offers[3199][54][price]")[0].value="43434";


ну естественно как и всегда, ничего не произошло)

еще вот так пробовал, не непомогло

скрытый текст

Выделить код

Код:

window.document.getElementsByClassName('input[name=offers[3199][54][price]]').value="TEXT";


потом нашел на форуме инфу что можно через window.document.querySelector
и сделал так
скрытый текст

Выделить код

Код:

window.document.querySelector('input[name=offers[3199][54][price]]').value="TEXT";


но результат прежний(

Не гадайте. Потратьте 30 минут на изучение селекторов

скрытый текст

Выделить код

Код:

window.document.querySelector('.form-control.price').value="Test input";


Ссылки вам уже выше дал и примеров масса.

опять здравствуйте) не могли бы вы мне объяснить как происходит такая магия:

скрытый текст

Выделить код

Код:

var cop = (0.01);// 1 копейка
var cop2 = (0.02);
var verh = (m_price+cop2);// верхний упор (моя цена +2 коп)
var pricetax = (price*tax);
var pricelast = (pricetax-cop);//конечная цена -1 копейка
window.console.log(+pricetax +"-1 копейка = " +pricelast); //проверил как работает отнимание 1 копейки
window.console.log(+m_price +" + " +cop2 +" = " +verh); //проверяю как работает прибавление 2 копеек


две абсолютно аналогичные ситуации, но одна отнимает (правильно), а вторая прибавляет(не совсем правильно)
вот что выдал лог
7.899893999999999-1 копейка = 7.889893999999999
9.14 + 0.02 = 9.140.02
ну я примерно подозреваю что код думает что я пытаюсь сложить квадратное с холодным, но почему отнимание тогда работает как надо??

Выше ссылку давал о типе данных и преобразовании типов. Читайте до понимания.
Прежде чем осуществлять арифметические действия, убедитесь, что значения переменных приведены к правильному типу (number).

Вам уже объяснил аналогичную вашу ошибку


Как об стенку горох… :angry:

да это я понял, я уже исправил это вот так

скрытый текст

Выделить код

Код:

var m_price = Number(node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0]);


но понять почему  с отниманием все в порядке не могу
ведь  я оба значения парсил одинаково, с тем лишь отличием что одна из цен принадлежит мне, а другая кому-то
скрытый текст

Выделить код

Код:

var m_price = (node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0]); //идентифицирую свою цену по собственному нику
  if(data_server==3194&&data_side==52&&name==m_name)
и доставал цену продавца
var price = node.querySelector('.text-right>div').textContent.match(/[0-9.]+/)[0];
  if(data_server==3194&&data_side==52&&data_online==1&&name!=m_name){


но почему в конечном результате могло случится так что у них оказались разные типы?(дико извиняюсь если эти вопросы вам покажутся глупыми!)

И есчо: сегодня я для себя открыл такую новинку как GET запрос,  и очумел когда увидел скорость работы своего скрипта на нём, это быстрее раза в 4 точно.
И собственно хотел у вас поинтересоваться о таком:
мой скрипт парсит цену, как только она не сама "лучшая" он нажимает кнопку "продать" и там там вводит новую актуальную цену, так вот вопрос собственно в чем, можно ли миновать загрузку второй страницы(пусть даже методом гет? зачем она мне?там где формы для цен/количества) ведь мне никакая информация от нее не нужна, мне бы просто отправить свой запрос с новыми ценами "не отходя от кассы" с основной страницы это реально? или это я бред нашифровал себе?

gødmøde пишет

но понять почему  с отниманием все в порядке не могу

вычитанием, ну хоть пишите-то по русски, отнимают деньги в темном переулке

символ "+" это не только сложение чисел, это также конкатенация строк, в случае если с одной стороны строка (а со страницы сайта вы получаете именно строку), а с другой число, при использовании "+" вы получите не сложение, а конкатенацию строк
чтобы этого избежать нужно явно указать, что это не строка, а число

19-09-2019 02:30:22

gødmøde пишет

не бы просто отправить свой запрос с новыми ценами

отправьте, если на стороне сайта нет каких-то ограничений или доп проверок, то скорее всего работать будет, но скорее всего будет не через GET а через POST

подскажите пожалуйста как это примерно должно выглядеть, я примеров не нашел похожих
сейчас код работает так

скрытый текст

Выделить код

Код:

var XMLHttpRequest=Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
var b=XMLHttpRequest();
b.open('GET','https://тутURL/chips/118/trade',false);
b.send('');
var body = b.responseText; 
content.document.querySelector('body').innerHTML = body;
        
        iimPlayCode('WAIT SECONDS=0.1');
        window.document.querySelector('[name="offers[3194][52][price]"]').value=pricelast;
        iimPlayCode('WAIT SECONDS=0.1');
        window.document.querySelector('[type="submit"]').click();


я захотел вручную подсмотреть что происходит в момент нажатия кнопки "сохранить" с введенной новой ценой в форму, что бы иметь представление как это должно выглядеть, и какие данные в каком виде отправляются
на одном из сайтов посоветовали "Chrome -> F12 -> Вкладка Network -> Выбираете нужный файл -> Во вкладке Headers ищите строку Form Data"
скрытый текст
c3db39f77576.jpg

ну я подобного нигде не нашел в браузере хроме/firefox dev'e
а вот скрин всех событий после отправки формы
скрытый текст
d06f6eabf9c2.jpg

В Firefox Ctrl + Shift + E

или F12 -> вкладка "Сеть"

Squatter пишет

В Firefox Ctrl + Shift + E

или F12 -> вкладка "Сеть"

дело в том что я не нашел в своем запросе "trade" данные которые отвечают за изменение цены

Вы вначале запрос найдите, который идёт на сервер при изменении цены.
Хотя бы по фильтру XHR отсортируйте на панели.

после изменения цены прилетел вот этот XHR (который GET прилетел через ~секунду, кторый POST через ~10 )

скрытый текст
b3ab693e85e0.jpg

вот содержание первого
скрытый текст
6c4f730b1468.jpg

Это только заголовки. Содержимое в "Params".

в первом было написано "No parameters for this request"
а второй, который прилетел спустя 15 сек содержал уже такую инфу

скрытый текст

Выделить код

Код:

objects: [{"type":"orders_counters","id":"97115","tag":"5l1wel5t","data":false},{"type":"chat_counter","id":"97115","tag":"pw47f3m8","data":false}]
request: false
csrf_token: l5tl961n7xlrlikj


но что-то меня смущает что второй прилетел через 10-15 сек после полной загрузки страницы, по этому вполне возможно что "это не то" (мои домыслы)

Вы сами должны определить какие данные отправляются при взаимодействии со страницей и найти нужные запросы.
Потом пробуйте имитировать запрос через XMLHttpRequest с необходимыми заголовками и параметрами.
Не видя страницы перед глазами со всеми событиями и подключенными скриптами, помощь вам будет схожа с сеансом телепатии. Тут слишком много "если".

да я уже вроде бы все запросы перебрал, если не трудно посмотрите сами, я вам ПМ написал данные для авторизации
у меня есть подозрения что вот этот запрос мне нужен,

скрытый текст
c5391b95821f.jpg

Но как его поймать за хвост? ведь он существует в консоли всего долю секунды, скрин я этот сделал с видеозаписи

В настройки инструментов разработчика зайдите и включите непрерывные логи "Enable persistent logs"


скрытый текст
Ap0rvSF.png

в общем сервер отказывается принимать искусственно отправленный запрос(я никакие параметры его не менял, просто переотправил ранее отправленный запрос) выдает ошибку 403.  "HTTP 403 Forbidden" указывает, что сервер понял запрос, но отказывается его авторизовать
ответ пришел такой:

скрытый текст

Выделить код

Код:

msg: Необходимо авторизоваться
error: 1


осталось мне только понять почему сервер отправленный запрос православным способом принимает за истинный, а в ручную - за не авторизованный (при абсолютно одинаковых запросах по содержанию) как он их отличает? и как соорудить такой запрос, что бы сервер не сомневался в том что я  авторизованный

Ваприанты:
- Токенизация
- Проверка рефёрера на сервере
- Отправка из средств разработчика не всегда корректно работает

Составляйте запрос вручную через конструктор XMLHttpRequest.

Вот заголовки этого XHR

скрытый текст
9d55a58e688e.jpg

а вот содержание, в разделе "параметры" выглядит вот так:
скрытый текст
8f705f21d539.jpg
и так далее

в разделе "необработанные данные" вот так
скрытый текст

Выделить код

Код:

game=178&chip=118&options%5Bchip_min_sum%5D=100&offers%5B3199%5D%5B54%5D%5Bprice%5D=&offers%5B3199%5D%5B54%5D%5Bamount%5D=&offers%5B3199%5D%5B51%5D%5Bprice%5D=&offers%5B3199%5D%5B51%5D%5Bamount%5D=&offers%5B3199%5D%5B52%5D%5Bprice%5D=&offers%5B3199%5D%5B52%5D%5Bamount%5D=&offers%5B3209%5D%5B51%5D%5Bprice%5D=&offers%5B3209%5D%5B51%5D%5Bamount%5D=&offers%5B3209%5D%5B52%5D%5Bprice%5D=&offers%5B3209%5D%5B52%5D%5Bamount%5D=&offers%5B3230%5D%5B51%5D%5Bprice%5D=&offers%5B3230%5D%5B51%5D%5Bamount%5D=&offers%5B3230%5D%5B52%5D%5Bprice%5D=&offers%5B3230%5D%5B52%5D%5Bamount%5D=&offers%5B3186%5D%5B51%5D%5Bprice%5D=&offers%5B3186%5D%5B51%5D%5Bamount%5D=&offers%5B3186%5D%5B52%5D%5Bprice%5D=&offers%5B3186%5D%5B52%5D%5Bamount%5D=&offers%5B3256%5D%5B51%5D%5Bprice%5D=&offers%5B3256%5D%5B51%5D%5Bamount%5D=&offers%5B3256%5D%5B52%5D%5Bprice%5D=&offers%5B3256%5D%5B52%5D%5Bamount%5D=&offers%5B3278%5D%5B51%5D%5Bprice%5D=&offers%5B3278%5D%5B51%5D%5Bamount%5D=&offers%5B3278%5D%5B52%5D%5Bprice%5D=&offers%5B3278%5D%5B52%5D%5Bamount%5D=&offers%5B3213%5D%5B51%5D%5Bprice%5D=&offers%5B3213%5D%5B51%5D%5Bamount%5D=&offers%5B3213%5D%5B52%5D%5Bprice%5D=&offers%5B3213%5D%5B52%5D%5Bamount%5D=&offers%5B3229%5D%5B51%5D%5Bprice%5D=&offers%5B3229%5D%5B51%5D%5Bamount%5D=&offers%5B3229%5D%5B52%5D%5Bprice%5D=&offers%5B3229%5D%5B52%5D%5Bamount%5D=&offers%5B3279%5D%5B51%5D%5Bprice%5D=&offers%5B3279%5D%5B51%5D%5Bamount%5D=&offers%5B3279%5D%5B52%5D%5Bprice%5D=&offers%5B3279%5D%5B52%5D%5Bamount%5D=&offers%5B3187%5D%5B51%5D%5Bprice%5D=&offers%5B3187%5D%5B51%5D%5Bamount%5D=&offers%5B3187%5D%5B52%5D%5Bprice%5D=&offers%5B3187%5D%5B52%5D%5Bamount%5D=&offers%5B3231%5D%5B51%5D%5Bprice%5D=&offers%5B3231%5D%5B51%5D%5Bamount%5D=&offers%5B3231%5D%5B52%5D%5Bprice%5D=&offers%5B3231%5D%5B52%5D%5Bamount%5D=&offers%5B3200%5D%5B51%5D%5Bprice%5D=&offers%5B3200%5D%5B51%5D%5Bamount%5D=&offers%5B3200%5D%5B52%5D%5Bprice%5D=&offers%5B3200%5D%5B52%5D%5Bamount%5D=&offers%5B3201%5D%5B51%5D%5Bprice%5D=&offers%5B3201%5D%5B51%5D%5Bamount%5D=&offers%5B3201%5D%5B52%5D%5Bprice%5D=&offers%5B3201%5D%5B52%5D%5Bamount%5D=&offers%5B3202%5D%5B51%5D%5Bprice%5D=&offers%5B3202%5D%5B51%5D%5Bamount%5D=&offers%5B3202%5D%5B52%5D%5Bprice%5D=&offers%5B3202%5D%5B52%5D%5Bamount%5D=&offers%5B3188%5D%5B51%5D%5Bprice%5D=&offers%5B3188%5D%5B51%5D%5Bamount%5D=&offers%5B3188%5D%5B52%5D%5Bprice%5D=&offers%5B3188%5D%5B52%5D%5Bamount%5D=&offers%5B3189%5D%5B51%5D%5Bprice%5D=&offers%5B3189%5D%5B51%5D%5Bamount%5D=&offers%5B3189%5D%5B52%5D%5Bprice%5D=&offers%5B3189%5D%5B52%5D%5Bamount%5D=&offers%5B3190%5D%5B51%5D%5Bprice%5D=&offers%5B3190%5D%5B51%5D%5Bamount%5D=&offers%5B3190%5D%5B52%5D%5Bprice%5D=&offers%5B3190%5D%5B52%5D%5Bamount%5D=&offers%5B3257%5D%5B51%5D%5Bprice%5D=&offers%5B3257%5D%5B51%5D%5Bamount%5D=&offers%5B3257%5D%5B52%5D%5Bprice%5D=&offers%5B3257%5D%5B52%5D%5Bamount%5D=&offers%5B3232%5D%5B51%5D%5Bprice%5D=&offers%5B3232%5D%5B51%5D%5Bamount%5D=&offers%5B3232%5D%5B52%5D%5Bprice%5D=&offers%5B3232%5D%5B52%5D%5Bamount%5D=&offers%5B3191%5D%5B51%5D%5Bprice%5D=&offers%5B3191%5D%5B51%5D%5Bamount%5D=&offers%5B3191%5D%5B52%5D%5Bprice%5D=&offers%5B3191%5D%5B52%5D%5Bamount%5D=&offers%5B3192%5D%5B51%5D%5Bprice%5D=&offers%5B3192%5D%5B51%5D%5Bamount%5D=&offers%5B3192%5D%5B52%5D%5Bprice%5D=&offers%5B3192%5D%5B52%5D%5Bamount%5D=&offers%5B3203%5D%5B51%5D%5Bprice%5D=&offers%5B3203%5D%5B51%5D%5Bamount%5D=&offers%5B3203%5D%5B52%5D%5Bprice%5D=&offers%5B3203%5D%5B52%5D%5Bamount%5D=&offers%5B3204%5D%5B51%5D%5Bprice%5D=&offers%5B3204%5D%5B51%5D%5Bamount%5D=&offers%5B3204%5D%5B52%5D%5Bprice%5D=&offers%5B3204%5D%5B52%5D%5Bamount%5D=&offers%5B3210%5D%5B51%5D%5Bprice%5D=&offers%5B3210%5D%5B51%5D%5Bamount%5D=&offers%5B3210%5D%5B52%5D%5Bprice%5D=&offers%5B3210%5D%5B52%5D%5Bamount%5D=&offers%5B3214%5D%5B51%5D%5Bprice%5D=&offers%5B3214%5D%5B51%5D%5Bamount%5D=&offers%5B3214%5D%5B52%5D%5Bprice%5D=&offers%5B3214%5D%5B52%5D%5Bamount%5D=&offers%5B3193%5D%5B51%5D%5Bprice%5D=&offers%5B3193%5D%5B51%5D%5Bamount%5D=&offers%5B3193%5D%5B52%5D%5Bprice%5D=&offers%5B3193%5D%5B52%5D%5Bamount%5D=&offers%5B3206%5D%5B51%5D%5Bprice%5D=&offers%5B3206%5D%5B51%5D%5Bamount%5D=&offers%5B3206%5D%5B52%5D%5Bprice%5D=&offers%5B3206%5D%5B52%5D%5Bamount%5D=&offers%5B3205%5D%5B51%5D%5Bprice%5D=&offers%5B3205%5D%5B51%5D%5Bamount%5D=&offers%5B3205%5D%5B52%5D%5Bprice%5D=&offers%5B3205%5D%5B52%5D%5Bamount%5D=&offers%5B3194%5D%5B51%5D%5Bprice%5D=&offers%5B3194%5D%5B51%5D%5Bamount%5D=&offers%5B3194%5D%5B52%5D%5Bprice%5D=333&offers%5B3194%5D%5B52%5D%5Bamount%5D=22&offers%5B3235%5D%5B51%5D%5Bprice%5D=&offers%5B3235%5D%5B51%5D%5Bamount%5D=&offers%5B3235%5D%5B52%5D%5Bprice%5D=&offers%5B3235%5D%5B52%5D%5Bamount%5D=&offers%5B3211%5D%5B51%5D%5Bprice%5D=&offers%5B3211%5D%5B51%5D%5Bamount%5D=&offers%5B3211%5D%5B52%5D%5Bprice%5D=&offers%5B3211%5D%5B52%5D%5Bamount%5D=&offers%5B3195%5D%5B51%5D%5Bprice%5D=&offers%5B3195%5D%5B51%5D%5Bamount%5D=&offers%5B3195%5D%5B52%5D%5Bprice%5D=&offers%5B3195%5D%5B52%5D%5Bamount%5D=&offers%5B3234%5D%5B51%5D%5Bprice%5D=&offers%5B3234%5D%5B51%5D%5Bamount%5D=&offers%5B3234%5D%5B52%5D%5Bprice%5D=&offers%5B3234%5D%5B52%5D%5Bamount%5D=&offers%5B3233%5D%5B51%5D%5Bprice%5D=&offers%5B3233%5D%5B51%5D%5Bamount%5D=&offers%5B3233%5D%5B52%5D%5Bprice%5D=&offers%5B3233%5D%5B52%5D%5Bamount%5D=&offers%5B3207%5D%5B51%5D%5Bprice%5D=&offers%5B3207%5D%5B51%5D%5Bamount%5D=&offers%5B3207%5D%5B52%5D%5Bprice%5D=&offers%5B3207%5D%5B52%5D%5Bamount%5D=&offers%5B3196%5D%5B51%5D%5Bprice%5D=&offers%5B3196%5D%5B51%5D%5Bamount%5D=&offers%5B3196%5D%5B52%5D%5Bprice%5D=&offers%5B3196%5D%5B52%5D%5Bamount%5D=


вот что я попытался отправить:
скрытый текст

Выделить код

Код:

var http = new XMLHttpRequest();
var url = 'https://тутURL/chips/saveOffers';
var params = 'game=178&chip=118&options%5Bchip_min_sum%5D=100&offers%5B3199%5D%5B54%5D%5Bprice%5D=&offers%5B3199%5D%5B54%5D%5Bamount%5D=&offers%5B3199%5D%5B51%5D%5Bprice%5D=&offers%5B3199%5D%5B51%5D%5Bamount%5D=&offers%5B3199%5D%5B52%5D%5Bprice%5D=&offers%5B3199%5D%5B52%5D%5Bamount%5D=&offers%5B3209%5D%5B51%5D%5Bprice%5D=&offers%5B3209%5D%5B51%5D%5Bamount%5D=&offers%5B3209%5D%5B52%5D%5Bprice%5D=&offers%5B3209%5D%5B52%5D%5Bamount%5D=&offers%5B3230%5D%5B51%5D%5Bprice%5D=&offers%5B3230%5D%5B51%5D%5Bamount%5D=&offers%5B3230%5D%5B52%5D%5Bprice%5D=&offers%5B3230%5D%5B52%5D%5Bamount%5D=&offers%5B3186%5D%5B51%5D%5Bprice%5D=&offers%5B3186%5D%5B51%5D%5Bamount%5D=&offers%5B3186%5D%5B52%5D%5Bprice%5D=&offers%5B3186%5D%5B52%5D%5Bamount%5D=&offers%5B3256%5D%5B51%5D%5Bprice%5D=&offers%5B3256%5D%5B51%5D%5Bamount%5D=&offers%5B3256%5D%5B52%5D%5Bprice%5D=&offers%5B3256%5D%5B52%5D%5Bamount%5D=&offers%5B3278%5D%5B51%5D%5Bprice%5D=&offers%5B3278%5D%5B51%5D%5Bamount%5D=&offers%5B3278%5D%5B52%5D%5Bprice%5D=&offers%5B3278%5D%5B52%5D%5Bamount%5D=&offers%5B3213%5D%5B51%5D%5Bprice%5D=&offers%5B3213%5D%5B51%5D%5Bamount%5D=&offers%5B3213%5D%5B52%5D%5Bprice%5D=&offers%5B3213%5D%5B52%5D%5Bamount%5D=&offers%5B3229%5D%5B51%5D%5Bprice%5D=&offers%5B3229%5D%5B51%5D%5Bamount%5D=&offers%5B3229%5D%5B52%5D%5Bprice%5D=&offers%5B3229%5D%5B52%5D%5Bamount%5D=&offers%5B3279%5D%5B51%5D%5Bprice%5D=&offers%5B3279%5D%5B51%5D%5Bamount%5D=&offers%5B3279%5D%5B52%5D%5Bprice%5D=&offers%5B3279%5D%5B52%5D%5Bamount%5D=&offers%5B3187%5D%5B51%5D%5Bprice%5D=&offers%5B3187%5D%5B51%5D%5Bamount%5D=&offers%5B3187%5D%5B52%5D%5Bprice%5D=&offers%5B3187%5D%5B52%5D%5Bamount%5D=&offers%5B3231%5D%5B51%5D%5Bprice%5D=&offers%5B3231%5D%5B51%5D%5Bamount%5D=&offers%5B3231%5D%5B52%5D%5Bprice%5D=&offers%5B3231%5D%5B52%5D%5Bamount%5D=&offers%5B3200%5D%5B51%5D%5Bprice%5D=&offers%5B3200%5D%5B51%5D%5Bamount%5D=&offers%5B3200%5D%5B52%5D%5Bprice%5D=&offers%5B3200%5D%5B52%5D%5Bamount%5D=&offers%5B3201%5D%5B51%5D%5Bprice%5D=&offers%5B3201%5D%5B51%5D%5Bamount%5D=&offers%5B3201%5D%5B52%5D%5Bprice%5D=&offers%5B3201%5D%5B52%5D%5Bamount%5D=&offers%5B3202%5D%5B51%5D%5Bprice%5D=&offers%5B3202%5D%5B51%5D%5Bamount%5D=&offers%5B3202%5D%5B52%5D%5Bprice%5D=&offers%5B3202%5D%5B52%5D%5Bamount%5D=&offers%5B3188%5D%5B51%5D%5Bprice%5D=&offers%5B3188%5D%5B51%5D%5Bamount%5D=&offers%5B3188%5D%5B52%5D%5Bprice%5D=&offers%5B3188%5D%5B52%5D%5Bamount%5D=&offers%5B3189%5D%5B51%5D%5Bprice%5D=&offers%5B3189%5D%5B51%5D%5Bamount%5D=&offers%5B3189%5D%5B52%5D%5Bprice%5D=&offers%5B3189%5D%5B52%5D%5Bamount%5D=&offers%5B3190%5D%5B51%5D%5Bprice%5D=&offers%5B3190%5D%5B51%5D%5Bamount%5D=&offers%5B3190%5D%5B52%5D%5Bprice%5D=&offers%5B3190%5D%5B52%5D%5Bamount%5D=&offers%5B3257%5D%5B51%5D%5Bprice%5D=&offers%5B3257%5D%5B51%5D%5Bamount%5D=&offers%5B3257%5D%5B52%5D%5Bprice%5D=&offers%5B3257%5D%5B52%5D%5Bamount%5D=&offers%5B3232%5D%5B51%5D%5Bprice%5D=&offers%5B3232%5D%5B51%5D%5Bamount%5D=&offers%5B3232%5D%5B52%5D%5Bprice%5D=&offers%5B3232%5D%5B52%5D%5Bamount%5D=&offers%5B3191%5D%5B51%5D%5Bprice%5D=&offers%5B3191%5D%5B51%5D%5Bamount%5D=&offers%5B3191%5D%5B52%5D%5Bprice%5D=&offers%5B3191%5D%5B52%5D%5Bamount%5D=&offers%5B3192%5D%5B51%5D%5Bprice%5D=&offers%5B3192%5D%5B51%5D%5Bamount%5D=&offers%5B3192%5D%5B52%5D%5Bprice%5D=&offers%5B3192%5D%5B52%5D%5Bamount%5D=&offers%5B3203%5D%5B51%5D%5Bprice%5D=&offers%5B3203%5D%5B51%5D%5Bamount%5D=&offers%5B3203%5D%5B52%5D%5Bprice%5D=&offers%5B3203%5D%5B52%5D%5Bamount%5D=&offers%5B3204%5D%5B51%5D%5Bprice%5D=&offers%5B3204%5D%5B51%5D%5Bamount%5D=&offers%5B3204%5D%5B52%5D%5Bprice%5D=&offers%5B3204%5D%5B52%5D%5Bamount%5D=&offers%5B3210%5D%5B51%5D%5Bprice%5D=&offers%5B3210%5D%5B51%5D%5Bamount%5D=&offers%5B3210%5D%5B52%5D%5Bprice%5D=&offers%5B3210%5D%5B52%5D%5Bamount%5D=&offers%5B3214%5D%5B51%5D%5Bprice%5D=&offers%5B3214%5D%5B51%5D%5Bamount%5D=&offers%5B3214%5D%5B52%5D%5Bprice%5D=&offers%5B3214%5D%5B52%5D%5Bamount%5D=&offers%5B3193%5D%5B51%5D%5Bprice%5D=&offers%5B3193%5D%5B51%5D%5Bamount%5D=&offers%5B3193%5D%5B52%5D%5Bprice%5D=&offers%5B3193%5D%5B52%5D%5Bamount%5D=&offers%5B3206%5D%5B51%5D%5Bprice%5D=&offers%5B3206%5D%5B51%5D%5Bamount%5D=&offers%5B3206%5D%5B52%5D%5Bprice%5D=&offers%5B3206%5D%5B52%5D%5Bamount%5D=&offers%5B3205%5D%5B51%5D%5Bprice%5D=&offers%5B3205%5D%5B51%5D%5Bamount%5D=&offers%5B3205%5D%5B52%5D%5Bprice%5D=&offers%5B3205%5D%5B52%5D%5Bamount%5D=&offers%5B3194%5D%5B51%5D%5Bprice%5D=&offers%5B3194%5D%5B51%5D%5Bamount%5D=&offers%5B3194%5D%5B52%5D%5Bprice%5D=7.694&offers%5B3194%5D%5B52%5D%5Bamount%5D=&offers%5B3235%5D%5B51%5D%5Bprice%5D=&offers%5B3235%5D%5B51%5D%5Bamount%5D=&offers%5B3235%5D%5B52%5D%5Bprice%5D=&offers%5B3235%5D%5B52%5D%5Bamount%5D=&offers%5B3211%5D%5B51%5D%5Bprice%5D=&offers%5B3211%5D%5B51%5D%5Bamount%5D=&offers%5B3211%5D%5B52%5D%5Bprice%5D=&offers%5B3211%5D%5B52%5D%5Bamount%5D=&offers%5B3195%5D%5B51%5D%5Bprice%5D=&offers%5B3195%5D%5B51%5D%5Bamount%5D=&offers%5B3195%5D%5B52%5D%5Bprice%5D=&offers%5B3195%5D%5B52%5D%5Bamount%5D=&offers%5B3234%5D%5B51%5D%5Bprice%5D=&offers%5B3234%5D%5B51%5D%5Bamount%5D=&offers%5B3234%5D%5B52%5D%5Bprice%5D=&offers%5B3234%5D%5B52%5D%5Bamount%5D=&offers%5B3233%5D%5B51%5D%5Bprice%5D=&offers%5B3233%5D%5B51%5D%5Bamount%5D=&offers%5B3233%5D%5B52%5D%5Bprice%5D=&offers%5B3233%5D%5B52%5D%5Bamount%5D=&offers%5B3207%5D%5B51%5D%5Bprice%5D=&offers%5B3207%5D%5B51%5D%5Bamount%5D=&offers%5B3207%5D%5B52%5D%5Bprice%5D=&offers%5B3207%5D%5B52%5D%5Bamount%5D=&offers%5B3196%5D%5B51%5D%5Bprice%5D=&offers%5B3196%5D%5B51%5D%5Bamount%5D=&offers%5B3196%5D%5B52%5D%5Bprice%5D=&offers%5B3196%5D%5B52%5D%5Bamount%5D=';
http.open('POST', url, true);
//Send the proper header information along with the request
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
http.onreadystatechange = function() {
     console.log(this.responseText);
}
http.send(params);


и получил ответ (от браузера) ReferenceError: XMLHttpRequest is not defined, line 3 (Error code: -991)
затем подумал я что что-то не хватает для работы XMLHttpRequest браузеру, но затем вспомнил что я же благополучно им пользуюсь в таком виде
скрытый текст

Выделить код

Код:

var b=XMLHttpRequest();
b.open('GET','https://тутURL/chips/118/trade',false);
b.send('');
var body = b.responseText;


но что ему тогда здесь мешает запуститься ?

Для отладки запроса

скрытый текст

Выделить код

Код:

var http = new window.XMLHttpRequest();


В остальных случаях для работы запросов из макроса объявите вначале кода XMLHttpRequest
скрытый текст

Выделить код

Код:

var XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");

Спасибо, все работает чётко :D
Теперь от нажатия "Воспроизвести" до того момента когда моя цена окажется вне конкуренции - всего 1.22 секунды!
О такой скорости я даже не мечтал, ведь даже если 30 сек уходило это событие, вручную никто бы не тягался, ну мне интересно было довести дело до конца)
Это мой(ну на 25% точно мой) первый рабочий скрипт!Буду интересоваться тематикой JS и далее, если бы не ваша помощь, я бы скорей всего дал заднюю в этом деле.
Дай бог Вам здоровья!(хоть я и атеист, ну неважно!)За то что тратите свое время на помощь другим безвозмездно!
Подскажите напоследок, если реализовывать подобный софт в виде десктопного приложения, то это делается тоже на JS? или это будет в разы сложнее чем на аймакросе и не стоит потраченного времени? как такую тематику правильно гуглить? Что бы копать хотя бы в нужном направлении)

И вам тоже дай бог здоровья (от агностика)! ;)
По поводу десктопа всё можно, есть множество гайдов, в том числе статей на хабре.
По запросу "desktop js" в выдаче гуугла много статей по этой тематике. Сам таким не занимался поскольку с JS мне на данный момент удобнее работать браузерно, где реализовано много технологий и API дающих дополнительный набор возможностей. Опять же иногда помогают готовые расширения для Firefox.

Но в любом случае для начала необходимо ознакомиться с основами javascript

скрытый текст
Основы:
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

И гуглить готовые примеры и рецепты на stackoverflow
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.


Успехов!