• Как ограничить частоту нажатий кнопки?

    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
    Сисадмин, просто сисадмин...
    Это невозможно - боты никак не могут общаться друг с другом.
    Ответ написан
  • Где можно собрать команду для разработки игры?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Проекты, в которых никто никому не платит и не имеет никаких обязательств, взлетают крайне редко. Чаще всего попытки провернуть подобное заканчиванются на быстром выгорании участников, их нежелании делать свои части вовремя, постоянном блокировании общего процесса разработки несделанными задачами... Потом начинается текучка, попытка найти других на замену, те долго пытаются въехать в процесс, начинают всё перекраивать под свои собственные представления...

    Подобное наблюдается постоянно. Игроделанием никогда не увлекался, но могу пояснить на примере переводов.
    Пояснение
    Скажем, было много проектов по бесплатному переводу фильмов/сериалов/аниме/книг, но в основном выживают только те, которые собирают донаты на возмещение участникам проектов или даже прямо продают части переводов (последние главы, ранний доступ итд). И это вполне понятно. Одна серия аниме (они всего по 20 минут чистого времени) содержит 200-400 фраз. Даже если взять готовые субтитры на другом языке и тратить на одну фразу 30 секунд (это безумно мало, хватит только на очень черновой перевод), на одну серию уйдёт 2-4 часа. Далее это надо отсмотреть минимум дважды, исправляя ошибки (ещё как минимум час). В итоге на серию вполне может уйти полноценный рабочий день. Серии выходят раз в неделю, получается, что для ведения всего лишь 5 сериалов придётся работать в этой сфере практически full time. Готовые серии надо сдавать редактору, который потратит может и чуть меньше времени, но всё равно немало. Вопрос времени и сложности озвучивания, вопрос тайминга с нуля и перевода со звука оставим за кадром.

    Для киносериалов в уме умножаем всё на два (серии 40 минут). Для книг оценку дать сложнее, но в целом там обычно объём на уровне 200-600 предложений на главу, которые ещё и более длинные, чем фразы в субтитрах. И в книгах могут быть сотни и тысячи глав, в отличие от сериалов, где нормальная длина - это 13/26/52 серий (сезон 3 месяца/полгода/год), поэтому непрофессиональные бесплатные книжные переводы вообще могут несколько раз сменить переводчика.

    Группа переводчиков, в которой я когда-то состоял, выгорела менее чем через 2 года по причине потери энтузиазма её лидера (и да, он тогда подсел на Lineage2). Без локомотива, бегающего за всеми и пинающего по любым задачам, группа быстро сдулась. Но и без этого разные участники группы постоянно снижали/полность теряли активность. Ибо неспроста рабочее время всего лишь 8 часов в сутки - людям очень тяжело работать больше.


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

    Но если всё же хочется найти единомышленников, то искать их, возможно, надо не в профессиональных сообществах, а в узкотематических. Скажем, для игр в тематике SCP Foundation имеет смысл покопаться в соответствующих группах, где могут найтись энтузиасты, готовые нарисовать объект [ЗАСЕКРЕЧЕНО] на территории [ДАННЫЕ УДАЛЕНЫ] для заинтересованного в тематике программиста, рисующего как курица лапой. Но в целом шансы сделать что-то больше короткого прототипа я бы и там оценивал как невысокие.

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

    PS
    PS: От себя могу сказать, что я давно делаю проекты для души в одиночку, потому что понимаю, что и сам могу очень сильно тянуть со сроками. Скажем, я три года назад написал рендеринг карты от одной онлайн игры (на основе реверс-инжиниринга веб-клиента игры), но так как я писал это всё в экстренном темпе буквально за неделю, получился адский говнокод с кучей глюков и недоработок. И вот только спустя три года я добрался наконец до того, чтобы за два месяца вялого переписывания с нуля (даже не рефакторинга) в свободное время я наконец всё это переделал (дополнительно меня мотивировало появление в игре двух новых карт). Всего там менее 700 строк кода... А если бы я участвовал в каком-то проекте и выполнял свою часть общей задачи не по три года, а даже и по два месяца?
    Ответ написан
    1 комментарий
  • Как будет взломан алгоритм с генерацией бесконечного ключа шифрования?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если есть алгоритм генерации бесконечного ключа K(n) (n - порядковый номер элемента ключа) с заданными параметрами, взломщик будет перебирать значения параметров, пытаясь применять сгенерированный ключ к шифрованному тексту. Полученное проверяется на текстовую валидность. Когда получится нормальный естественный текст - ключ взломан.

    Например, пусть параметры p и q, алгоритм K(n)=p^n mod q, тогда взломщик просто устроит перебор значений (p; q) от (0; 0) до бесконечности.

    Или пусть алгоритм будет K(n)=цифра числа пи "n+p", где p - параметр ключа. Тогда будем делать перебор значений p. Это будет довольно быстро, ведь нам надо будет просто последовательно генерировать цифры числа пи, помнить последние $длина_шифротекста символов и проверять их применимость как ключа.

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

    Собственно, чтобы подобный алгоритм имел хоть какой-то смысл, надо, чтобы поиск этих самых параметров p и q был безумно сложным. Если можно проверять миллион вариантов ключа в секунду, то для криптостойкости потребуется, чтобы требовались даже не миллиарды, а как минимум триллионы секунд перебора. Ведь миллиард секунд - это жалкие 8 лет, если взять тысячу вычислителей, то 8 лет превратятся в месяц. а при 30 тыс. - в сутки.

    Любой дискретный шифр с известным или предполагаемым алгоритмом ломается перебором. Даже хрестоматийный весьма стойкий RSA ломается. Защита данных дополнительно обеспечивается сменой ключа, алгоритмами Диффи-Хеллмана, реализацией PFS итд итп.

    Есть ещё одно обстоятельство. Пусть у нас есть шифр простого сдвига с бесконечным неизвестным ключом, такой чёрный ящик, выдающий шифротекст. Тогда если подать на вход ящику сплошные нули, на выходе он будет выдавать ключ. Чем больше нулей подать, тем больше элементов ключа будет раскрыто. С xor такая же фигня. С нормальными шифрами это, разумеется, не прокатывает.
    Ответ написан
    Комментировать
  • Как прописать код на питоне для настройки кнопок бота телеграмм?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Бот никак не может получить список чатов, которые ему доступны. Нужно было сохранять их самому куда-то.
    Ответ написан
    Комментировать
  • Как реализовать регистрацию пользователя из чата telegram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Обычная практика - держать в памяти кэш пользователей. При изменениях также выполнять запрос к базе. При запуске бота - вычитывать пользователей в память.
    Ответ написан
    Комментировать
  • Aiogram | как сделать ввод в чат пользователя по кнопке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это называется inline mode, надо включить его у BotFather и сделать в боте inline query handler.

    Также см.
    https://core.telegram.org/bots/api#inlinekeyboardbutton
    параметры switch_inline_query и switch_inline_query_current_chat
    Ответ написан
    2 комментария
  • Могут ли силовики читать сообщения с мессенджеров с использованием СОРМ?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если пользователь задаёт такой вопрос, то он, скорее всего, не включил двухфакторную авторизацию и не использует секретные чаты, а Телеграм у него зареган на свой собственный российский номер на своё собственное имя. Силовики просто сделают сброс пароля, получат у оператора содержимое смс и залогинятся тобой, затем автоматизированно скачают всю твою переписку для анализа. На всё про всё потребуются считанные минуты, и если это сделать посреди ночи, ты даже ничего не успеешь заметить. И никакое шифрование не спасёт.

    Ну а если тебя поймают с телефоном в руках, то можно будет просто открыть твой Телеграм и прям на нём проверить твои переписки.
    Ответ написан
    2 комментария
  • Как в TeleBot сохранять сообщения пользователя в определенный момент его действий?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Используй декоратор bot.callback_query_handler.

    @bot.callback_query_handler(func=lambda call: True)
    def my_handler(call):
        # call.data - содермое callback_data кнопки
        # call.message - исходное сообщение с кнопкой
        # call.message.from_user - отправитель исходного сообщения
        # call.from_user - нажавший на кнопку пользователь
        # call.message.chat - чат, в котором всё происходит
    Ответ написан
    Комментировать
  • Как написать расширение для браузера в виде dll?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вопрос выглядит как типичная XY problem. Нужно исходить из реальных практических задач и под них искать инструменты, которые помогают их решить. Скажем, если нужно вырезать из страницы баннеры и кнопки интеграций фейсбука, добавить какие-то отсутствующие на сайте client-side функции (такие, как управление скоростью воспроизведения в тэге video), то это одни инструменты. Если надо автоматизированно без участия пользователя нажимать на кнопки, переходить по ссылкам, сохранять полезное содержимое страниц - другие. Если надо отслеживать актуальность сертификатов или контролировать доступность камеры - третьи и четвёртые. Кстати, для последнего в браузерах уже давно есть защита - никакому сайту не даёт получать доступ к камере без явного разрешения пользователя.

    Далее, dll - это всего лишь формат загружаемых библиотек с возможностью вызова функций из них. Их кто-то должен куда-то загружать и как-то вызывать. Выбрать сразу dll без чёткого указания того, кто и как их будет использовать - это уже сразу неправильно. Конкретно в случае браузеров в принципе нет никакого интерфейса для взаимодействия с ними (NPAPI и PPAPI вроде уже наконец похоронили вместе с флешом [upd: NPAPI полностью удалён в Chrome 45 и Firefox 85, PPAPI в Chrome тоже планируется удалить]), не говоря уже о том, чтобы вызывать эти функции вообще при каждом чихе браузера.

    Зачем в вопросе указаны три языка программирования? Это, кстати, нарушение правил сайта, так как вопрос к этим языкам ну вообще никак не относится. И да, если в браузерах принято использовать javascript, значит, надо использовать javascript. Если в научном мире принято говорить на English, а в медицине используется латинский, то нет смысла в них пользоваться суахили назло всем.
    Ответ написан
    Комментировать
  • Как отправить документ больше 50-ти мегабайт?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В боте (aiogram) надо сделать сохранение куда-то списка текущих запросов (chat_id - запрос). Также сделать обработчик сообщений с content_type видео, который будет получать видео от юзербота, находить по нему в списке запросов chat_id, в который затем отсылать видео по file_id.
    Ответ написан
    Комментировать
  • Как распространять приложение под linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я не знаю, почему все так активно советуют собирать пакеты. Надо начать с того, что в Linux никогда не было принято использовать pyinstaller... почему? Потому что в Linux python идёт из коробки. В Windows сложно вынуждать пользователей устанавливать интерпретатор языка и все зависимости, тут же с этим проще гораздо.

    Так что можно просто распространять архив с приложением и инструкцией по запуску вида:

    virtualenv -p python3 env
    . env/bin/activate
    pip install -r requirements.txt
    ./app.py
    Ответ написан
    2 комментария
  • Согласование архитектур в Linux?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, конечно, Linux поддерживает кучу архитектур, но код для архитектуры mipsel нельзя запустить на armhf. Поэтому проблемы именно "кучи" нет - никто не использует программы, которые всё равно не запустятся.

    Есть проблема только с поддержкой совместимх архитектур x86 и x86_64. В результате в основном пришли к тому, что есть /lib|/usr/lib|/usr/local/lib и /lib64|/usr/lib64|/usr/local/lib64 или такие же с lib32|lib или даже ортогональный им lib32|lib64 для библиотек, а для бинарников такой проблемы нет, потому что какая разница, будет ли единственный файл /usr/bin/program 32-битной или 64-битной приложенькой? В крайнем случае в имя программы можно добавить 32 (или даже -x86|-x86_64) на конце.

    С учётом того, что в LINUX можно положить библиотеки в /foo/bar, а исполняемые файлы в /lorem/ipsum и разрулить это с помощью PATH и ld.so.conf, можно сделать вообще как душе угодно. Не забываем также, что в грамотно организованной и правильно администрируемой системой всё по возможности ставится из пакетов. Поэтому каждый файл учтён, ничто не будет перезаписано при установке/обновлении.
    Ответ написан
  • Где в моём коде ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет работать. После отправки сообщения "Вам есть 18?" в переменной message не появится нового сообщения. И вообще, надо привыкать, что боты работают по событиям. Нажатие на кнопку - это новое событие, которое сделает новый вызов обработчика.

    Для таких задач лучше использовать FSM пример https://github.com/eternnoir/pyTelegramBotAPI/blob...
    Ответ написан
    Комментировать
  • Из-за чего возникает ошибка и как исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    При вызове all_stories происходит промотка StringIO на конец виртуального "файла", и второй запуск all_stories() получает пустой список. Тут же all_stories() вызывается каждый раз в get_storie заново.

    Проще с самого начала хранить тексты не в не StringIO, а в list:

    stories = ["История 1", "История 2"]
    stories.append("А также история 3")
    Ответ написан
    Комментировать
  • Как работать в с клавиатурой в телеграм боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Использовать gettext(i18n). Например, для aiogram даже есть готовый middleware: https://docs.aiogram.dev/en/latest/examples/i18n_e...
    Ответ написан
    Комментировать