Задать вопрос
  • Возможно ли дать мут tg каналу?

    отчего б не написать бота, дать ему права админа в группе, и пусть лютует )
    Канал напишет – бот тут же сотрёт. Или лишит его права отправлять сообщения через метод restrictChatMember
    Ответ написан
    Комментировать
  • Как в библиотеке Monolog 2.8 PHP ограничить отправку похожих писем раз в час?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    пускать через обработчик deduplicated
    https://symfony.ru/logging/monolog_email.html
    Ответ написан
    Комментировать
  • Как работает JPEG стенография?

    Ответ написан
    Комментировать
  • Как задать команды администраторам чата в частной супергруппе Telegram?

    Узнайте и укажите целочисленный идентификатор вашей группы – например, просто выведите в лог очередной update для бота с сообщением.

    chat_id 	Integer or String 	Unique identifier for the target chat 
    
    or username of the target supergroup (in the format @supergroupusername)


    И, надеюсь, вы прочли, что Command Scopes это только чтобы показывать доступные команды разным группа юзеров. И ничто не мешает рядовому бесправному юзеру прислать боту команду вроде /make_me_admin

    Ответственность только вашего бэкенда – каждый раз проверять, уполномочен ли юзер использовать ту или иную команду, что он прислал.
    Ответ написан
    3 комментария
  • Как в Telegram bot api получить сколько человек зашло по конкретной invite link?

    Бот должен быть админом в группе и подписаться на события "chat_member" в списке allowed_updates.

    Когда новый пользователь вступает в группу, бот получит update с полем chat_member в котором содержится объет ChatMemberUpdated в поле invite_link которого объект ChatInviteLink. В нём наверное интересует поле invite_link (строка) и поле creator (User, который создал ссылку).

    Итого, URL ссылки: update.chat_member.invite_link.invite_link
    Ответ написан
    Комментировать
  • Почему именно такой порядок вывода в консоль?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Исследования в первоначальной версии ответа (ниже) натолкнули на поведение, которое смог объяснить Jonas Wilms в ответе на SO.

    Возврат промиса из C1 then() создаёт ТРИ последовательных микротаска:
    1. NewPromiseResolveThenableJob, который вызывает then() на том уже отресолвленном промисе, что вернули в C1. И т.к. этот промис уже отресолвлен, сразу же в очередь вставляется следующий микротаск:
    2. NewPromiseReactionJob этого уже разрешенного промиса, и этот, в свою очередь, добавляет третью микрозадачу:
    3. ещё одну NewPromiseReactionJob, которая уже выводит в лог "2".


    Если возвращать не промис (и не thenable объект), а "простое" значение или undefined, то добавляется всего один микротаск.

    Раньше подобная задержка в три шага была и для await, но потом её оптимизировали в движке V8. А вот про then() забыли.

    Подробнее стоит посмотреть ответ на SO, ссылка в начале.

    [первая версия ответа]

    Интересный вопрос! Больше экспериментов.
    Вспомогательная функция для читаемости:
    const log = (value, returnPromise) => () => {
      console.log(value);
      if (returnPromise) return Promise.resolve();
    };
    Возвращает функцию, которая обычный console.log() с переданным значением. И если второй аргумент трушный, то вернёт отрезолвленный промис.

    Эксперимент 1. «Застёжка-молния»
    Promise.resolve()
      .then(log('a1'))
      .then(log('a2'))
      .then(log('a3'))
      .then(log('a4'))
      .then(log('a5'))
      .then(log('a6'))
    ;
    
    Promise.resolve()
      .then(log('b1'))
      .then(log('b2'))
      .then(log('b3'))
      .then(log('b4'))
      .then(log('b5'))
      .then(log('b6'))
    ;
    Выводит поочередные a1 b1 a2 b2 a3 b3 ...
    Эксперимент 2. «Отстаём на 2»

    Единственное отличие: в первом А возвращаем отресолвленный промис.
    Promise.resolve()
      .then(log('a1', true))
      .then(log('a2'))
      .then(log('a3'))
      .then(log('a4'))
      .then(log('a5'))
      .then(log('a6'))
    ;
    
    Promise.resolve()
      .then(log('b1'))
      .then(log('b2'))
      .then(log('b3'))
      .then(log('b4'))
      .then(log('b5'))
      .then(log('b6'))
    ;

    Выводит
    a1 b1 b2 b3 a2 b4 a3 b5 a4 b6 a5 a6
    А-шки после 1-й отстают на 2, пропустив вперёд b2 и b3.

    Очередь микрозадач работает как FIFO буфер: первый пришёл, первый ушёл.

    Цепочка из then() выполняется асинхронно. После выполнения очередного, создаётся следующий microtask. Несколько цепочек, как видно из 1-го эксперимента, выполняются параллельно-пошагово, «молнией».

    Возврат созданного выполненного промиса, и ожидание его разрешения вызывает задержку в очереди микрозадач на 1 микротаск + «перемещение» цепочки "А" в конец (меняется порядок a-b => b-a):
    "молния"
    a1 b1 ; a2 b2 ; a3 b3 ; a4 b4 ; a5 b5 ; a6 b6
    
    с промисом в А1
    a1 b1 ; b2 ; b3 a2 ; b4 a3 ; b5 a4 ; b6 a5 ; a6


    Подробнее с тремя цепочками

    На этот раз три цепочки промисов "a", "b", "c". Цепочка "А" вернёт промис на 1-м шаге, "С" — на 4-м. Код эксперимента:
    const output = [];
    
    const makeChain = (key, n = 5, trueStep = false) => {
      let p = Promise.resolve();
      const arrow = isArrow => isArrow ? '->' : '';
      for (let i = 1; i <= n; i++) {
        const returnPromise = trueStep === i;
        const afterPromise = trueStep === i - 1;
        p = p.then(() => {
          output.push(`${arrow(afterPromise)}${key}${i}${arrow(returnPromise)}`);
          if (returnPromise) return Promise.resolve();      
        });
      }
      return p.catch(console.error);
    };
    
    const n = 7;
    makeChain('a', n, 1),
    makeChain('b', n),
    makeChain('c', n, 4),
    
    // мАкрозадача выполнится после всех мИкрозадач:
    setTimeout(() => console.log(output.join(' ')));

    Результат c вручную добавленными разбивками:
    a1-> b1 c1 ; b2 c2 ; b3 c3 ->a2 ; b4 c4-> a3 ; b5 a4 ; b6 a5 ; b7 ->c5 a6 c6 ; a7 c7
    Тут всё ещё не вполне мне понятен порядок после возврата промиса из C4.
    Ответ написан
  • Как создать бота в Telegram для приема сообщений от пользователей?

    Бесплатный вариант (один из) — реализовать на Google Apps Script (GAS). Например, на основе личного Google-аккаунта и таблицы Google Spreadsheets. См. документацию.

    Создайте новую Google-таблицу, и в меню "Extensions" откройте "Apps Script".

    Ваш Telegram бот должен будеть принимать HTTP запросы и сам делать HTTP запросы к API Telegram. Чтобы ваш скрипт мог принимать запросы, нужно создать функцию doPost(), которая будет вызываться при каждом входящем сообщении боту. Подробнее про Web Apps.

    Зарегистрировать новый Telegram бот и получить его токен для выполнения запросов — через опять же бота @BotFather. См. документацию по API Telegram ботов.

    Чтобы бот получал события сообщений, надо настроить его WebHook
    пример кода AppsScript установки WebHook
    const TG = new TelegramClient(TELEGRAM_BOT_TOKEN);
        const url = ScriptApp.getService().getUrl();
        const response = TG.setWebhook(url);
        const result = JSON.parse(response);
        const output = { url, result };
    
        console.log(result);


    Когда кто-то напишет боту, вам прилетит update с сообщением. В обработчике сего события вы вызовите ботом метод forwardMessage() чтобы отправить копию сообщения в диалог лично ваш с этим ботом.

    Желаю удачи и настойчивости разобраться. Возникнет ещё масса вопросов, все ответы на которые находятся поиском.
    Ответ написан
    Комментировать
  • Как это посчитать?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    в цикле:
      проверять правила,
      если одно из них привело к изменению, нужно повторить сначала
      если изменений нет — можно выходить из цикла, более считать нечего.

    + сделать предохранитель от бесконечных повторов. Мало ли..
    Ответ написан
    Комментировать
  • Как отредактировать nginx с помощью ansible?

    может, вынести строки в отдельный файл, инклюдить его в конфиг NGINX, ansible'ом изменять тот отдельный файл.
    Ответ написан
    1 комментарий
  • Как отключить предупреждение при использовании document.write()?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Очень не рекомендуется более использовать метод document.write() (см. ссылку именно на англ. т.к. перевод запаздывает)

    Можно убрать зачеркивание устаревшего метода write() в вашем коде:
    в настройках найдите параметр editor.showDeprecated и установите его в false (уберите галочку).

    Это не изменит того, что writeln() будет приоритетнее, как актуальный метод, в отличие от устаревшего write()
    Ответ написан
    Комментировать
  • Как подключиться яндекс метрики к телеграм боту?

    Со стороны сервера можно передавать данные в Метрику:

    Отслеживание офлайн-данных
    Ответ написан
    Комментировать
  • Davinci resolve.Как выставить количество кадров?

    Скорее всего, просто во вкладке таймлайна увеличьте длину клипа этой композиции.
    Ответ написан
    Комментировать
  • Как в Redis сделать очередь с возможностью изменения элементов?

    Наверное, стоит в списке хранить только ключи, а значения хранить в парах ключ-значение. Чуть прибавится операций:
    • при вставке смотреть, есть ли уже такой ключ, если есть только обновить значение. Если нет – то ещё и вставить в список.
    • при обработке / извлечении из списка – брать значение и удалять ключ-значение.


    Вставка значения: SET key value GET – вернёт предыдущее значение, если было, или NULL. Если NULL, то надо ещё LPUSH queueName key

    Извлечение значения:
    RPOP queueName – вытащили ключ из очереди.
    GETDEL key – получили значение + удалили ключ-значение.

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

    Видел работу бота, который даёт новым вступившим 60 сек нажать кнопку.
    Т.е. в ответ на событие вступления в группу, бот пишет что-то типа
    "Вася, у вас есть 60 секунд подтвердить, что вы не бот, нажав кнопку под этим сообщением" и с сообщением идет callback button.

    Если не жмёт – аккаунт банится.

    Наверное, можно и чуть усложнить:
    предлагать несколько кнопок с единственной правильной, и варьировать тексты кнопок. В т.ч. в сообщении загадывать простую загадку типа "Пять плюс десять это сколько?" и кнопки 3, 10, 15, 25. Или "Число делится на три. Неправильный ответ" - 9, 10, 12, 15.

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

    Пишут, что убрать полосы помогает отключение аппаратного ускорения.

    URL настроке в Chrome: chrome://settings/?search=hardware+acceleration

    Вообще, это началась беда с железом, и возможно, скоро крякнется видео совсем. Если Вы в Москве, порекомендую яблочный сервис, которым пользовался несколько раз, в т.ч. с похожей проблемой на MacBook Pro: macplus.ru
    Ответ написан
    Комментировать
  • Как добавить required к форме с выпадающим js календарём?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Судя по коду (а ведь могли бы сами написать, что используется FlatPickr и jQuery Form), стоит дополнить именно отправку формы: добавить валидацию данных до отправки, и в случае null в поле даты (по умолчанию там null, в "0000-00-00" преобразовывается где-то после), прекращать дальнейшую отправку формы, а юзеру показывать напоминалку ввести дату рождения.

    См. beforeSerialize или beforeSubmit в опциях jQuery Form. Там проверяйте, что в поле даты рождения, и если null (или минимальная допустимая дата) – даже и не отправляйте форму.
    Ответ написан
    Комментировать
  • Откуда появилась переменная x в Redis?

    Вот тут описан хак Redis'а, когда в него прописывают ключ-значение с ssh-ключом, конфигурят бэкап в файл вместо dump.rdb в ~/.ssh/authorized_keys, и, вуаля, злодей получает SSH на машину.

    Т.е. видимо, у вас Redis торчал наружу какое-то время, достаточное для обнаружения сего факта злодейским обходчиком. К счастью, если сам Redis был запущен внутри контейнера, то и ключ прописался внутри контейнера, и эта атака ни к чему не привела.
    Ответ написан
    5 комментариев
  • Хорошо ли распознают современные версии FineReader по сравнению со старыми?

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

    Мой недавний опыт — «на 4+». Документ без клякс (многостраничная таблица, реестр) распознал неплохо, но местами были ошибки, которых можно было бы избежать проверкой по словарю или каким-то здравым нейро-смыслом. Опечатки в фамилиях, границу ячеек таблицы иногда принимал за "1". Пришлось внимательно просмотреть результат, исправляя типичные ошибки. Но в целом, помог, конечно – лучше, чем вручную набивать.
    Ответ написан
    Комментировать
  • Как удалить все свои сообщения в конкретной телеграмм группе?

    Ну вот же вроде бы причина:
    error: Microsoft Visual C++ 14.0 or greater is required.
    Get it with "Microsoft C++ Build Tools":
    https://visualstudio.microsoft.com/visual-cpp-buil...


    У вас не установлен Visual C++, из-за этого не получается собрать tgcrypto.
    Ответ написан
    Комментировать
  • Почему переменная теряет видимость?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Похоже на баг/фичу консоли Google Chrome.
    В консоли FireFox повторные запуски корректно ругаются на переобъявление let testValue

    Так действительно делать нельзя, но разрабы Chrome с версии 80 решили «помочь» разработчикам, использующим консоль, и ленящимся заключать весь код в фигурные скобки, чтобы изолировать область видимости. С FireFox такая привычка у меня лично уже выработалась, все эксперименты в консоли – внутри { }

    И вот в консоли Хрома теперь можно переназначать и переенные let, и даже const. И классы. Печаль.

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

    TL&DR; предлагаю писать корректный JS в строгих песочницах, где два let подряд не пройдут.
    Ответ написан
    2 комментария