Задать вопрос
  • Получать сообщения от пользователя?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть два способа получения доступа к API WA.

    1. Легальный: WhatsApp Business API. Нужно зарегистрировать бизнес (можно ИП) в Facebook Business Manager, пройти модерацию, получить доступ через одного из партнёров WhatsApp. Недостатки: дорого. Достоинства: надёжно, официально.

    2. Нелегальный: имитация недокументированного WhatsApp Web API. Достаточно держать телефон с WhatsApp включённым, сфотографировав QR-код, выданный нужной библиотекой или сервисом. Недостатки: риск бана (невысокий, но я бы не советовал использовать Очень Важный Номер в таких играх), риск что всё сломается из-за изменения Web API, необходимость держать включённым номер телефона. Достоинства: дёшево, не нужно регистрировать шаблоны для отправки сообщения первым (но если часто отправлять первым повышается риск бана).
    Ответ написан
    Комментировать
  • Как запустить параллельно две функции?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Либо треды, либо асинхронность.
    Ответ написан
    3 комментария
  • Как мне можно ввести команду ну @client.command() чтобы он не выдовал ошибку но ивенты работали?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    1. Почему два обработчика on_message? Должен быть один.

    2. client.command - метод класса не discord.Client, а discord.ext.commands.Bot. Перепиши на этот класс - он наследует discord.Client и все его методы поддерживает.

    3. При наличии on_message команды сломаются, его или убрать, или правильно добавить обработку команд, см. https://discordpy.readthedocs.io/en/latest/faq.htm...
    Ответ написан
  • Есть ли библиотеки для серфинга по бразеру без граф. Оболочки? selenium без граф. оболочки, что то между selenium и requests?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если нужно выполнять прямые запросы - requests. Придётся самостоятельно разобраться в устройстве сайта, в том числе в динамически генерируемом контенте.

    Если надо изображать настоящий браузер с js - selenium.

    Никакого волшебного аналога selenium "без браузера" не существует и не может существовать, ведь он должен имитировать полноценный браузер с окном, документом, скриптами и css, а без настощего браузера (хотя бы headless) этого не достичь.
    Ответ написан
    Комментировать
  • Как реализовать перегрузку методов в python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В python нет перегрузки методов, вместо этого там можно принимать произвольные параметеры через *args и **kwargs, например:

    def __init__(self, *args):
        if isinstance(args[0], date):
            # это date
        elif all(isinstance(arg, int) for arg in args[0:3]):
            # это 3 int
    Ответ написан
    6 комментариев
  • Не свосем юзербот на discord.py?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Этого сделать невозможно. Вообще никак.
    Ответ написан
    Комментировать
  • Как сделать ссылку в callback_data?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для этого надо использовать url-кнопку, а не callback-кнопку

    https://core.telegram.org/api/bots/buttons
    Ответ написан
    Комментировать
  • Как авторизовать пользователя на сайте через бот Вайбера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Update: как обсудили с автором, скорее всего тут речь об использовании deep linking. Пользователь идёт по ссылке, где в context передаётся какой-то идентификатор или хеш, затем делится с ботом своим номером телефона, и авторизация пройдена.

    Предыдущий ответ оставляю, так как он тоже может оказаться полезен:

    Viber Bot (в девичестве Viber Public Account) не позволяет отправку сообщений по номеру телефона. Для этого надо использовать Viber Business Messages (в девичестве Viber Service Messages) через партнёров Viber.

    Обычная практика в этой сфере - посылать сообщение через Viber, затем по таймауту высылать запасную СМС. Это называют модным словом "каскад". Можно для повышения надёжности включать в каскад также WhatsApp (и другие каналы с отправкой по номеру телефона, например, mail.ru notify). Но можно просто при проверке номера пользователя предлагать ему самому выбрать из списка предпочтительный канал для проверки (если не сработает - пользователь попробует другой канал самостоятельно).

    Нужно быть готовым к тому, что стоимость отправки в Viber/WA по номеру телефона стоит дороже, чем СМС. Хотя сообщение на мессенджеры принято тарифицировать только при успешной доставке (недоставленные бесплатны), есть также обязательный ежемесячный платёж (для Viber это требование самого Viber, для WhatsApp большинство поставщиков продают минимальный пакет хотя бы на 5-10 тыс. рублей, а те, кто не берут абонентку, для покрытия своих расходов тарифицируют даже бесплатные сообщения).
    Ответ написан
  • Как вывести кнопки в одно сообщение?

    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 комментария