Задать вопрос
  • Как перебрать всех пользователей, и узнать создателя беседы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Telegram Bot API не предоставляет возможности получить список участников чата. Это можно сделать только с помощью клиентского API (его реализует, например, библиотека telethon).

    Однако если id пользователя известен (можно, например, отслеживать ботом сообщения о вступлениях в чат, запоминая всех, кто вошёл в чат после бота), можно проверить его роль в чате с помощь метода get_chat_member. Но основатель чата, очевидно, будет в нём всегда самым первым пользователем до любого бота.
    Ответ написан
    Комментировать
  • Как сделать единую точку входа в nginx через auth_basic?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, http auth помнит авторизацию только для конкретного сайта/домена. Придётся перейти на общий домен, смириться с двумя авторизациями или отказаться от http auth вообще. К слову, её в интернетах вообще используют исчезающе редко, так как она сильно неудобна для пользователя не только по причине отсутствия кроссдоменности.
    Ответ написан
    7 комментариев
  • Как сгруппировать ip по /24?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка в том, что не надо в процессе итерации по списку удалять из него элементы. Результат может быть непредсказуем.

    И вообще, код какой-то безумный. Задачу можно решить в один цикл, примерно так:

    mask_dict = {}
    
    for i in test:
        mask = IPv4Network('{}/24'.format(i), strict = False)
        if mask in mask_dict:
            mask_dict[mask].append(i)
        else: 
            mask_dict[mask] = [i]
    Ответ написан
    2 комментария
  • Как настроить передачу с формы на заказчика т.г?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Токен не даёт полного доступа к аккаунту, только возможность отправлять/принимать сообщения от имени бота. Так что это вполне нормально передавать токен бота для интеграции. В конце концов, владелец бота может через BotFather поменять токен и тем самым быстро отключить ранее выданный.
    Ответ написан
    3 комментария
  • Как сделать телеграмм бота, который когда его отметили дает выбор какое отправить аудио?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это не "отметили", а так называемый inline mode. Нужно включить этот режим в настройках бота, а затем в коде реализовать обработчик inline_handler. Примерно так:

    @bot.inline_handler(lambda query: len(query.query) > 0)
    def query_text(inline_query):
        keyboard = []
        for code in ['foo', 'bar']:
            keyboard.append(telebot.types.InlineQueryResultArticle(code, f'>>> {code} <<<', telebot.types.InputTextMessageContent(f'<<<{code}>>>')))
        bot.answer_inline_query(inline_query.id, keyboard, is_personal=True)


    Важно понимать, что inline mode - это не полноценное средство интеракции с ботом, а помощник в написании сообщения от пользователя. В частности, результаты inline query кэшируются на серверах Телеграма, так что если поступит такой же запрос, что и минуту назад, то Телеграм даже не сделает запроса к боту. Также в этом режиме не раскрывается информация о чате, в который будет отправлено сообщение, и даже больше того, пользователь может в итоге отказаться от отправки сообщения вообще, но бот об этом не узнает.

    ЗЫ
    Мне в одном боте пришлось из-за этого реализовать концепцию inline policy: в зависимости от настроек чата бот может игнорировать или даже удалять сообщения, оставленные пользователями с помощью inline mode ботов из чёрного списка.
    Ответ написан
    Комментировать
  • Есть ли payload в телеграм кнопках?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для обычных (не inline) кнопок текст на кнопке означает обычный текст, передаваемый боту при нажатии на кнопку. Никакого другого способа определить нажатую кнопку нет.
    Ответ написан
    Комментировать
  • Как получить id?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, средствами Bot API это невозможно. Тем более что у пользователя может вообще не быть username.

    Конечно, его можно получить в событии от пользователя в поле Update.from.id, но для этого пользователь должен сделать какое-то действие в сторону бота (или, например, в сторону группы, в которой он состоит).
    Ответ написан
    Комментировать
  • Сколько всего ip адресов в глобальном интернете?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если ipconfig показывает адрес с префиксом fe80::, то это Link Local address, аналог 169.254.* в IPv4, такие адреса в Internet не маршрутизируются.
    Ответ написан
    Комментировать
  • Как узнать количество уникальных результатов random.shuffle?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Число перестановок списка длины n - это n! (факториал: n!=1*2*3*...*n). Это основы комбинаторики.

    Так что если надо просто число различных вариантов, то:

    math.factorial(len(our_list))
    Ответ написан
    Комментировать
  • Что за папка /root/mdb103/?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сделай из под root

    lsof -n | grep root/mdb103

    при запущенной mariadb. Если найдёт запущенные процессы mariadb, использующие файлы в этом каталоге, значит да, файлы там нужны.

    В каталоге лежат deb-пакеты, они после установки не нужны. В подкаталоге лежат исходники сервера скомпилированные. В зависимости от того, как они установлены, они могут быть также не нужны. Если их ставили через make install без префикса в /root, то сервер должен, скорее всего, стоять в /usr/local. Если через сборку пакетов с помощью debian/rules (при этом готовые пакеты кладутся в вышестоящий каталог, что весьма логично), то тоже не нужны - они должны быть затем установлены в систему.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Например, можно посмотреть на проекты Кевина Маклауда:
    https://incompetech.com/ требует только упоминания автора
    https://freepd.com/ музыка, перешедшая в общественное достояние (public domain)

    А вообще искать музыку royalty free, под public domain или под лицензиями Creative Commons (внимательно смотреть на конкретный тип, некоторые разрешают коммерческое использование, а некоторые нет).
    Ответ написан
    Комментировать
  • Как реализовать Mutual TLS?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сначала немного теории.

    CA - Certificate Authority - доверенный удостоверящий центр, который подписывает сертификаты.
    У каждой стороны есть секретный ключ, который она никому не показывает, и публичный ключ, он же сертификат. Чтобы подтвердить, что сертификат принадлежит обеим сторонам, эти сертификаты должны иметь подпись доверенного лица, в данном случае CA.

    Обычно мы привыкли, что в SSL только серверная сторона доказывает свою подлинность. Идея mTLS в том, что обе стороны должны предоставить свой публичный сертификат, подписанный CA. Тогда если сервер доверяет CA, он будет доверять и клиентскому сертификату.

    Но публичный ключ не имеет смысла без приватного. А в куске кода в вопросе он вообще не встречается.

    Итак, что нам нужно для установления сессии?

    1. Сертификат CA - kbs_ca.crt (скорее всего, можно склеить оба CA - промежуточный и корневой - в один файл);
    2. Приватный ключ клиента, который он будет использовать для шифрования - private.key;
    3. Соответствующий приватному публичный ключ-сертификат, который клиент будет сообщать серверу - public.cer.

    Я ввёл в гугл "php curl mtls" и в первой же ссылке есть пример кода: https://smallstep.com/hello-mtls/doc/client/php

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Распространённая ошибка: в качестве chat_id используется id пользователя. Естественно, получателем будет пользователь, а не группа.

    Правильно вместо этого:

    $chat_id = $data['message']['from']['id'];

    использовать это:

    $chat_id = $data['message']['chat']['id'];
    Ответ написан
    Комментировать
  • А можно ли создать скрипт, который добавить в html письмо что отследить папки пападания?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Почтовые клиенты принципиально не поддерживают javascript, так как это офигенная дыра в безопасности пользователя. Более того, приличные почтовые клиенты по умолчанию даже картинки с внешних ресурсов не скачивают, не то что скрипты.
    Ответ написан
    5 комментариев
  • Как пользоваться TTY?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В консоли раскладка клавиатуры грузится с помощью команды loadkeys, раскладки лежат в /usr/share/keymaps (в deb*untu их по умолчанию нет, надо доставить пакетом console-data).

    Шрифт в консоли устанавливается командой setfont, шрифты и таблицы кодировок лежат в /usr/share/console{fonts,trans} (тоже в пакете console-data).

    loadkeys и setfont устанавливают раскладку и шрифт до перезагрузки. Лучше этим не страдать, а использовать штатную настройку, в debubuntu это dpkg-reconfigure console-setup.

    Для использования мыши в консоли надо установить и запустить сервис gpm.
    Ответ написан
    Комментировать
  • Как ограничить частоту нажатий кнопки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Очевидно, запоминать куда-нибудь время последнего нажатия на кнопку и сравнивать его при очередном нажатии. Можно также при нажатии на кнопку убирать/изменять клавиатуру, но пользователь может успевать иногда нажать на кнопку 2-3 раза до исчезновения/изменения кнопки.
    Ответ написан
    6 комментариев
  • Что нужно для своего сервиса отправки смс?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если есть желание обслуживать свой сервис, то перспективнее стать клиентом одного из многочисленных агрегаторов, удобнее даже местного (подсмотрел, что в профиле автора вопроса Украина), чтобы проще было с оплатой и техподдержкой, но это необязательно, можно искать агрегаторов в том числе и в странах целевого трафика. Самому заключать договора с операторами кучи стран неразумно сложно. Во многих странах ещё и придётся озаботиться подключением к базам/сервисам MNP, что может доставлять в том числе регуляторные проблемы (могут не давать доступ иностранцам).

    Если задача стоит в перепродаже трафика смс от различных сервисов, то если речь не идёт как минимум о десятках миллионов смс в месяц, проще вступить в партнёрские отношения с каким-то другим сервисом и получать скидки за объём или агентскую комиссию.

    СМС для A2P (application-to-person) в целом стоят неразумно дорого, за счёт их цены операторы в том числе пытаются компенсировать снижение цен на услуги для частных лиц.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо применять один callback_data ко всем кнопкам! Именно callback_data и используется для определения, какая кнопка нажата.

    Например, можно назначить кнопкам call:1 ... call:9 и обрабатывать в зависимости от номера, а глобально ловить по тому, что call.data начинается на 'call:':

    if call.data.startswith('call:'):
        button_number = int(call.data[5:])
    Ответ написан
  • Почему возникает ошибка redirect url mismatch при social login google / facebook?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Facebook с некоторых пор требует, чтобы этот URL был https://, для localhost можно сделать с самоподписанным сертификатом (всё равно Facebook на него только redirect делает, проблема сертификата будет проблемой клиента). Когда мне такое потребовалось, для отладочных целей нашёл первый попавшийся докер с nginx+https и его применил для проксирования в реальное приложение.
    Ответ написан
    Комментировать
  • Как проверить работает ли бот или нет?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это невозможно - боты никак не могут общаться друг с другом.
    Ответ написан