• Как исправить ошибку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    забыли подключить JS плагина scrollspy
    Ответ написан
    Комментировать
  • Почему vk_api python долго обрабатывает с stand alone приложением?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Поверхностный взгляд
    На первый взгляд, косяк в числе запросов в одной "пачке" - их можно 25, а у вас всего 11.

    И подозрение на тормоза из-за частоты запросов. Библиотека vk_api, если используется именно она, с ошибками превышения частоты запросов (3 в секунду) поступает просто: откладывает следующую попытку на пол-секунды. См. too_many_rps_handler

    Разумнее считать время самостоятельно и точно укладываться в 3 запроса в секунду.

    Вы пишете про 1200-1800 в секунду, это как-то совсем медленно, учитывая, что первые 33 тысячи то уж точно должно были бы вернуться за первую секунду с тем кодом, что в примере.


    Upd. Попробовал безо всяких питонов прямо на странице приложения ВК создать хранимую процедуру и в ней получать список участников группы. Та же картина. Если только id пользователей – выполняется быстро.
    Стоит добавить поля city и can_write_private_message, как долго думает и вылетает с ошибкой.

    Видимо, надо «понять и простить» ВК, не справляющийся с такой нагрузкой в установленных лимитах времени/ресурсов и бить на меньшие партии, или выполнять доп. запросы.

    Например, если такой парсинг требуется не однократно, а снова и снова, есть смысл кэшировать у себя данные пользователей (надеясь, что они не станут менять город и закрывать/открывать сообщения каждый день) и при повторных запросах сначала получать только id, а потом запрашивать city и can_write_private_message только для новичков.
    Ответ написан
    8 комментариев
  • Как переписать данный скрипт?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если я правильно понял задачу, чтобы основная кнопка мыши имитировала нажатие W, а вторая кнопка мыши - пробел с автоповтором:
    const buttonChars = {
      1: 'W',  // левая (основная) кнопка мыши
      2: ' ',  // правая (второстепенная) кнопка
    };
    /* коды кнопок см. в https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
        0 : No button or un-initialized
        1 : Primary button (usually the left button)
        2 : Secondary button (usually the right button)
        4 : Auxilary button (usually the mouse wheel button or middle button)
        8 : 4th button (typically the "Browser Back" button)
        16 : 5th button (typically the "Browser Forward" button)
     Могут быть нажаты одновременно несколько кнопок мыши - их коды суммируются.
    */
    
    let timer;
    const clearTimer = () => {if (timer) clearInterval(timer);}
    const root = window;
    
    root.addEventListener("mousedown", e => {
      if (buttonChars.hasOwnProperty(e.buttons)) {
        const func = () => e.target.dispatchEvent(
          new KeyboardEvent('keydown',{
            'key': buttonChars[e.buttons],
            'bubbles': true,
            'cancellable': true,
          })
        );
        
        func();
        clearTimer();
        timer = setInterval(func, 80);
      };
    });
    
    root.addEventListener("mouseup", clearTimer);


    Ответ написан
    Комментировать
  • Как получить id человека по screen_name?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Метод ВК API utils.resolveScreenName() принимает единственный параметр screen_name и возвращает два поля:
    type тип объекта:
    • user — пользователь;
    • group — сообщество;
    • application — приложение.
    и object_id (integer)— идентификатор объекта.
    Ответ написан
    Комментировать
  • Как можно получить id человека, переслав его сообщение в беседе?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Зависит от реализации бота, ссылку на которого вы не привели, поэтому можно только гадать.
    Но, вероятно, message имеет тот же формат, что и в документации ВК.

    В таком случае message.from_id будет содержать идентификатор отправителя.

    Если сообщение переслали, то исходное будет где-то внутри поля fwd_messages
    Ответ написан
    3 комментария
  • Какого размера числа способен сосчитать js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Наибольшее «безопасное» целое 253-1 или 9007199254740991
    Числа больше будут записываться неточно, в экспоненциальной нотации, и возможны косяки, например
    var a = 9007199254740991 + 1;
    var b = 9007199254740991 + 2;
    a === b; // true

    См. MAX_SAFE_INTEGER

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

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    только нейронными сетями надо решать!

    X = 0.7 * Y Что здесь сложного? Найдо найти все пары (X, Y), где оба целые ?

    То ли лыжи не едут..
    function search_start_value($price, $sale) {
      return $price * 100 / (100 - $sale);
    }
    echo search_statr_value(1499, 30); // 2141,4285714286
    Ответ написан
    3 комментария
  • Сделать список дел на Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    - Не понимаю, как оставить класс first у первого item?

    Для чего этот класс вообще понадобился? Если для нахождения темплейта блока для последующего копирования, то так не очень. Дайте ему отдельный id, например. А для создаваемых дел назначайте уникальный id при клонировании.attr('id',new_id) Вообще достаточно один раз при запуске приложения сохранить где-то узел образца, убрав его из DOM. И дальше работать с той константой.

    - Почему массив item: undefined?

    ПОтому, что item не массив, а единственный узел. querySelector() возвращает первый найденный DOM-узел.

    - Почему в массиве first 1 элемент (так-то оно и должно быть по идее, но он же удаляется у первого item)

    first определяется только один раз в начале скрипта, когда такой только один. И более не переопределяется.

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

    Первым делом, не вешается слушатель события клика, потому, что deleteThis у вас это коллекция узлов. У неё нет метода addEventListener(). Он есть у каждого её элемента. Надо пройтись циклом и навесить слушателя на каждого.

    Откройте консоль браузера - там есть несколько интересных строк с ошибками.
    Вставляйте повсюду console.log(), чтобы посмотреть, когда что срабатывает и какие там значения у переменных.
    Ответ написан
    3 комментария
  • Как зашифровать якорь в URL на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно примитивно XOR'ить «секретный» пароль и строку. Очень ненадёжно, как и вся затея с хранением ключа шифрования в клиентском скрипте. Тем не менее, вот пример. При смене хэша он заменяется на шифрованную строку. начинающуюся с восклицательного знака - отличительный признак. Если так же вставить хэш с воскл. знаком - он дешифруется и заменится исходной строкой:
    ((w) => {
    
      function superpooper(secret) {
        const pass = encodeURIComponent(secret);
        return function onHashChange(){
          var hash = w.location.hash.replace(/^#/,"");
          if (!hash.length) return;
          
          const xor = s => s.split('').map((c,i)=>String.fromCharCode(c.charCodeAt(0)^pass.charCodeAt(i%pass.length))).join('');
      
          if (hash[0]==='!') {
            hash = hash.substring(1);
            const decoded = decodeURIComponent(xor(atob(hash)));
            history.replaceState(null, null, document.location.pathname + '#' + decoded);
          } else {
            const encoded = btoa(xor(encodeURIComponent(hash)));
            history.replaceState(null, null, document.location.pathname + '#!' + encoded);
          }
        }
      }
    
      w.addEventListener("hashchange", superpooper("abrakadabra"), false);
      
    })(window)


    Если запустить через консоль и в текущей вкладке добавить, например, хэш
    #Моё секретное сообщение оно тут же заменяется на
    !RFBHJVtEVlRbMURTVzZRTlNRIydXU1QmQ0RZVF1QR0BUU1JXU14lVURQR1lQR0BUL1FBU1cwVERQRyVbRFZUIDNEU1c2UE5TUVlSV1NUJkJEWVQmVEdAVCVTV1NeWVZEUEclUUdAVCklQVNXNlFEUEcjLkRWVCZCRFNXMFROU1FTUldTVCZDRFlUXFBHQFQlUldTXiMhRFBHJVFHQFQpJEFTVzZRRFBHI1pEVlQmQ0RTV0pYTlNRJVJXU1QgR0RZVCBRR0BUIyZXU14lVERQRyNZR0BUL1FBU1cwVA==

    И наоборот, если в странице добавить этот длинный хэш, он заменится на «Моё секретное вот это вот всё».
    Ключ шифрования тут abrakadabra
    Увеличение длины получается из-за того, что прогоняю через encodeURIComponent(), чтобы нормально работало с кириллицей, смайликами и emoji.

    Исходный пример это простой binhex
    у вас похоже на binhex: btoa('youtext') // "eW91dGV4dA==" – тут никаких ключей не требуется.

    atob("eW91dGV4dA==") // "youtext"
    Ответ написан
  • Как сделать таймаут в цикле Map?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы уважить требования одного API отправлять не более 3 запросов в секунду, я писал обертку, типа очереди задач. Задания хранятся в массиве. И сохраняются метки времени последних трёх запросов.
    Перед исполнением очередного задания текущее время сравнивается с нулевым в массиве (если в массиве уже есть 3 отметки) и либо можно выполнять запрос, либо надо подождать – запускается таймаут на разницу времен.

    Вам такого плана вариант нужен, или просто, чтобы один-за-другим, без ограничений по времени?
    Ответ написан
    5 комментариев
  • Как найти единомышленников для проекта, или влиться в стартап?

    Поищите инкубаторы, акселераторы, конкурсы, где собирают специалистов разных профилей и предлагают им объединяться в команды. Как, например, Цифровой Прорыв (уже поздно записываться) — это калька с довольно успешного рецепта.
    Ответ написан
    Комментировать
  • Access denied: could not access to this community?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    с каким токеном выполняете запрос? Тот, от имени кого выполняется, может видеть группу? Комменты в группе разрешены? Разрешены ли в группе комменты от сообществ?
    5d147d0d37901891533929.png

    См. коды ошибок ВК.
    15 — Доступ запрещён.
    Убедитесь, что Вы используете верные идентификаторы, и доступ к контенту для текущего пользователя есть в полной версии сайта.
    Ответ написан
    Комментировать
  • Почему в JS так?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Это нормально, потому что
    Ответ написан
  • Где брать курс главных валют + рубля через API, 2-3 раза в день?

    Центробанк даёт данные, в т.ч. в XML (документация). Например, котировки всех валют на сегодня, 27 июня 2019:
    http://www.cbr.ru/scripts/XML_daily.asp?date_req=27/06/2019

    Курсы обновляются 1 раз в день.

    Курс валют штука свободная, рыночная. Любой банк или обменник может устанавливать свой курс и менять его хоть каждую секунду. Поищите, какие банки предоставляют открытые API к своим котировкам валют.
    Ответ написан
    Комментировать
  • Как можно уникализировать картинку для facebook?

    Попробуйте добавить картинке шум, 5–10%
    Ответ написан
    Комментировать
  • Как запустить функцию после окончания другой функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Стоит отрефакторить код, чтобы не повторялись одинаковый функционал и одинаковые текстовые строки
    Примерно так
    Здесь ваш код без изменений логики, одинаковый функционал вынесен в пять вспомогательных функций Helper functions:
    $('#two_categor_mess').click( function() {
      var feedback = 'hello';
      addMessage(userTwoMsg('<div class="sender-text"><p>Please tell us about PatShop and PatStudio</p></div>'));
      $('.delivered').addClass('old');
      $('.patshop_bot').addClass('old');
      addDelivered('Delivered');
      setTimeout(function() { 
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
      }, 500);
    });
    
    
    // Helper functions
    const addMessage = content => $('.message-screen').append(content);
    const userTwoMsg = content => '<div class="user_two_message col-xs-12 col-sm-12">' + content + '</div>';
    const addTypingBlock = () => addMessage(userTwoMsg('<div class="typing_block"></div>'));
    const addDelivered = status => addMessage('<div class="delivered"><span>' + status + '</span></div>');
    const addReceived = text => addMessage(userTwoMsg('<div class="received-text"><p>'+text+'</p></div>'));
    
    
    function onSendClickDelayed() { 
      var divValue = $('.sender-text').last().text();
      var test = 'hello';
      var feedback = 'hello ';
      var feedbackhowareyou = 'good ';
      var feedbackalret = ' Im sorry  Im in development and dont understand some of the messages.  Here are the questions I can help you with: ';
      var selectcategories = '<div class="swiper-container"><div class="swiper-wrapper"><div class="swiper-slide" id="first_categor_mess"><p>What is PatShop and PatStudio?</p></div><div class="swiper-slide" id="two_categor_mess"><p>How to add your project</p></div><div class="swiper-slide" id="last_categor_mess"><p>How to buy the project</p></div></div></div>';
      var selectcategoriestext = 'Choose one of the categories';
      
    
      if (divValue.indexOf(test) >= 0) {
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
      
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
    
      } else {
    
        setTimeout(function() {
          addReceived(feedbackalret);
    //                  addReceived(feedbackalrettwo);
          addMessage(userTwoMsg(selectcategories));
          addReceived(selectcategoriestext);
          $('.typing_block').hide();
        }, 1200)
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
    
      }
    }
    
    $('#send').on('click', () => setTimeout(onSendClickDelayed, 500));


    Теперь к вашему вопросу. Если вытащить «вот такую» функцию и дать ей имя, её можно будет вызывать из нескольких разных мест:
    тот же код с небольшими изменениями
    const onClickTwo = () => {
      var feedback = 'hello';
      addMessage(userTwoMsg('<div class="sender-text"><p>Please tell us about PatShop and PatStudio</p></div>'));
      $('.delivered').addClass('old');
      $('.patshop_bot').addClass('old');
      addDelivered('Delivered');
    
      setTimeout(function() { 
    
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
      }, 500);
    }
    
    $('#two_categor_mess').click(onClickTwo);
    
    
    // Helper functions
    const addMessage = content => $('.message-screen').append(content);
    const userTwoMsg = content => '<div class="user_two_message col-xs-12 col-sm-12">' + content + '</div>';
    const addTypingBlock = () => addMessage(userTwoMsg('<div class="typing_block"></div>'));
    const addDelivered = status => addMessage('<div class="delivered"><span>' + status + '</span></div>');
    const addReceived = text => addMessage(userTwoMsg('<div class="received-text"><p>'+text+'</p></div>'));
    
    
    function onSendClickDelayed() { 
      var divValue = $('.sender-text').last().text();
      var test = 'hello';
      var feedback = 'hello ';
      var feedbackhowareyou = 'good ';
      var feedbackalret = ' Im sorry  Im in development and dont understand some of the messages.  Here are the questions I can help you with: ';
      var selectcategories = '<div class="swiper-container"><div class="swiper-wrapper"><div class="swiper-slide" id="first_categor_mess"><p>What is PatShop and PatStudio?</p></div><div class="swiper-slide" id="two_categor_mess"><p>How to add your project</p></div><div class="swiper-slide" id="last_categor_mess"><p>How to buy the project</p></div></div></div>';
      var selectcategoriestext = 'Choose one of the categories';
      
    
      if (divValue.indexOf(test) >= 0) {
        setTimeout(function() {
          addReceived(feedback);
          $('.typing_block').hide();
        }, 1000);
      
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
    
      } else {
    
        setTimeout(function() {
          addReceived(feedbackalret);
    //                  addReceived(feedbackalrettwo);
          addMessage(userTwoMsg(selectcategories));
          addReceived(selectcategoriestext);
          $('.typing_block').hide();
        }, 1200)
    
        $('.delivered').addClass('old');
        addDelivered('Read');
        addTypingBlock();
        
        onClickTwo(); // добавили вызов ТОЙ функции
    
      }
    }
    
    $('#send').on('click', () => setTimeout(onSendClickDelayed, 500));
    Ответ написан
    Комментировать
  • Как правильно перебирать циклом массивы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ответ написан
    Комментировать
  • Как получить только индексы массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Нужно собрать индексы, где встречается данный uuid?
    function find(arr, uuid) {
      return arr.reduce((p,c,i) => {
        if (!!~c.indexOf(uuid)) p.push(i);
        return p;
      }, []);
    }
    
    find(this.state.projectsId, '560a509f-7e9f-e711-8114-00155da4250e');
    // [1142, 1143, 1144]
    Ответ написан
    3 комментария
  • Методы оплаты в телеграм?

    Для платежей в Телеграм поддерживается несколько платёжных систем, в т.ч. Сбербанк и Яндекс.Деньги.
    У пользователей iOS из-за правил Apple покупки виртуальных товаров и цифрового контента недоступны.
    См. Bot Payments API
    Ответ написан
    Комментировать
  • Какой объектив выбрать на телефон для блога?

    Лицо выглядит привлекательнее, если снимать с бОльшего расстояния длиннофокусным (теле-) объективом.

    Как вы собираетесь снимать звук? Вешать петличный микрофон или писать прямо на мик айфона? Во втором случае конфликт: для звука нужно держать телефон поближе, для картинки подальше.
    Ответ написан
    3 комментария