• Как сделать функцию удаления сообщения бота, как у juniperbot?

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

    sent_message = await ctx.send(...)
    await asyncio.sleep(10)
    await sent_message.delete()
    Ответ написан
    1 комментарий
  • ERROR - TeleBot: "A request to the Telegram API was unsuccessful. Error code: 404. Description: N что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Токен неверный. Библиотека делает запросы вида https://api.telegram.org/botTOKEN/xxxx и получает 404.
    Ответ написан
    Комментировать
  • Кастомная аутентикация Linux?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    BOT_TOKEN="твой_токен"

    Всё остальное лишнее.
    Ответ написан
    Комментировать
  • Создание словаря с помощью цикла в python, в чем ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    new_dict = dict(zip(range(1,21),[x*x for x in range(1,21)]))
    Ответ написан
    Комментировать
  • Как сменить язык внутри команды на русский?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По поводу времени тут с завидной регулярностью спрашивают, нужно выставить локаль русскую. Например Как изменить язык created_at.strftime?
    По поводу локали системных уведомлений - в настройки конкретного сервера. Бот на это не влияет.
    Ответ написан
    Комментировать
  • Как ловить if в инлайн конструкции?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что call.message - это сообщение (объект Message), в котором пользователь нажал на кнопку. Тут нужно call.data.
    Ответ написан
  • Почему когда нажимаю на инлайн которая в if ни чего не происходит?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что call.message - это сообщение (объект Message), в котором пользователь нажал на кнопку. Тут нужно call.data.
    Ответ написан
  • Как сделать добавление товара в корзину с плавающим товаром?

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

    next_item = int(call.data.split('_')[-1])

    значение next_item будет равен номеру товара. Ещё можно такое сделать:

    operation = call.data.split('_')[0]

    Тогда смотрим, что operation == 'add' и добавляем товар с номером next_item (хотя, конечно, слово "next" в названии переменной сбивает с толку, я бы переименовал).
    Ответ написан
    Комментировать
  • Как сделать что бы inline кнопка отправляла сообщение в боте, Как обычная кнопка?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вызвать в цикле bot.send_message на все извлечённые из базы chat_id. Учесть при этом, что у Телеграма ограничение в 30 запросов в секунду. Учесть, что некоторые пользователи уже могли отписаться от бота (отправка им вызовет исключение).
    Ответ написан
    4 комментария
  • Какие различия у библиотек для telegram бота?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Главное отличие: первая синхронная, вторая асинхронная. О преимуществах асинхронного подхода говорить не буду, но он сложнее, особенно для неопытных программистов.

    В целом все библиотеки похожи, у них одинаково называются методы, аналогично устроены структуры данных. Неудивительно, ведь все они реализуют один и тот же API. Зная одну, можно легко освоить другие. С другой стороны, в подавляющем большинстве случаев нет никакого смысла перескакивать на другую библиотеку вместо уже знакомой.

    Из библиотек отмечу pyrogram, асинхронную библиотеку, которая умеет одновременно поддерживать и Bot API, и MTProto API, причём одинаковыми методами. Это может быть интересно для некоторых задач.
    Ответ написан
    Комментировать
  • Как писать бота через Webhook?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Читать в официальной документации.

    Кратко: либо бот делает запросы getUpdates для получения новых данных, либо бот представляет из себя web-сервер с адресом, за который Телеграм может его дёрнуть при наступлении нового события. Первое намного проще в организации и для небольших ботов с не очень значительным трафиком более чем достаточно.
    Ответ написан
    Комментировать
  • Какой диапазон id у открытых групп (не канал) в Telegram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никакой. Любую группу можно из открытой перевести в закрытую и обратно.

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

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

    Facebook Messenger является частью Facebook, аналогом канала там скорее является Facebook Pages.

    По размерам легко гуглится. У WhatsApp это 256, но хитрыми хаками народ увеличивает размер. Facebook Messenger - 250.
    Ответ написан
    Комментировать
  • Как сделать чтобы в коллбеке инлайн кнопки сообщение заменяло прошлое?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вот и надо редактировать предыдущее сообщение. Например:

    bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.id, text='Новый текст')
    bot.edit_message_media(chat_id=call.message.chat.id, message_id=call.message.id, media=types.InputMediaPhoto(open('file.jpg','r').read(), caption='Новая картинка'))
    Ответ написан
    Комментировать
  • Как декодировать строку, полученную от сервера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Возможно, браузер просто не ту кодировку выбирает. Можно просто выбрать вручную нужную для этой страницы через меню, чтобы в этом убедиться. Можно также добавить кодировку в Content-Type:

    Content-Type: text/html; charset=utf-8
    Ответ написан
    Комментировать
  • Что такое файлы core на сервере?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотрим на любой core-файл с помощью утилиты file:

    $ file core.666
    core.666: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from '/usr/bin/foobar', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0


    Тут видно, что крэшился процесс foobar.

    Далее с помощью:

    gdb -c core.666

    можно поизучать, что там реально происходило, но это уже более сложно, особенно без отладочных данных и вообще с чужим кодом.

    С запуском scp всё это скорее всего не связано, ну разве что core-файл остаётся от самого sshd.
    Ответ написан
    Комментировать
  • Если удалить образ, который используется в контейнере, то почему контейнер не падает?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Образ - это не какой-то набор файлов. Это по сути список слоёв (fslayer), которые могут быть общими у разных образов. Имя образа (с тэгом) - это ссылка на id образа. У образа может быть несколько имён (например, foobar:1.2.3 и foobar:latest). Удаление образа по имени имени не удаляет образ, оно удаляет лишь имя, затем если у id образа больше нет других имён и образ не используется больше никем удаляет те fslayer образа, которые заведомо не нужны другим образам и контейнерам. Поэтому иногда docker rmi говорит всего лишь "untagged имя_образа", а иногда реально удаляет какие-то слои.

    $ docker pull alpine
    Using default tag: latest
    latest: Pulling from library/alpine
    540db60ca938: Pull complete 
    Digest: sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
    Status: Downloaded newer image for alpine:latest
    docker.io/library/alpine:latest
    $ docker tag alpine foo/bar/lorem/ipsum:some.tag
    $ docker rmi alpine
    Untagged: alpine:latest
    Untagged: alpine@sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
    $ docker rmi foo/bar/lorem/ipsum:some.tag
    Untagged: foo/bar/lorem/ipsum:some.tag
    Deleted: sha256:6dbb9cc54074106d46d4ccb330f2a40a682d49dda5f4844962b7dce9fe44aaec
    Deleted: sha256:b2d5eeeaba3a22b9b8aa97261957974a6bd65274ebd43e1d81d0a7b8b752b116


    При создании контейнера поверх слоённой файловой системы образа создаётся новый слой для собственных файлов контейнера. Поэтому физически образ нельзя до конца удалить, пока есть хоть один контейнер на его базе.
    Ответ написан
    2 комментария
  • Как реализовать подобное на python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Плохая идея при запросе что-то запускать. Вместо этого правильнее в вызываемом скрипте осмысленную функциональность оформить в функцию, которую и вызывать. Как-то так (на примере flask):

    from my_awesome_module import my_awesome_function
    from flask import Flask, request, Response, abort
    
    app = Flask(__name__)
    
    @app.route('/', methods=['GET'], defaults={'path': ''})
    @app.route('/<path:path>', methods=['GET'])
    def serve(path):
      result = my_awesome_function(path)
      if result == 0:
        return Response("OK")
      else:
        return abort(500)
    
    if __name__ == '__main__':
      app.run(host='0.0.0.0', port=123456)
    Ответ написан
    Комментировать