• Как удалить кнопку из клавиатуры telebot?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя удалить одну кнопку. Можно либо удалить всю клавиатуру целиком, либо отправить другую клавиатуру на замену. Соответственно, для удаления всего одной кнопки нужно помнить, какую клавиатуру отправлял в прошлый раз (хранить это явным образом или определять из контекста), чтобы отправить новую клавиатуру без этой кнопки.
    Ответ написан
    Комментировать
  • Пытаюсь запросить данные из MySQL через PHP. Где ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В чём глубокий смысл перезатирать $link результатом запроса?

    $link = mysqli_query($link, "SELECT * FROM 'table-name' WHERE USER_ID = 1620");


    Я уж не говорю о том, что дефис в имени таблицы это чересчур...
    Ответ написан
    Комментировать
  • Как использовать слэш команды в дискорде с помощью бота?

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

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

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лучше всего, конечно, выносить общую часть функционала в отдельную функцию. Например, пусть в обработчике /start информация о пользователе добавляется в базу и отправляется приветственное сообщение с какой-нибудь справкой по использованию. Скорее всего, повторно добавлять в базу не надо, а вот приветственное сообщение можно и выделить в какую-нибудь send_welcome_message (естественно, с параметром chat_id и при необходимости другими параметрами, нужными для её работы). Типа, пользователь запустил бота, поотвечал на вопросы, потом получил опять приветственное сообщение с информацией о своей работе, которую пользователь уже успел забыть, пока заполнял анкету.

    Но если прям очень хочется, то можно вызвать функцию напрямую. Но если она обёрнута декоратором, то её вызвать напрямую может быть опасно, так как после применения декоратора это будет уже другая функция, которая имеет право создавать какие-нибудь спецэффекты при своём запуске. Если регистрировать без декораторов, вызовами register_message_handler, то исходная функция изменяться не будет, но с декораторами можно писать более красиво.
    Ответ написан
    Комментировать
  • Как правильно выполнить проверку ФС?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По умолчанию при монтировании файловой системы ставится флаг dirty (для тех, которые имеют поддержку такого флага, а обычные fs для Linux все имеют), а при размонтировании снимается. Если dirty не установлен, то fsck при простом запуске (без дополнительных параметров при запуске из командной строки или через флаг в fstab) не выполняет фактическую проверку файловой системы (точнее, всё же выполняет иногда - через определённое количество монтирований или по прошествии некоторого количества месяцев, но это отдельная настраиваемая история). Просто сразу пишет filesystem clean.

    Если отмонтирование не выполнено корректно (например, система была перезагружена без завершения как надо или флешка была резко выдернута), то fsck будет пытаться восстановить файловую систему. При этом на файловых системах с журналированием это может быть сделано достаточно быстро с помощью replay journal. Если же восстановить легко не получилось, то система выкинет в Shell с предложением прогнать fsck самому. В принципе, если файловая система ещё не превратилась в мелко нашинкованные макароны, это может пройти весьма успешно даже с жёсткими флагами fsck -f -y. Но тут уж пользователь сам берёт на себя ответственность.

    В общем, проверка файловой системы при запуске происходит по сложным правилам, в том числе на основе указанных в fstab параметров. Кроме того, с помощью fsck.*-параметров загрузки ядра (в данном слуаче через grub) можно явно попросить systemd изменить поведение по умолчанию и, например, принудительно проверить файловую систему, даже если она была отмонтирована корректно. Если эти параметры передать в загрузчик вручную через редактирование в самом grub при загрузке, то на последующие перезагрузки это изменение не повлияет.
    Ответ написан
    1 комментарий
  • Какие библиотеки позволяют писать и юзерботов и ботов телеграмм?

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

    Но даже с этой библиотекой придётся инициализировать двух разных ботов и организовывать между ними какое-то взаимодействие (что может вылиться в дополнительную не самую простую задачу). Например, боту требуется по запросу отправить большой файл, он из API userbot'а отправляет самому себе (обычному боту) файл, тот получает file_id и пересылает его конечному пользователю.

    Поскольку ботов фактически будет всё равно два, то они могут использовать и разные библиотеки. Например, aiogram и telethon или telebot (AsyncTeleBot?) и pyrogram.
    Ответ написан
    Комментировать
  • Можно ли управлять всей программой с помощью скриптового языка?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Пока бот выполняет time.sleep, он ниего не делает. Нужно использовать либо треды, либо asyncio (с асинхронным же asyncio.sleep).
    Ответ написан
    5 комментариев
  • Почему значение len(списка) не меняется в range?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что len(a) ситается в начале цикле и передаётся в range, который вызывается один раз и больше не вызывается повторно. Чтобы вызывался, надо вместо for использовать while с условием, а итерируемое значение явно увеличивать в каждой итерации цикла.
    Ответ написан
    1 комментарий
  • Requirement already satisfied?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это означает, что данная зависимость уже установлена, и даже написано что именно и какой версии. Очевидно, новой версии pip и pyinstaller нет, установлены самые последние. Никак реагировать не нужно, если всё и так работает.

    Что pyinstaller не работает... Ну, читать доку по нему. Скорее всего, где-то он не в %path% или его надо как-то иначе запускать.
    Ответ написан
    Комментировать
  • Можно ли восстановить бота в телеграмме после удаления у фазербота?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, только создать нового с аналогичными реквизитами.
    Ответ написан
    Комментировать
  • Как добавить двумерный массив в python заранее неизвестным количеством значении?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не массив, а list (список). Или даже dict (словарь), если хочется произвольные ключи.

    Можно в качестве элементов списка делать другие списки, создавая не то что многомерные массивы, а вообще развесистые деревья разнообразной глубины.
    Ответ написан
    Комментировать
  • Не могу найти ошибку в коде Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо ловить абстрактный Exception вообще никогда! Тем более игнорировать его и даже не выводить в консоль. Произошла ошибка, а какая, почему произошла - ваще непонятно.

    Какие тут могут случиться ошибки? Ну, например, если в user_dict нет записи с ключом chat_id, то случится KeyError. Или если в getRegData возвращается невалидный markdown-текст, то случится ошибка ApiException.

    А далее после обработки exception путём его игнорирования тут снова вызывается register_next_step_handler, который приводит к тому, что вводимые пользователем данные снова попадают в тот же обработчик и - вероятно - натыкаются на ту же самую ошибку. Например, KeyError: конечно, ведь как при прошлом запуске этого обработчика не было значения с таким ключом, так и при последующих не появится.

    До кучи, не надо вызывать постоянно bot.get_me(). Это каждый раз будет вызов API. Неужели имя бота меняется каждую минуту? Достаточно запомнить при запуске бота - и достаточно.
    Ответ написан
    Комментировать
  • Как отправить сообщение от лица бота в чат где он состоит?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И в чат так же можно, если у бота есть доступ к написанию сообщений в группу и в качестве chat_id передан правильный id чата.
    Ответ написан
  • Как преобразовать property в dict (Python)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    event_json = HttpRequest.read()
    Ответ написан
    8 комментариев
  • Как сделать формать получаемой информации из вебхука читаемым(например, конвертировать его в json)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Данные в запросе имеют тип bytes, а не str.

    data = json.loads(request.body.decode())
    Ответ написан
  • Как создать бота для discord на python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть целый ряд библиотек на Python с реализацией Discord API, но почти всеми никто не пользуется, за исключением одной - discord.py. Библиотека настолько хороша, что весь интернет усыпан примерами и решениями именно с её использованием, а про другие никто и не знает почти. К сожалению, автор забросил разработку по личным причинам, но есть форки, идентичные натуральным, в частности, disnake, nextcord, pycord. Но многие до сих пор пользуются оригинальной библиотекой. Для указанной в вопросе функциональности её возможностей более чем хватает, нет только поддержки новомодных slash commands, но если они понадобятся - то перейти на любой форк можно почти безболезненно, так как они полностью совместимы с оригиналом.

    Раздача ролей и обработка команд на основе роли - это настолько популярный вопрос у начинающих ботописателей, что повсюду (и на этом сайте в том числе) просто море вопросов, ответов, примеров, советов итд итп по этой тематике.
    Ответ написан
    Комментировать
  • Sqlite3 не работает update?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А почему name в запросе идёт первым, а user_id - вторым - при этом в передаваемых параметрах наоборот?

    cursor.execute("UPDATE gaming SET name =  ? WHERE user_id = ?", [user_id, text])
    Ответ написан
  • Aiogram. Как отправить сообщение повторно зная его message_id?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет работать. У тебя два обработчика с одинаковым фильтром. Использоваться будет первый, в нём обрабатывается только bts2 и bts1. Решения:

    1. Или переместить содержание второго обработчика в первый.

    2. Или в обработчике сделать более узкий фильтр, например:

    @bot.callback_query_handler(func=lambda call: call.data.startswith('bts'))
    ...
    
    @bot.callback_query_handler(func=lambda call: call.data == 'startzen')
    ...
    Ответ написан
    7 комментариев