Ответы пользователя по тегу JavaScript
  • Что делать с парсерами, которые долбят сайт?

    @vshvydky
    ребят вы фигню ему советуете все. я как человек, который порой парсит знаю, нет нормального пути защиты, ну нет и все тут.
    Из рекомендаций:
    1. всякие рекаптча , каптча и тп можете не включать, будете раздражать реальных пользователей, а 5 -10 копеек и бот вашу каптчу, рекаптчу разгадает. Не работает эта защита.
    2. Если вы видите бота, который по всем признакам браузер, возрадуйтесь и покажите ему рекламу. Будете на этом зарабатывать.
    3. Все парсеры привязаны к цсс селекторам и выдергивают данные из них, вы можете строить такие селекторы динамически, максимально их видоизменяя. Возможно это будет напрягать ваших обидчиков.
    4. Вы можете лимитировать отдачу для пользователя Н раз в / минуту / час / 2 часа / сутки , далее составлять блоклист и в бан.
    5. Вы можете пройти по всем бюджетным прокси сайтам, и там где дешево купить себе адреса проксей, получить их списки и сразу их внести в бан. Чаще всего парсят с говнопроксей.
    6. Подкрутить днс бл к адресам.
    7. Проверять не ведут ли клиентские адреса на хостинги датацентров, где впс, вдс стоят. Чаще всего прокси продают именно с диапазонов хостинг провайдеров, а значит их легко вычислить.
    8. Возможно самый полезный инструмент ,введите фингерпринт в токены к своей регистрации / авторизации. В результате даже если используются разные прокси адреса, отпечаток фингерпринта будет совподать. А далее слишком много запросов, 1 и тот же фингерпринт, адреса чередуются, роутятся на хостинги, прямой путь в блек лист.
    9. Боремся с любителями курла: я понимаю, это еще тот геморой, так как почти все шаманства можно разгадать и впулить как пост запрос, но все же, как бы я это делал: токен на минимальную сессию, 10 - 15 минут, в токене фингерпринт, и чтобы получить токен надо сперва пройти ритуал js монитринга в браузере, если этого не случилсь, токен не выдавать. Какие бывают мониторинги, фингерпринт по наложению эффектов на свг изображение, далее съем мд5 отпечатка, сбор информации о установленных шрифтах, сбор данных от навигатора о плагинах и миме типах. проверка соответствия юзерагента поведению браузера. и что еще больше испортит жизнь ботопарсеру, это чтобы ссылки для него менялись каждый раз как и токен. Гемороя много, но думаю после этого вас парсить не захотят.
    Но я за то , чтобы отдать боту то, что он найдет если не у вас, то у вашего конкурента, но вы ему впулите много много рекламы.
    Удачи.
    UPD:
    Подцепляешь сокеты и следишь за пользовательским поведением, изменение курсора мыши, пробег мыши на сайте, скроллинги, клики и тп, если кликается, то в это время позиция курсора внутри элемента или нет?

    есть еще один момент, который может помочь, но я не скажу, я его сам боюсь ))))
    Ответ написан
    Комментировать
  • В каких простых( не сложных) проектах/задачах можно использовать react?

    @vshvydky
    думаю ребята из фб считают что на реакте не сложно вывести instagram
    Ответ написан
    1 комментарий
  • Обясните как это работает в js?

    @vshvydky
    > почему и как работает такая контрукция sum()()()
    Я поясню чуть абстрактно, отойдя в сторону, надеюсь будет понятно.
    функция как собственно и большинство вещей в js это объект.
    Объект может быть передан как переменная и вызван для выполнения.
    Пример передачи объекта (функции )на выполнение это setTimeout(funcName, 100); // функция передается без скобок, а значит сет таймаут получает ее код и через 100 милисекунд его исполнит.
    Такая же ситуация происходит , когда подключаются модули ререз рекваер
    const moduleName = require('moduleFile');
    мы получаем в переменную moduleName ссылку на функцию, то есть теперь moculeName является указалетелем на функцию, которая экспортирована внутри модуля moduleFile, для ее вызова мы добавим () к ссылке, ровно как можно выполнить напрямую require('moduleFile')() или require('moduleFile')(params) в этом случае функция переданная из модуля выполнится, но ссылки на нее не будет, по сути это будет анонимная функция.
    Запустить анонимную функцию можно как
    (function (params){ // действиия }) (realParams) // в такой консрукции будет произведен запуск анонимной функции и в ее params будут переданы параметры запуска reealParams
    Теперь возвращаемся к sum()()()
    Такую запись можно трактовать так:
    sum = function(param){// code ; // return function };
    sum1 = sum(); // Здесь произойдет выполнение функции sum и при возврате значения, будет возвращена функция (как объект) словно вы ее получили из вешнего модуля
    по сути у вас будет создано замыкание которое будет держать в памяти череду функций sum и ссылки на них для доступа к ним (для вызова)
    ну соотвтетсвено sum2 = sum1(); будет делать тоже самое.
    Кратко это можно записать как sum()()() то есть выполнение первой функци, возврат текста второй функции, его выполнение и возврат и и запуск третей функции. Ваш пример в предыдущем вопросе был более верным, сейчас вы зря его упростили. Но посмотрите на ответ hufawoso , он очень качетвенно вам его дополнил. Свяжите это все с моими мыслями и желаю вам скорейшего просветления.
    Ответ написан
    3 комментария
  • Как настроить звонок на телефон при изменении на странице сайта?

    @vshvydky
    ну скорее всего чат сокеты, это все куда-то пишется. Пишешь свой плагин сверху, можно расширение для хрома, который либо слушает, либо читает уже написанное, сравнивает с предыдущим замером, звонит
    Ответ написан
    1 комментарий
  • Как отключить определённый js или его часть на сайте?

    @vshvydky
    document.body.addEventListener( "copy", add_link_to_selection ); по идее можно удалить этот листенер, можно сделать такое расширение в хроме, чтобы киллыл этот эвент
    Ответ написан
    Комментировать
  • Как заставить функции выполняться в определённом порядке и ждать каждую последующую окончания работы предыдущей?

    @vshvydky
    Вермешля в колбеках:
    function f1(data, cb){
       let modify = data *2;
       cb(modify);
    }
    function f2(data, cb){
       let modify = data *2;
       cb(modify);
    }
    function f3(data, cb){
       let modify = data *2;
       cb(modify);
    }
    
    f1(2, function(data) { 
       f2(data, function(data2) {
           f3(data2, function(data3) { 
             console.log(data3); 
             });
          });
       });

    Вариант с промисами:
    function p1(data){
       return new Promise((resolve, reject)=>{
          try{
              resolve(data*2);
           } catch(error){
             reject(error);
          }
      });
    }
    
    function p2(data){
       return new Promise((resolve, reject)=>{
          try{
              resolve(data*2);
           } catch(error){
             reject(error);
          }
      });
    }
    
    function p3(data){
       return new Promise((resolve, reject)=>{
          try{
              resolve(data*2);
           } catch(error){
             reject(error);
          }
      });
    }
    
    p1(2).then(p2).then(p3).then(console.log).catch(console.error);
    // Или
    p1(2).then(data=>{
       p2(data).then(data=>{
          p3(data).then(data=>{
             console.log(data);
          }).catch(console.error);
       }).catch(console.error);
    }).catch(console.error);
    
    // Или если юзать асинк:
    
    (async function(){
       try {
          let r1 = await p1(2);
          let r2 = await p2(r1);
          let r3 = await p3(r2);
          console.log(r3);
       } catch(error){
          throw error;
       }
    })();

    Любой из вариантов по сути одно и тоже. Главное обернуть асинхронные действия, чтобы можно было строить цепочки.
    Ответ написан
    2 комментария
  • Как узнать размер папки node_modules?

    @vshvydky
    Может пришло время обновить нпм чтобы каталог модулей плоско собирался?
    Ответ написан
    1 комментарий
  • Насколько правильная логика работы с моделью?

    @vshvydky
    мне кажется использование классов выглядит как велосипед, создать класс, в конструкторе которого вызвать метод и экспортировать экземпляр класса, который исполнит этот метод, ну не жесть? Чем этот велоананизм лучше банальной функции? В чем здесь преимущество использования классов?
    Ответ написан
    2 комментария
  • Почему не работает async/await?

    @vshvydky
    Чтобы не рос колбек ад, используй конструкцию внутри которой будет весь асинк код.
    async function  request(url) {(
            try {
                await function(){
                    $.ajax({
                        type: 'GET',
                        url: url,
                        success: (data) =>{
                            return data;
                        }
                    })
                };
            } catch (error) {
                console.error(error);
                throw error;
            }
    }
    
    (async ()=>{
       try {
          await ....
          // весь асинк код
          let data = await request('/ru/catalog');
          console.log(data);
           return 1;
    } catch (error) {
          console.error(error);
          throw error;
       }
    })();

    Ретурн и фроу обязательны, потому как по факту ты описываешь промис и после () можешь дальше вермишелить then catch и так далее
    Ответ написан
  • На чем разрабатывать realtime веб-приложения?

    @vshvydky
    есили нода и сокеты страшный сон, то ангуляр реат и метеор будут просто кошмар )
    Ответ написан
    Комментировать
  • Можно ли использовать JS на ЕГЭ?

    @vshvydky
    учитель требует потому что не знает ничего другого. сочувствую. думаю уровень задач егэ чисто алгоритмический, потому глотай и пиши.
    Ответ написан
    Комментировать
  • Как раскодировать строку?

    @vshvydky
    можно так:
    JSON.parse('{"data":"Bj\u00c3\u00b6rn H\u00c3\u00bcttner"}')

    или так:
    console.log("Bj\u00c3\u00b6rn H\u00c3\u00bcttner")
    Ответ написан
  • Как синхронизировать код с асинхронным вызовом ajax?

    @vshvydky
    Владимир, самый верный и надежный путь, изучить javascript. потратьте 2 дня на прочтените learn.javascript.ru и у вас исчезнут такие вопросы. Не сделаете это и на ответах здесь никогда не поймете что почему и как. Единственное, что увидите ключ, как аякс сделать синхронным и будете делать говнокоды....
    А потому рекомендую несложный путь, быстро ознакомиться с документацией по языку. Иначе уровень ваших вопросов не подымется и через пол года...
    Ответ написан
    Комментировать
  • $(selector) Вместо document.getElementById()?

    @vshvydky
    Удачного чтения
    https://api.jquery.com/jQuery/
    Ответ написан
    Комментировать
  • Есть ли расширение для Chrome или другого браузера, который позволяет прочитать содержимое console или способ перехватить XMLHttpRequest?

    @vshvydky
    Вы изобретаете такое велосипедище, что аж страшно представить. Если ваш метод и взлетит, делайте обертки для классов, делайте оттуда вывод инфы. Но это извращение. Фантом вам понравится.
    Ответ написан
    7 комментариев
  • Как сделать ожидание выполнения функции в JavaScript?

    @vshvydky
    Если функция с колбеком надо обернуть ее в промис, чтобы работать с промисами синхронно, нужно либо использовать рекурсивный вызов промисов один за другим, либо в цикле фор но в асинк функции с прерываниями на авайт
    Ответ написан
    Комментировать
  • Почему не работает await fetch?

    @vshvydky
    async function name () {
       try {
                let data = await promiseName();
                retrurn data;
            } 
       catch(error){
            throw error;
            }
    }
    
    name().then(console.log).catch(console.error);
    Ответ написан
    Комментировать