Задать вопрос
  • Как вывести кнопки в одно сообщение?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Зачем в цикле на каждую кнопку отправлять отдельное сообщение? Надо сначала в цикле сформировать клавиатуру, а потом отправить одно сообщение.

    spoiler
    С node.js не умею, вот простейший пример на python для понимания принципа:
    keyboard = types.InlineKeyboardMarkup()
    for b in buttons:
      keyboard.add(types.InlineKeyboardButton(text=b, callback_data=b))
    bot.send_message(message.chat.id, "Кнопачки", reply_markup=keyboard)
    Ответ написан
    Комментировать
  • Как задать динамичные параметры в Makefile?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    make принимает список отдельных целей для сборки, там нельзя передать параметр на несколько слов. Можно передавать define через -D, например:

    make -DARGS="UserSeeder" seed

    В Makefile:

    seed:
      docker-container exec php php artisan make:seed $(ARGS)


    Но в целом проще написать свой скрипт, чем сражаться с ограничениями make.
    Ответ написан
    5 комментариев
  • Возможна ли полная автоматизация в Viber?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У Viber нет открытого клиентского API.
    Ответ написан
    Комментировать
  • Как сделать match отдельных слов regex?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Использовать \b для отметки границы слова:

    \breg\b

    https://learn.javascript.ru/regexp-boundary
    Ответ написан
    3 комментария
  • Как объеденить в словарь два списка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    timestamp = [11111,22222,33333]
    file_list = ['file1','file2','file3']
    
    files_dict = [{"key":k, "value":file_list[i]} for i,k in enumerate(timestamp)]


    Но вообще по логике с такими данными удобнее работать в виде dict, где в ключах значения timestamp, а в значениях - имена файлов. Это ещё проще:

    files_dict = dict(zip(timestamp, file_list))
    Ответ написан
    Комментировать
  • Что нужно установить и сделать, чтобы начать пользоваться?

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

    Ключ -e заставляет считать первый аргумент кодом, а не именем файла.
    Ключ -n оборачивает этот код в цикл while(<>) { ... }
    Ключ -p добавляет в конец print.

    В результате команда perl -pne 's/foo/bar/' превращается в аналог скрипта такого содержания:

    while(<>) {
      s/foo/bar/;
      print;
    }


    Конечно, как нетрудно догадаться, такой вызов аналогичен вызову sed s/foo/bar/ Таким образом, perl можно использовать почти как sed или awk, только с более богатыми регулярными выражениями и более широкими возможностями программирования.

    Например:

    some_command|perl -pne 's/foo/bar/g; s/lorem (\d+)/\1 ipsum/g' > output.txt
    perl -ne '/([_\w]+)\s*=\s*"(.+)"/ && print "key $1 value $2\n"' /etc/environment
    Ответ написан
    3 комментария
  • Как откатиться в миграции, чтобы не возникало ошибки ValueError?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это не так просто. Если что-то категорически пошло не так, то надо вручную поправить базу. Либо откатить базу аккуратно к предыдущему состоянию (например, удалить новые поля в таблицах), удалить строку о применённой миграции из таблицы django_migrations, удалить эту самую сбойную миграцию из APP_NAME/migrations, затем сделать makemigrations ещё раз и накатить полученную миграцию.

    До кучи:

    manage.py showmigrations - покажет все миграции во всех приложениях
    manage.py sqlmigrate APP_NAME MIGRATION_NAME - покажет SQL-запросы, соответствующие этой миграции
    Ответ написан
    Комментировать
  • Как создать tdata с помощю telethon?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Зачем? Эта библиотека для другого предназначена.
    Ответ написан
  • Как создать контейнер в docker чтобы файлы брались из внешней директории?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Аналог package.json - файл requirements.txt для pip или аналоги для других систем типа pipenv.

    Делаем контейнер, в который добавляем наш код, как-то так:

    ADD app /app
    WORKDIR /app
    RUN apt install python3-pip && pip install -r requirements.txt

    Затем при запуске контейнера передаём ему каталог с нужными каталогами (в данном случае конфиги и логи):

    docker run -itd --name my_service -v `pwd`/config:/app/config:ro -v /var/log/my_project/my_service:/app/log my_awesome_image


    Или через секцию volumes в docker-compose.yml (с ним удобнее, чем с прямым вызовом docker):

    volumes:
        - ./config:/app/config:ro
        - /var/log/my_project/my_service:/app/log
    Ответ написан
    1 комментарий
  • Как сделать "это сообщение видите только вы" в discord js?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ответ написан
    Комментировать
  • Что за UnsupportedUser64Bot?

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если речь идёт о постоянной синхронизации именно файлов, то очень неплохо работает lsyncd. Только ни в коем случае нельзя пытаться использовать его для синхронизации в две стороны (путём запуска двух экземпляров), только в одну! (Я тестировал, даже если запись идёт только в одну сторону, иногда спонтанно случается синхронизация в неправильную сторону неполностью записанного файла)

    Для баз данных файловую синхронизацию лучше не использовать, для них есть свои методы репликации.

    Разумеется, всё это не отменяет бэкапов и других организационных мер по развёртыванию и поддержке, но можно по возможности максимально снизить риск потери самых последних данных.
    Ответ написан
    3 комментария
  • Телеграм бот на from_user показывает свои данные. Что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    call.message - исходное сообщение, в котором пользователь нажал на кнопку. Разумеется, автором этого сообщения является бот.

    Вместо call.message.from_user надо использовать call.from_user.

    Идея использовать call.message.chat.id для получения id пользователя будет работать только до тех пор, пока это используется в личном чате с пользователем, где chat_id всегда равен user_id. В групповых чатах это работать не будет.
    Ответ написан
    Комментировать
  • Как сделать перенос текса в боте?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Укажи \n или даже \n\n (два переноса - чтобы между абзацами была пустая строка).

    Чтобы использовать html, надо передавать параметр parse_mode='html'. Есть ограничения - не все тэги поддерживаются. См. https://core.telegram.org/bots/api#html-style

    Также есть parse_mode='MarkdownV2' и parse_mode='Markdown, подробнее https://core.telegram.org/bots/api#formatting-options
    Ответ написан
    Комментировать
  • Как пользоваться видимость пакетов Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Импорт модуля - это не вставка его кода в вызывающий модуль. Если сделать

    import XXX

    или

    import YYY as XXX

    то в текущей области видимости появится XXX, через который можно будет обращаться к содержимому другого модуля. В частности, можно обращаться к модулям, импортированным в нём:

    import YYY as XXX
    print (XXX.sys.argv)


    Чтобы получить всё, что есть в модуле XXX, в текущей области видимости, можно сделать так:

    from XXX import *

    Но так импортируется реально всё, в том числе модули, которые импортированы в XXX. Но это можно обойти, если внутри XXX в переменной __all__ описать list со всеми именами, которые должны импортироваться при таком импорте. По умолчанию импортируется всё.
    Ответ написан
  • Почему не работает нажатие на inlinekeyboard?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А как бот узнает, что callback_inline - это обработчик callback query, а не входящего аудиосообщения и не запрос погоды на Марсе? Где у него нужный декоратор?
    Ответ написан
    4 комментария
  • Возможно ли подключить номер к SMPP шлюзу?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В SMPP вообще никакой привязки к номерам телефонов нет. Можно отправлять и принимать сообщения с какими угодно цифровыми или альфанумерическими подписями.

    Но на деле, конечно, выбирать приходится из того, что разрешают операторы. А операторы для такого случая разрешают одно из двух:

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

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

    В 2021 году СМС - это очень непопулярный сервис. Дорогой и неудобный. Я бы постарался плясать от задачи и поискать способы, по возможности с SMS никак не связанные. Например, если это обращения в поддержку, то их лучше принимать в мессенджерах. Благо сейчас более-менее все популярные позволяют те или иные интеграции.
    Ответ написан
    Комментировать
  • Как написать bash скрипт, который будет запускать файл, который поддерживает аргументы командной строки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    #!/bin/bash
    python3 get-movies.py "$@"


    Тут запись "$@" означает передать все аргументы скрипта как они есть, причём с правильным экранированием, то есть "Termninator 2" будет передано как "Terminator 2", а не "Terminator" "2".

    upd: Ещё добавлю, что для такого простого случая может больше подойти другой подход: передача интерпретатора через шебанг. Надо первой строкой файла get-movies.py указать:

    #!/usr/bin/env python3

    В этом случае запуск скрипта будет приводить к вызову /usr/bin/env python3 get-movies.py со всеми остальными параметрами.
    Ответ написан
    Комментировать
  • Какие книги существуют для написания, редактирования python-ботов, какие книги порекомендуете новичку?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Марк Лутц. Изучаем Python.

    Собственно, знать используемый язык тут самое важное.
    Ответ написан
    4 комментария
  • Как продолжить принимать сообщения aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это плохая идея! Библиотека выбирает первый обработчик, подходящий по условию (в данном случае content_types=["text"]) и остальные не использует вообще.

    Рекомендую либо вставить проверку в каждый handler, либо оформить её как условие в декораторе:

    @dp.message_handler(lambda message: not is_banned(message.from_user.id)


    Можно также написать свой декоратор, чтобы писать просто @check_user_banned. Но это уже по желанию.
    Ответ написан
    1 комментарий