Задать вопрос
  • Какие аналоги телеграмм каналов есть в других мессенджерах?

    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.
    Ответ написан
    Комментировать
  • Как через url отправить сообщение боту в телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, в upd всё верно написано, надо сначала получить chat_id. Это можно сделать, отправив боту любое сообщение, а потом с помощью вызова .../getUpdates его получить. В сообщении будет искомый chat_id. Далее можно на этот chat_id посылать сообщения. Если это всё для того, чтобы просто посылать в телеграм себе оповещения, то держать постоянно запущенного бота и не нужно, достаточно дёргать sendMessage по необходимости.
    Ответ написан
    Комментировать
  • AIOgram, как лучше обновить код рассылки, чтобы она не останавливалась из-за Flood control?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо использовать time.sleep в асинхронном коде, это блокирует event loop! Вместо этого надо использовать асинхронный вариант asyncio.sleep.

    По существу с таким кодом будет делаться 10 отправок в секунду, а официально лимит 30 в секунду. Но лучше бы дополнительно отлавливать исключение с flood control и по нему делать дополнительный sleep хотя бы на 1 секунду, а то и чуть больше, чтобы счётчик числа попыток на стороне Telegram обнулился за это время.
    Ответ написан
    Комментировать
  • Как передать картинки в Телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Комментировать
  • Как объединить 'Привет' и message.text?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    bot.send_message(message.chat.id, 'привет '+message.text)

    или
    bot.send_message(message.chat.id, f'привет {message.text}')
    Ответ написан
    3 комментария
  • Ошибка при работе с модулем scapy Python Debian?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    "Сниффить" может только root.
    Ответ написан
    5 комментариев