• Как сделать ссылку в 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 комментария
  • Телеграм бот на 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 со всеми остальными параметрами.
    Ответ написан
    Комментировать