• Какой подход правильный в описании docker-compose?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    1. Очень сильно зависит от задачи. Конечно, если точно не понимаешь, зачем это тебе нужно, то имеет смысл доверить настройку сети докеру. Но если надо, чтобы вместо bridge был macvlan со строго заданной сетью и конкретным parent-интерфейсом, то этим нас докер сам не обеспечит, если ему не подсказать.

    2. Тут больше проблема в том, что имена получаются длинными. Но если чётко знаешь свою инфраструктуру и запускаешь предсказуемые контейнеры в пределах данного хоста - почему нет? В конце концов, именование контейнеров может тоже быть частью инфраструктурного решения. Главное не запустить два проекта с пересекающимися именами - получится ах и ох с пересозданием живого контейнера.

    3. Это попытка бороться с довольно типичным подходом начинающих докероводов, которые обходятся "универсальным" контейнером, исполняющим любой php-код с внешнего каталога. Конечно, для быстрых экспериментов "ща я чёта сваяю и запущу для проверки" это даже не очень плохое решение, но при широком использовании такого подхода смысл докера существенно уходит: вместо готового к разворачиванию приложения мы имеем контейнер, который ничего не умеет и которому приходится самостоятельно пилить отдельную систему доставки самого кода. Вместо этого лучше сразу научиться и отладиться готовить полноценный образ. В конце концов, можно все приложения делать потомками этого супер-образа с php, что сделает их сборку довольно быстрой.

    4. Относительные пути - это как раз очень удобно для многих задач. Мы имеем каталог с проектом, в котором docker-compose.yml и все нужные данные. Размещение данных предсказуемо, точно видно, кто их использует, какой у них размер и всё такое. Удобно в случае чего перекидывать между серверами вместе с данными: просто погасил, rsync, запустил. Напротив, хранение данных в анонимных томах в /var/lib/docker с непонятными именами - это часто антипаттерн, при котором ценное место в /var заполняется чем-то непонятным, что толком невозможно идентифицировать. А использование имён может привести к той же проблеме, что и container_name - в разных compose-проектах имена пересекутся, и узнаешь это только тогда, когда уже сломается.
    Ответ написан
  • Можно ли узнать HypeSquad пользователя с помощью discord.py?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Комментировать
  • Как сделать APK file?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя просто так портировать интерфейс настольной программы в мобильное приложение. Там всё просто иначе устроено. Кроме того, скриптовые языки не очень удобны для мобильных приложений. Обычно на python делают с помощью Kivy (рекомендую ознакомиться и попробовать оценить на простых примерах).
    Ответ написан
    Комментировать
  • Как сделать рассылку юзерам телеграм-бота на python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно просто запустить другой скрипт, который создаст объект телебота с тем же токеном, но не будет использовать polling, а сразу вызовет send_message сколько нужно раз. Но надо не забывать про rate limit.

    PS: Почему тут каждую неделю спрашивают про рассылку ботом по списку? Неужели нет более интересных учебных задач?
    Ответ написан
    3 комментария
  • Почему не приходят OTP смс на номер Twilio?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, на номера Twilio шлют смс вовсе не операторы. Приложения и сервисы не используют сети операторов для доставки. A2P (application-to-person) SMS работают не так. Для этого используются специальные интеграции, промышленным стандартом здесь является протокол SMPP. Как правило, конкретный сервис пользуется услугами некоторого поставщика-агрегатора, в которого может посылать не только посредством SMPP, но и каких-то других протоколов. Но в дальнейшем агрегатор пошлёт уже по SMPP либо конечному оператору, либо другому посреднику. Интегрироваться напрямую со всеми операторами мира попросту нереально, их в России десятки, в США сотни, а сколько в целом по миру уже невозможно посчитать. При этом нельзя никогда узнать, пойдёт ли SMS из конкретного агрегатора напрямую конечному оператору или другому посреднику (и в целом невозомжно узнать, сколько посредников вообще будет по дороге). На любой стадии цепочки может что-нибудь глючить или работать недостаточно достоверно.

    Кроме того, любая стадия цепочки может что-то зарезать по своему усмотрению: по текстам, по номерам, по источнику трафика (с каким system_id поступило сообщение). В конце концов, во многих странах весьма сложные правила и технические условия. Например, в Индии максимальная длина альфанумерического имени 6 символов, а в России 11, во многих странах или у отдельных операторов имена должны предварительно регистрироваться (могут быть платны или бесплатны, могут требовать или не требовать документальных подтверждений на товарный знак). В некоторых странах мобильные сети в принципе не поддерживают альфанумерические имена (например, в США), и там необходимо делать подмену на цифровое, которое в дальнейшем не всякий оператор пропустит.

    До кучи, некоторые номерные ёмкости могут намеренно блокироваться, как используемые для целевой регистрации аккаунтов без наличия физической сим-карты. Например, на некоторые сервисы аренды номеров WhatsApp принципиально не отправляет SMS, даже если соответствующий номер никогда не использовался.

    Ссылаться на успешное хождение SMS между обычными абонентскими устройствами нельзя, так как обычные SMS могут ходить по SS7, что для A2P SMS вообще невозможно. Даже если найти за деньги или в даркнете дырку в сеть SS7 у какого-нить африканского оператора, то доставки не будет вообще или её качество будет ужасным (насколько помню, для России лет 5 назад доставка не превышала 40%, сейчас скорее всего ещё хуже).

    С вопросами о неработе следует обращаться в техподдержку конкретного сервиса. Пусть они пушат своего поставщика, а тот по цепочке добивается у своих партнёров.
    Ответ написан
  • Не работает код, ошибок нет, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Зачем тут вообще вызывать get_channel? Быстрее и нагляднее будет проверка:

    if ctx.channel.id == 7тут айди канала:

    Обычно даже тривиальные команды не работают, если есть обработчик on_message, что с этим делать в официальным FAQ описано первым же пунктом: https://discordpy.readthedocs.io/en/stable/faq.htm...
    Ответ написан
    Комментировать
  • Как отправить сообщение боту от имени пользователя?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, потребуется использовать клиентский API (MTProto). https://core.telegram.org/#getting-started

    Библиотеки tdlib, для python - telethon или pyrogram, для других языков см. гугл.
    Ответ написан
    Комментировать
  • Как создать канал которому можно отправлять анонимные истории?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Технически гарантировать анонимность нельзя. Бот всегда видит имя и id пользователя, который ему пишет.

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

    Как вариант, можно предложить пользователям оставлять истории в стороннем источнике, а в бота присылать ссылку. Например, пусть постят на pastebin.com и присылают ссылку на него. Правда, это довольно замороченно и неудобно, люди будут путаться или даже вообще решат не связываться.
    Ответ написан
    3 комментария
  • В чем разница между Client и Bot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Обычно бот создаётся либо как экземпляр класса discord.Client, либо как порождённого от него класса discord.ext.commands.Bot. Как называть переменную, в которую будет присовоен этот экземпляр - вопрос вкуса.
    Ответ написан
    Комментировать
  • Как получить ответ от сервера в читабельной кодировке (utf-8)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    \uXXXX - это вполне валидные с точки зрения json unicode-символы. Модуль json делает их по умолчанию, чтобы не делал, надо json.dump/json.dumps передавать параметр ensure_ascii=False:

    >>> print(json.dumps(["Превед!"]))
    ["\u041f\u0440\u0435\u0432\u0435\u0434!"]
    >>> print(json.dumps(["Превед!"], ensure_ascii=False))
    ["Превед!"]
    Ответ написан
    Комментировать
  • Как убрать дробную часть, не округляя число?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Самый лёгкий способ безо всяких приведений к строке: умножить на 10, округлить вниз, разделить на 10.

    x = 0.19123809523809523
    y = math.floor(x*10)/10
    print (y) # 0.1


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

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    К сожалению, нет.

    Можно попробовать сфотографировать и применить OCR :) Но, скорее всего, результат будет так себе...

    В принципе, старые телефоны умели хранить СМС на сим-карте, но даже в таком случае переставлять сим-карту в другое устройство (например, модем) - так себе решение. И проще было бы тогда принимать СМС сразу в модеме.
    Ответ написан
  • Traceback (most recent call last): File "botrun.py", line 14, in Как исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Он же всё пишет:

    discord.errors.PrivilegedIntentsRequired: Shard ID None is requesting privileged intents that have not been explicitly enabled in the developer portal. It is recommended to go to https://discord.com/developers/applications/ and explicitly enable the privileged intents within your application's page. If this is not possible, then consider disabling the privileged intents instead.

    При создании бота запрошены privileged intents, но они не были включены в Developer Portal. Их надо включить, либо (что лучше) убрать из кода intents до тех пор, пока они не будут действительно нужны.
    Ответ написан
    1 комментарий
  • TypeError: __init__() missing 1 required positional argument: 'command_prefix' Как исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Параметр называется command_prefix, а не commands_prefix.
    Ответ написан
    3 комментария
  • Как сделать, чтобы из под любого пользователя создавались файлы и папки с определённой группой?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно использовать SGID (написали выше).

    Можно использовать default ACL, примерно так:

    setfacl -m g:developers:rwx -m d:g:developers:rwx -R /var/www/html
    setfacl -m u:www-data:rx -m d:u:www-data:rx -R /var/www/html
    setfacl -m u:www-data:rwx -m d:u:www-data:rwx -R /var/www/html/uploads


    Тогда для указанных пользователей и групп будут применяться доступы из ACL, а для новых файлов/каталогов - из default ACL.
    Ответ написан
    Комментировать
  • Как запустить нескольких ботов на одном скрипте через webhook?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно поднять веб-сервер, который будет обрабатывать ссылки навроде /bot-callback/токен-бота, а при создании бота делать setWebhook с его токеном и правильным callback. В обработчике коллбэка по токену определять бота, а затем вызывать от соответствующего инстанса бота в Своей Любимой Библиотеке функцию обработки событий (например, в телеботе это метод process_new_updates).

    Старая история
    Был такой вопрос https://qna.habr.com/q/943325

    В нём есть ссылка на уже несуществующий пример с использованием aiogram, где из URL брался токен, а дальше это обрабатывалось каким-то кодом типа:

    with bot.with_token(parsed_token) as bot1:
      ... действия с bot1


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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это нельзя сделать. В библиотеке можно авторизоваться только по токену и никак иначе. Дискорд при авторизации может показать капчу, поэтому по логину-паролю войти нельзя.
    Ответ написан
    Комментировать
  • Ошибка в коде,как исправить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Поскольку login - это метод класса, то в него передаётся неявно параметром сам экземпляр класса (параметр self):

    async def login(self, token, *, bot=True):

    То есть, фактически, этот метод неявно вызывается как login(client, '**', '376...').
    Ответ написан
  • При попытке чтения каталога ls /root процесс зависает, как починить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По умолчанию ls не только читает каталог, но и делает stat на каждый файл, чтобы цветом показать их тип и executable bit. Это очень замедляет процесс.

    Обойти вызовом ls без параметров, заданных в alias ls:

    $ alias ls
    alias ls='ls --color=auto'
    $ ls # вызывает алиас
    $ 'ls' # вызывает обычный ls без параметров


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

    'ls' /root > /tmp/list_of_files
    less /tmp/list_of_files


    Удалить файлы проще всего с помощью find:

    find /root -name 'index.html.*' -delete
    Ответ написан
    2 комментария