Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как отправить куки?

    @rPman
    https://developer.mozilla.org/ru/docs/Web/HTTP/Gui...
    document.cookie = "name=value; domain=.example.com; path=/";

    будет работать для всех поддоменов example.com

    p.s. если без куки, данные добавляли как get параметр запросов (ну а на сервере сохраняй и передавай уже любыми способами), это будет работать на любых доменах в любых ситуациях

    upd. для разных доменов можно через iframe
    размести на странице домена A iframe на страницу на домене B, на которой скрипт отправит postMessage с нужными данными на страницу A

    из iframe на основную страницу:
    window.parent.postMessage({данные:xxx,..})
    или наоборот:
    iframe.contentWindow.postMessage(...)
    слушать сообщения:
    window.addEventListener('message', function(event) {
      // Проверяем источник сообщения для безопасности
      if (event.origin === 'https://первый-домен.com') {
        // данные в event.data
        ...
      }
    }, false);

    https://developer.mozilla.org/en-US/docs/Web/API/W...
    https://developer.mozilla.org/en-US/docs/Web/API/W...
    Ответ написан
  • Простой счётчик без БД (допустим на основе txt файла)?

    @rPman
    Если есть доступ к серверу, то настроить логи и анализировать их.
    Если есть доступ только к html страничкам, то подключить какую-нибудь стороннюю аналитику, если Россия то какая-нибудь яндекс.метрика.

    Если самому то без доступа к серверу (или ее один сервер но уже по твоим правилам) не обойтись. Тебе нужно где то хранить информацию о посещениях. Куки тут не подойдут, они хранятся у клиентов.
    но это извращение
    p.s. можно предположить, если страница достаточно популярна, с помощью webrtc реализовать децентрализованное хранилище у клиентов, каждый клиент как только заходит на сайт, тут же делится собранными данными со своими соседями (сайт тут выступает как обменник, есть сторонние сервисы которые ничего не хранят но обеспечивают 'соединение'), но передаваемых данных будет слишком много (количество клиентов * количество дней глубины сохранения посещений) и передаваться должны всё всем.
    Ответ написан
    Комментировать
  • Как отобразить при случайном порядке уникальность страниц?

    @rPman
    Если скорость исполнения не критична (что маловероятно но вдруг) можно обойтись без random, а сортировать строки по хешу от crc32(row_id*MAX_USER_ID+user_id) или представив числа как строки например:
    select * from table order by md5(concat(id,'|',$user_id))

    советую использовать числовые хеши типа crc32, по уму они быстрее.

    MAX_USER_ID это максимальное значение user_id, что бы значения не пересекались, так как если просто сложить id+user_id то 1+3 выдаст тот же результат что и 3+1. Можно чуть сократить сдвиг (особенно если хочешь поместить результат в 32-битный int), если убрать из интервала неиспользуемые минимальные user_id - id*(MAX_USER_ID-MIN_USER_ID)+(user_id-MIN_USER_ID). И конечно можно битовыми сдвигами пользоваться.

    Достоинство - это полностью вычисляемый алгоритм, ничего хранить не придется.

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

    Второй недостаток - новые записи могут попасть в начальную часть списка, которую пользователь уже прочитал, т.е. все статьи в результате сдвинутся вперед. Это можно частично решить (статью, появившуюся в начале, пользователь так и не прочитает), если пагинацию делать не постраничную, а записи по ее id, т.е. в интерфейсе есть next/prev но нет номера страницы (в ссылке id записи или ее вычисляемый хеш).

    p.s. как пользователь скажу, что этот подход лучше не применять, мало того, как пользователь я не вижу пользы в случайных статьях.
    Ответ написан
    Комментировать
  • Использование PDFium через WASM в Node.js и альтернативы для анализа метаданных PDF?

    @rPman
    W в абривиатуре WASM это Web, и оно имеет смысл (но понятно не ограничивается) только в браузере, потому что ничего иного в нем нет или не безопасно для пользователя (как с java applet или activex ранее). На сервере же (у вас же nodejs это на бакэнде) доступны вызовы нативных приложений, используйте их и не городите себе лишних прослоек типа WASM (это все же виртуализация, так или иначе)
    Ответ написан
    Комментировать
  • Как анализировать JS и PHP ошибки на своем сайте?

    @rPman
    Информация обо всех событиях складывать в машиночитаемом виде, не важно каком, выбор зависит от задачи, от нагрузки, от наличия денег и т.п.

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

    Самое простое - это текстовый лог в формате jsonl, это сериализованный в json по строчно на каждое событие (а атрибуты события - атрибуты объекта json). В некоторых случая json не поддерживается, например какой-нибудь fail2ban его не умеет, но умеет с помощью регулярных выражений извлекать данные из текста, тогда данные можно собирать и разделять в виде, удобным для последующей обработке регулярными выражениями.

    Как только объемы событий выходят на гигабайты, текстовые логи становятся неудобными (а может и раньше) и данные лучше складывать в какую-либо базу данных... кому то нравится nosql (неудобна для анализа), кто то сразу в sql базы складывает (они удобны тем что могут хорошо масштабироваться на несколько устройств или машин). Те, кому нужно совсем много данных, могу задуматься о предварительном анализе данных через промежуточный сервис (т.е. для того что бы оставить сообщение, приложение по сети отправляет лог-серверу запрос), который делает минимальный анализ, выделяет что сохранить и как, проводит базовую аналитику и сохраняет в базы данных (лог база данных может быть сложнее чем пара табличек).
    Ответ написан
    Комментировать
  • Как сохранять клики и их время в кликере?

    @rPman
    вместо условных 100 кликов людям засчитывало ~40
    судя по sql у тебя количество сохраняемых кликов считается как сначала запросом получить текущее значение, затем сохранить его увеличенным... что естественно неправильно обсчитывается, если одновременно на бакэнд идут несколько запросов, и завершаются в разном порядке (т.е. первый, получил значение 1, затем его обогнал второй, получил то же значение 1, оба отправляют +1 значение, т.е. 2, вместо ожидаемого 3.

    Правильно: одним обновлением в базе нужно - проверять допустимость клика (проверить время последнего клика), обновить время последнего клика и увеличить количество кликов на 1... после чего бакэнд проверяет, сколько записей было обновлено, если 0 - значить выход за лимиты, если 1 - все ок.
    update set clicks=clicks+1, last_click_time=now() where last_click_time+:ALLOWED_CLICK_INTERVAL<now() and id=:current_id


    p.s. даже очень слабая машина позволит делать сотню запросов в секунду на обновление, а хорошая - десяток тысяч

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

    @rPman
    Значит это не Array а объект, и length тебе считает вот это свойство length
    Потому что вот это будет равно 0 как и ожидается
    JSON.parse('[]').length
    Ответ написан
  • Компилируемый ЯП в стилистике JS есть?

    @rPman
    Использую очень давно php для локальных скриптов, у него самый немногословный синтаксис именно для работы с файлами (или к примеру запуск команды это написать ее в обратных ковычках $a=`ps -ax`;), это самый быстрый в исполнении язык программирования, даже и интерпретируемый, рядом с ним javascript но с оговорками (например использовать map вместо массивов), все остальные рядом не стояли. А благодаря огромной базе решений в composer задачи можно решать и по сложнее.

    Если что python тоже хорош, и стал чуть ли не стандартом в мире linux, и синтаксически так же не многословен, а уж решений в pypi базе там наибольшее из всех существующих... лично мне не очень нравится как язык, а еще он самый медленный поисполнению из всех (его скорость - в готовых решениях, оптимизированных и написанных на c++)

    Интересно и то что установить php можно практически куда угодно (извиняюсь, не нашел для KolibriOS - это был сарказм), у него наименьшие требования к скилам и версиям ос, на windows штатно распространяется просто zip-чиком, а на linux не найти репозитарий нужной версии еще нужно постараться, да и если нет, при некотором рукошевелении он так же устанавливается в каталог пользователя, требований к самой ос у него очень мало.

    p.s. если вопрос про windows, то с ним уже давно в стандарте идет .net sdk (4 версии) а установить можно 6-ую версию. sdk это компилятор c#/js#/vb#, exe-шник будет в пару килобайт, для создания приложения достаточно текстового редактора. c# лично мне не нравится в задачах скриптописания из-за многословности но как язык разработки это отличный вариант, строгость типизации, все лучшее из мира java... но в скорости исполнения он заметно отстает от php/js (сейчас набегут хейтеры и скажут что вы все врете..)
    Ответ написан
  • Как в JS реализовывается механизм синхронизации множественных параллельных запросов?

    @rPman
    Ты делаешь метод выполнения 'следующего запроса' (он будет смотреть список задач и исполнять первый не выполненный, либо вернет - все закончилось) асинхронным async function do_next()..., и в цикле просто вызываешь этот метод await do_next() пока не вернется все закончилось, параллельно можно запустить таймер таймаута, который завершит все невыполненное.
    Ответ написан
  • Как найти букву, которая не является частью слова?

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

    p.s. еще есть \b - граница слова, любая буква \w тогда регулярка /\b\w\b/
    Ответ написан
    5 комментариев
  • Как сделать просмотр ютуба при выключенном экране смартфона на js?

    @rPman
    firefox, приватная вкладка, вид для ПК, оригинальный youtube работает при заблокированном устройстве (иногда требуется сменить вкладку на другую перед блокировкой, закономерности не выявил).

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

    ну и https://wiki.mozilla.org/Mobile/GeckoView
    Ответ написан
    Комментировать
  • Как лучше сделать переключение языков на многостр. сайте?(без бэка)?

    @rPman
    Модифицируй роутер или mod rewrite веб сервера таким образом, чтобы идентификатор выбранного языка был в ссылке (например my.site.com/fr/blablabla ), при отсутствии этого идентификатора проводи проверку по заголовку (например для apache, главное идея). Это позволит в интерфейсе дать пользователю выбор языка и одновременно без этого выбора делать его автоматически.

    да, перевод нужно размещать поэлементным и прописывать в своем json.

    Так же есть сервисы типа гугла или yandex, устанавливаются на сайт и делают автоматический перевод (не рекомендую)
    Ответ написан
    7 комментариев
  • Как скачать защищенный от скачивания PDF-файл с сайта?

    @rPman
    Скопировать через буфер можно только неформатированный текст и только текущие +-10 страниц (вручную можно но долго и нудно, потом сшивать).
    1. Реверсить их вьювер долго и дорого.
    2. Скринить странички - для личного использования подойдет (набор картинок, соединить в pdf и читать не проблема, но железные слабые читалки могут такие не прожевать), сделать не программисту можно с помощью любой автоматизации, например autoit. Логика следующая - открываешь нужный сайт в максимальном размере на полный экран (полный экран и настроить По ширине страницы), затем продумываешь свои действия (мышь/клавиатура) такими, чтобы если их повторять, копировалось все содержимое без пропусков и повторов, в данном случае это кнопка PageDown и копирование экрана (можно по количеству страниц посчитать сколько это будет действий)

    В коде autoit это будет for loop
    For $i = 1 To 100500
    ...
    Next


    шлешь нажатие кнопки
    Send('{PGDN}')

    ждешь секунду (там примерно каждые 10 страниц генерация и удаление старых) sleep

    делаешь скрин с экрана
    _ScreenCapture_Capture(StringFormat('%09i', $i) & '.png', 0, 0, @DesktopWidth, @DesktopHeight, False)

    нужно подобрать размеры чтобы лишнее не копировать
    StringFormat тут добавляет к номеру слева нули, чтобы при сшивании порядок не был 1 -> 11 -> 2 -> 3....

    по итогу работы получишь тысячу картинок, объединяешь их с помощью imagemagic
    magick *.png out.pdf

    3. способ - их pdf просмотрщик генерирует валидный html для текста (с картинками сложнее),
    css selector
    $('#pageContainer2 > .textLayer').innerHTML
    тут номер у pageContainer это номер страницы, но в один момент времени заполнены текстом только текущие видимые +- поэтому код нужно будет написать, чтобы корректно в нужный момент времени читать нужные

    Можно конечно заморочиться и запилить selenium приложение которое будет листать странички и собирать html-ку, можно в полуручном режиме прямо в браузере в консоли написать пару строчек, собирая текст в localStorage (он ограничен 5-мб кажется). html код там прямо такой (по кускам текста как они были в pdf)
    Кликать на следующую страничку - $('#next').click()

    <div style="left: 83.5342px; top: 384.732px; font-size: 20.5963px; font-family: serif; transform: scaleX(0.793798);" data-canvas-width="404.5723586629188">Стенограмма  Нюрнбергского  процесса.  Том </div>

    т.е. останется только стили добавить или скопировать их с сайта и готовая отформатированная html будет готова
    Ответ написан
    Комментировать
  • Скачать все видео автора тик ток?

    @rPman
    Видео отлично качает консольная утилита yt-dlp (устанавливать в linux из pip install в windows с офф githubоно же умеет качать и видео пользователя но именно с тикток это сейчас сломано (само собой тикток борется с качальщиками), я не пробовал самый последний релиз возможно пофиксили, попробуй)

    Еще момент, с российских ip тикток кастрирует и ломает выдачу, скрывает популярных авторов в т.ч. из поиска (вот пример @wannabeteacher поищи как пример), поэтому подбирай локацию хостинга скриптов.

    p.s. у тикток есть api, просто разберись с ним и используй
    https://developers.tiktok.com/doc/tiktok-api-v1-vi...
    Ответ написан
    2 комментария
  • Как ограничить доступ к странице сайта на устройстве пк браузеров?

    @rPman
    Открывамем гугл, пишем github browser mobile detector
    получаем ссылку на почти сотню проектов, отсортированных по популярности, первый какраз на php
    Ответ написан
    Комментировать
  • Какую технологию использовать для проигрывания видео в браузере с ручной подгрузкой байтов?

    @rPman
    Когда то давно я открывал два плеера (друг над другом один скрыт другой виден), загружал в оба плеера видеофайлы, ставил на паузу (особенность, если просто указать видео в режиме паузы оно не загружается, загрузка начинается в момент проигрывания, но это было давно может уже поменялось что, советую просто проверить), и затем по мере окончания проигрывания одного, я скрывал его, делал видимым второе видео и отключал паузу в нем.... причем паузу можно отключать на доли секунды заранее, подруливая громкостью, делать плавный переход от одного к другому.

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

    p.s. вполне возможно что сейчас лучше/удобнее формировать .m3u8 плейлист, javascript там продвинутый у html video, но если что его можно формировать и прописывать с помощью data uri.
    Ответ написан
    Комментировать
  • Как максимально быстро кликнуть на элемент в браузере?

    @rPman
    Необходимо реверсинженерингом выявить способ, которым события доходят до клиента.

    Для начала открой консоль разработчика (f12) и зайди на вкладку networks
    - если там будут периодические события (например с секундным интервалом) по названию (в url или еще как) похожие на получение статуса, то это значит используется медленный метод http get (это значит клиент получает информацию о событии со случайной задержкой порядка этой секунды), значит дальше можно искать в коде способ как чаще делать запросы (обычно это вызов метода по setTimeout его можно тупо повторить из консоли руками).
    - если там будет подключение типа websocket, тогда странно, обычно это самый оперативный метод, но бывает что бакэнд писали странные люди (или их поставили в странные условия) и там события обрабатываются линейно что то типа 'sleep;читаем базу;отправляем на клиента' то тогда достаточно открыть одновременно несколько окон браузера к одной и той же страничке, и с некоторыми шансами получишь на каждого клиента по циклу со sleep а значит со своей случайной задержкой (она зависит от интервала между открытиями страниц) а значит какая то страница получит обновление статуса раньше с вероятностью тем выше чем больше страниц.

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

    По правильному можно разобраться как все работает и на javascript написать максимально эффективное приложение (прямо тут же в консоли браузера) по опросу сервера.
    Ответ написан
  • Создание бота для Android игр, как?

    @rPman
    Формально исследователи ИИ научили играть компьютер а условный Майнкрафт исключительно по видео, так же бот успешно играл в аркады типа Марио и прочее.

    Если ты готов отвалить за результат несколько десятков миллионов $, то дерзай, обращайся в Гугл или openai.

    Ну а классическим способом универсального бота не сделать
    Ответ написан
  • Как происходит кеширование, если вызывает функция slow?

    @rPman
    slow = cachingDecorator(slow);после этого slow у тебя уже не прошлая функция а целый класс, в котром прописан вызов старой функции при условии отсутствии данных в кеше (объект в этом классе)

    Заметь, slow без скобок это не вызов функции, а получение ее самой (в терминах c++ ее адреса) и передача этой функции в виде аргумента. Чтобы вызвать функцию, даже если ее адрес в переменной, нужно написать скобки
    Ответ написан
  • Парсинг по расписанию и аплоад в БД?

    @rPman
    Тебе нужен критерий, как отличать старые записи (дубликаты или не изменившиеся, тебе виднее что там) от новых.

    Если удобного идентификатора нет, то обычно самое простое, - формировать из сравниваемых данных строку одинаковым способом, и получать из нее хеш сумму (md5 более чем подходит, если данных не 16-значное количество, т.е. не нужно заботиться о коллизиях), его и используй как идентификатор и храни где-то списком как предыдущие значения и сравнивай с ново загруженной, прямо во время анализа. Записи, хеш сумма которых, не была найдена в записях, помещай в базу данных (ну или обновляй значения, если речь идет о модификации а не добавлении новых).
    Ответ написан
    Комментировать