• Что делать с парсерами, которые долбят сайт?

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

    есть еще один момент, который может помочь, но я не скажу, я его сам боюсь ))))
    Ответ написан
    Комментировать
  • В чем разница в доступе у годовых/разовых тарифов налоговой службы к ЕГРЮЛ и ЕГРИП?

    @vshvydky
    на сколько я помню у них есть контактный телефон.
    можно позвонить и проконсультироваться.
    но вроде за 50 тыс вы получаете базу , доплачивая 5 тыс ловите апдейты к ней. Позвоните да уточните.
    А 150к за рабочее место я вообще не понимаю, там есть аналогичный сервис бесплатно (требует каптчу) egrul.anlog.ru , но выписки не подписаны электронно. и ест ьсервис через регистрацию, где теже выписки генерятся с эцп.
    Ответ написан
    Комментировать
  • В каких простых( не сложных) проектах/задачах можно использовать react?

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

    @vshvydky
    я не уверен, что будет лучше
    посмотрите в сторону
    SELECT DISTINCT id, COUNT(id) 
    FROM payment
    WHERE 
       created_at  BETWEEN DATE_SUB(CURDATE(), INTERVAL 10 DAY) 
    AND 
       CURDATE() AND id NOT IN 
    (SELECT DISTINCT id FROM payment WHERE  created_at < DATE_SUB(CURDATE(), INTERVAL 10 DAY) )
    GROUP BY ID

    Можно попробовать нечто подобное. Возможно написанный код содержит ошибки, написан без синтаксиса, таблицы и тестирования.
    Ответ написан
    1 комментарий
  • MySQL может только один индекс для запроса?

    @vshvydky
    если вопрос в скорости, то не обязательно зацикливаться на составных индексах. Составной индекс очень полезен там где идет (true, key2342342342342342) индекс true/false малополезен как отдельный индекс. А в случае джойнов, все иды в таблицах должны быть индексированы. Далее запускаешь EXPLAIN SELECT и смотришь где проседает.
    Ответ написан
    Комментировать
  • Почему Node.js дохнет без сообщений?

    @vshvydky
    Вылет без ошибки происходит там где в асинхронном режиме ошибки не ловятся, рекомендацию по try catch видимо не соблюдаете

    Так как автор не верит, вот код:
    const test = ()=>{
        return new Promise((resolve, reject) =>{
            new_error();
            resolve(true);
        });
    };
    
    
    test();

    , вот вывод на ноде 4.4
    >node test2.js

    >
    Чисто и без ошибок.
    И это не единственный случай, когда ошибка будет съедена. И да в эру 7.8 использовать 4.4 моветон.
    Кстати 7 нода уже даст варнинг:

    (node:13428) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): true
    (node:13428) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zer
    o exit code.
    Ответ написан
  • Обясните как это работает в 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 комментарий
  • Авторизация через соц. сети с помощью sdk небезопасна (android). Как должен выглядеть алгоритм на сервере?

    @vshvydky
    Узнать айди приложения может каждый, зайдя в настройки своих приложений. Критической дыркой в безопасности здесь является то, что пользователь делитсф своими данными с вами.
    Ответ написан
    Комментировать
  • Как отключить определённый js или его часть на сайте?

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

    @vshvydky
    зачем сложности с прероутингом и тп?
    я так понимаю, что есть прокси форвардинг на нгинкс типо 80 -> localhost:8080
    цепочка инпут, политика дроп
    аксептим с флагами эстаблишет релейтед
    аксептим на 80 порт кого хотим

    оутпут разрешено все (получается что все локальные службы, которые будут инициировать коннект будут работать)
    И все заработает.
    Ответ написан
  • Как заставить функции выполняться в определённом порядке и ждать каждую последующую окончания работы предыдущей?

    @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 комментарий
  • Кто знает сервис для проверки whois с нормальным api?

    @vshvydky
    Whois в линуксе норм работает, накрутить на него апи и вперед
    Ответ написан
  • Как сделать умный фильтр текста по смыслу?

    @vshvydky
    Идея анализа слов хороша, но добавь к ней анализ страницы. У агента будет точно не одна объява о продаже на стене своей страницы, значит он точно не твой таргет, тогда и минусуй.
    Ответ написан
    1 комментарий
  • Откуда такой запрос?

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

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

    @vshvydky
    Открыть описание методов вк апи, на сервере у себя сделать приемку пост, гет с лендинга и по апи сообщать себе.... вроде очевидно же.
    Ответ написан
    2 комментария