Задать вопрос
  • Как называется специальная ячейка памяти в pytelegrambotapi?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Думаю, речь не про "ячейку памяти", а про register_next_step_handler.
    Ответ написан
  • Как исправить ошибку No module?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Разумеется, если в sys.path добавить каталог flaskr/live, то это не поможет найти в нём web. Надо добавлять flaskr.

    Проще запускать скрипт из вышестоящего каталога (python live/LiveScanner.py).

    upd: Посмотрел внимательнее, flaskr/web вообще не содержит подкаталогов, а live/apiLiveData.py находится в flaskr/, а не в flaskr/web. Думаю, надо начать с наведения порядка в этом хозяйстве.
    Ответ написан
    5 комментариев
  • Как сделать так, чтобы бот игнорировал ошибку, связанную с лс, и продолжал выполнять команду?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как и всегда, исключение можно поймать и обработать, например, проигнорировать или выполнить какие-то альтернативные действия.

    try:
        await member.send("Привет!")
    except disnake.ext.commands.errors.CommandInvokeError:
        print(f"Написать {member} не удалось")


    Но вообще спамить в ЛС - это ненормальный сценарий использования Discord API, и за это бота могут заблокировать. Правильнее писать в каналы, для чего имело смысл с самого начала заложить в бота понятие "канал для уведомлений", чтобы все пользователи бота его заранее настроили на своих серверах.
    Ответ написан
    1 комментарий
  • Почему не работает aiogram, когда создаёшь виртуальное окружения?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что в виртуальном окружении по умолчанию ничего (почти) нет. Надо доустановить с помощью pip всё необходимое.
    Ответ написан
  • Telegram: как передать текст в callback?

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

    Во многих библиотеках для этого есть поддержка FSM (FSM - Finite State Machine - конечный автомат). В php-библиотеках я не очень разбираюсь, но можно поискать в сторону "название библиотеки FSM", либо в библиотеке уже есть своё решение этой задачи, либо кто-то уже наверняка над этим задумывался раньше, так что можно найти примеры подобного. В конце концов, написать самому под свои задачи.
    Ответ написан
  • Телебот forward_message как скрыть автора?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Что мешает вместо форварда просто отправить такое же сообщение с идентичным содержанием от имени самого бота?

    В доках метод клиентского апи, не Bot API. Нетрудно видеть, что в Bot API нет аналогичного параметра https://core.telegram.org/bots/api#forwardmessage
    Ответ написан
  • Можно ли разместить 2 почтовых сервиса с разными доменами на одном хостинге/сервере?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Так он пишет в чём проблема: одновременно делаются несколько вызовов getUpdates. Обычно это означает, что с одним токеном запущено больше одного бота.

    Хотя если судить по предыдущим ошибкам, возможно проблема сетевого доступа до Telegram.
    Ответ написан
  • На 25 строчке при 2-ом повторении выдаёт NonType, почему и как поменять на int?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо так делать. Метод append изменяет список (добавляет в него элемент) и не возвращает никакого значения (или, что то же самое, возвращает None). То есть в результате такой записи мы добавляем элемент в список, а дальше этот список моментально выкидываем на помойку.

    week[g] = week[g].append(subj[gm])
    Ответ написан
    Комментировать
  • Как искать шрифты CC0 1.0?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я ввёл CC0 fonts в поисковик и на первой же странице нашёл сайт с поиском по лицензии:

    https://fontlibrary.org/en/search?license=CC-0&order=

    Думаю, поиск можно продолжать дальше.
    Ответ написан
  • Задача по математики из 5-го класса которая завела меня в ступор?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка в первой же строке: 97300+авто+2гаража не равно 355600, потому что на самом деле авто+гараж=355600. То есть тут в левой части фактически стоимость двух автомобилей написана была.

    Под арифметическим решением тут видимо подразумевается следующее: три гаража стоят 355600 минус 97300.
    Ответ написан
  • Почему тг бот обрезает сообщение?

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

    Проблема заключается в том, что & является разделителем аргументов GET-запроса. На первом же & в тексте будет считаться, что значение параметра text закончилось, а дальше идёт следующий параметр.

    Чтобы этого не происходило, надо заменять & на %26. Пробел надо менять на +, + менять на %2B, и это далеко не всё, с чем можно столкнуться. В частности, символ # в некоторых применениях является ссылкой на якорь на странице, и http-клиент (например, браузер) не будет передавать в запросе ничего, начиная с этого символа, если его не заменить на %23.

    Чтобы это решить в данном случае, наиболее удобный способ - это передать параметры отдельным аргументом params метода requests.get, чтобы библиотека requests сама грамотно разрулила все необходимые замены. Но если это недоступно для решения какой-то другой задачи - искать как выполнить соответствующее преобразование надо по ключевым словам urlencode/urldecode.
    Ответ написан
    Комментировать
  • Бот должен при команде /photo сохранять присланное после команды фото в одну папку, а при /photo1 в другую?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо внутри одной функции объявлять другую. Это не будет работать, вообще никак! Результатом будет дописывание в список хендлеров новых обработчиков, а так как условия в них уже описаны в других обработчиках, то эти никогда вызваны не будут.

    Также при такой записи "внутренний" обработчик будет создаваться каждый раз заново. Короче, вытащить на верхний уровень, дать им другие имена и никогда так больше не делать.

    В данном случае для решения задачи нужно использовать FSM. В telebot есть очень простая в использовании реализация FSM на основе вызовов register_next_step_handler пример.
    Ответ написан
  • Как вызвать exception еще раз после его срабатывания?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Зачем так сложно? Делаем цикл по числу попыток, как только получаем успешный результат - делаем break и завершаем цикл досрочно. Можно даже обернуть это в функцию, тогда в основном коде не будет всей этой магии с циклом, код будет выглядеть более наглядным.

    def get_data(Китай, max_attempts=MAX_ATTEMPTS_DEFAULT):
        for attempt in range(1, max_attempts+1):
            try:
                submit = requests.post(Китай).json()
            except requests.exceptions.ConnectionError:
                continue
            if submit['success']:
                return submit
        return {'success':false, 'error':'attempts exceeded'}
    Ответ написан
    Комментировать
  • Что сделать, чтобы bot ловил handler в отдельном файле?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Зачем импортировать dp из всех файлов без разбору? В реальности будет импортирован последний, остальные будут импортированы впустую. Потому что следующий from импортирует другой dp и по имени dp будет доступен уже другой объект из другого модуля.

    Объект dp надо создать один раз в одном месте. В принципе, можно потом его потенциально импортировать куда угодно.

    Если хочется некоторой модульной структуры, то можно сделать в каждом модуле функцию навроде register_all_handlers(dp) и в ней делать https://docs.aiogram.dev/en/latest/dispatcher/inde.... Соответственно, после импорта всех модулей с хендлерами можно вызвать эту функцию от всех модулей:

    Примерно так
    import menu_commands
    import admin_commands
    import message_handlers
    
    dp = создаём_свой_Dispatcher
    
    menu_commands.register_all_handlers(dp)
    admin_commands.register_all_handlers(dp)
    message_handlers.register_all_handlers(dp)
    Ответ написан
    Комментировать
  • Как решить проблему с заморозкой цикла на Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Надо просто понимать, что asyncio - это не многопоточность (хотя и указан этот тэг в вопросе). Это один процесс, который выполняет только одну задачу в каждый момент времени. И переключает он задачи только тогда, когда какая-то из них запускает операцию ввода-вывода или что-то ещё подобное (например, asyncio.sleep).

    Например, если мы сделаем запрос к базе данных (с асинхронной библиотекой работы с этой базой обязательно! например, вместо sqlite3 используем aiosqlite), то пока база данных думает над ответом, скрипт может переключиться к какой-то другой ожидающей выполнения задаче. Когда база ответит, то цикл событий (event loop) вернёт управление задаче, которая сделала запрос к базе.

    В приведённом примере кода есть два места, которые могут быть узкими:

    1. Функция logic может быть и объявлена async, но если она делает чисто вычислительные операции без ввода-вывода (асинхронного), то в процессе её работы никогда не будет переключения на цикл события и, как следствие, не будут выполняться другие задачи. Даже если их собственный ввод-вывод уже совершился и задачи могут быть продолжены.

    2. Сама работа с базой может также блокировать цикл событий.

    Например, пусть logic работает 10 секунд, а dbase.search_in_queue - 5 секунд, и обе они содержат только синхронный код. Тогда пока выполняется dbase.search_in_queue свои 5 секунд, не будет выполняться logic, и наоборот.
    Ответ написан
    Комментировать
  • Почему не все переходы с других сайтов попадают в лог apache2 access.log?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В первую очередь проверить, что на исходном сайте не используется rel=noreferrer.
    https://developer.mozilla.org/en-US/docs/Web/HTML/...
    Ответ написан
  • Как проверить открытие письма?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Из соображений безопасности открытие ресурсов по внешним ссылкам многие почтовые клиенты и почтовые сервисы не делают вообще. Тем более когда речь явно идёт о картинке размера 1x1, которую могут игнорировать намеренно (лучше уж тогда не указывать размеры, пусть клиент скачает картинку эту 1x1 и узнает размер только после этого).

    Надо понимать, что E-mail - это канал с негарантированной доставкой до получателя без шансов проверить факт доставки/прочтения. Письмо может вообще не дойти до получателя, может дойти до "Спама", может дойти но сразу пойти в под нож - но мы об этом не узнаем. Все эти пиксельные картинки, оборачивания ссылок в персонально трекируемые, "запрос подтверждения" - всё эти попытки хоть как-то обойти эти ограничения всё равно ни к чему получателя не обязывают. Получатель может всё это полностью проигнорировать.

    Или, как вариант, картинку почтовый сервис получателя может скачать заранее и положить в кэш, что также ничего не означает о получении письма. Её также может скачать антивирус почтового сервиса или получателя, чтобы проверить.

    Я всегда принципиально отказываюсь от всех подтверждающих получение действий и фокусов, потому что если отправитель ПОЛЕНИЛСЯ приаттачить все картинки к письму - то значит я посмотрю на его письмо без картинок и по ссылкам переходить не буду вообще. Не заслужил. Ничего ценного в таких письмах я ещё ни разу не видел.

    Единственное, для чего все эти средства помогают - примерно оценивать степень прочтения в сравнении с предыдущим опытом. Скажем, вчера письмо прочитало 30% получателей, это может означать что его прочитало, например,на самом деле 60%, но лишь половина подвержена трекингу. А если сегодня прочитало 10%, значит, что-то случилось: письмо хуже дошло до получателей, письмо хуже привлекло их внимание... (Все цифры, конечно, от балды, они имеют иллюстративный характер)

    Да и вообще, в наше время почту читает всё меньше людей.
    Ответ написан
    Комментировать
  • Можно ли получить значение callback_data при реплае?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По-моему, тут типичная попытка решить простую задачу дурацким способом.

    Пользователь получает сообшение с inline-кнопкой. Вот пусть он эту кнопку и нажмёт, а бот получит в callback_query_handler событие с callback_data и обработает. Зачем ещё какое-то цитирование?

    Или тут попытка в кнопке хранить данные, которые при цитировании ещё и якобы можно будет достать? Сама идея дурацкая. Если надо к сообщениям хранить какие-то данные, то их надо хранить в самом боте: в базе данных, в хранилище FSM, да хотя бы in memory в переменных.
    Ответ написан
    Комментировать
  • Сможет ли Ansible вот такое?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Большинство вещей - без проблем. Например, можно использовать таск authorized_keys для аккуратного прописывания ключа вместо ручного его закидывания на сервер. Есть таски для создания пользователей и групп, установки софта, копирования файлов и создания их по шаблону...

    Некоторые вещи можно делать косвенным путём, копируя и генерируя конфиги, запуская свои кастомные команды через таск shell, итд итп. Например, конфигурить sudo можно через создание файла с нужным содержимым в /etc/sudoers.d, не трогая основной конфиг.

    В общем, даже если останутся некоторые задачи, которые ansible не сможет автоматизировать достаточно хорошо, во всём остальном он очень сильно облегчит сопровождение серверов, особенно подготовку новых.
    Ответ написан
    Комментировать