• Как сделать что бы 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)
    Ответ написан
    Комментировать
  • Как узнать данные сообщений в Telebot?

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

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    d1 = [1, 0, 1, 0]
    d2 = ['qwe', 'asd', 'zxc', 'wer']
    
    d3 = [x[1] for x in filter(lambda x:x[0] == 1, zip(d1, d2))]
    
    print (d3)


    Ещё короче:

    d3 = [d2[i] for i in range(0,len(d1)) if d1[i] == 1]
    Ответ написан
    4 комментария
  • Как оформить кнопку "Следующий товар"/"Предыдущий товар"?

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

    Например, как-то так (items - словарь товаров с артикулами в качестве ключей):

    #
        numbers = items.keys()
        index_current = numbers.index(number_current)
        if index_current > 0:
            number_prev = numbers[index_current-1]
        else:
            number_prev = numbers[-1]
        if index_current < len(numbers)-1:
            number_next = numbers[index_current+1]
        else:
            number_next = numbers[0]
    
        next =InlineKeyboardButton(text= 'Следующий',callback_data= f'item:{number_next}')
        previous =InlineKeyboardButton(text= 'Предыдущий',callback_data= f'item:{number_prev}')
        add = InlineKeyboardButton(text= 'Добавить в корзину',callback_data= f'add:{number_current}')
    
    ...
    
        if call.data.startswith('item:'):
           number_current = call.data[5:]
           show_this_item_to_user
        if call.data.startswith('add:'):
           number_current = call.data[4:]
           add_this_item_to_basket
    Ответ написан
    6 комментариев
  • Как менять сообщение в телеграмм боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    При отправке сообщения возвращается объект Message, в котором есть требуемый id.

    Например, в telebot:

    msg = bot.send_message(my_chat_id, message_text)
    msg_id = msg.message_id
    bot.edit_message_text(chat_id=my_chat_id, message_id=msg_id, text="(edited) "+message_text)
    Ответ написан
    Комментировать
  • Как зациклить функцию отправки сообщения ботом на aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Так нельзя, это же asyncio, тут любой синхронный код блокирует event loop и всё ломает. Для начала, надо вместо time.sleep использовать asyncio.sleep.

    Потом, таск бота запускается при вызове start_polling уже после цикла. При этом event loop к тому моменту закончился, так как asyncio.run отработал.

    Надо сделать как-то так:

    async def main():
      polling_task = asyncio.create_task(dp.start_polling())
      while True:
        await asyncio.sleep(60)
        await bot.send_message(owner, "Hello!")
    
    loop = asyncio.get_event_loop()
    if __name__ == '__main__':
      loop.run_until_complete(main())
      loop.close()
    Ответ написан
    Комментировать
  • Как перевести строку в html flask?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Чтобы шаблонизатор flask так не делал, надо использовать фильтр safe.

    {{ url_for('static' filename='...')|safe }}

    См. также документацию.
    Ответ написан
  • Как запустить докер с бинарником скомпилированным из го?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    man console_codes

    Читаем про коды, которые перемещают по экрану (ESC[x;yH), меняют цвета (ESC[x;y;zm) и всё такое. Также обратить внимание на scroll region (ESC[top;bottomr), сохранение и восстановление положения курсора (ESC[?s, ESC[?u). Размер терминала можно получить с помощью ioctl TIOCGWINSZ (низкоуровневый вариант) или функции get_terminal_size модуля shutil, изменение размеров терминала в процессе работы можно отслеживать с помощью сигнала SIGWINCH.
    Ответ написан
    Комментировать