Задать вопрос
  • Проблемы с запуском бота телеграм на Python, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Здесь много неправильно, и не странно, что это не работает.

    На первом уровне вложенности основной код, который должен делать 3 вещи:

    1. Импортировать модули.

    2. Создавать объект класса TeleBot.

    3. Вызывать от него polling.

    Что делает polling? Это цикл, который дёргает у Bot API метод getUpdates и получает время от времени новые обновления от Telegram. Для каждого он вызывает обработчики (handler). По умолчанию нет ни одного handler, и простейший бот без них не делает ничего - только скачивает и сразу выбрасывает получаемые сообщения.

    Далее надо сделать обработчики. Они представляют из себя обычные функции. Например, обработчик сообщения принимает объект класса Message, в котором все данные по сообщению: отправитель, текст, время отправки, id чата итд.

    Чтобы бот знал, что вот эта конкретная функция является обработчиком такого-то события с такими-то условиями, надо использовать декораторы. Например:

    @bot.message_handler(commands=['start','menu'])
    def start_message(message):
      # в этом обработчике мы можем обработать команду /start или /menu,
      # при этом можно брать из message данные о сообщении:
      # message.text - текст
      # message.from_user - объект класса User с данными отправителя
      # message.chat - объект класса Chat с данными о чате (группа или приват)
      ... тут нужные действия ...


    Использовать декоратор без @ и последующего описания функции бессмысленно - он просто ничего не будет делать (потому что декоратор - это специально устроенный класс, вызов bot.message_handler создаёт экземпляр этого класса, от которого потом вызывается специальный метод, а тут этого не происходит).

    Вызывать на первом уровне вложенности bot.send_message таки возможно, но... но тут в него передаётся, например, message.chat.id - а что такое message? Этой переменной в скрипте нет. И откуда бы она взялась, если сообщение получается внутри вызова bot.polling и должно передаваться обработчику, который нужно было бы оформить как функцию с декоратором? В коде нет ни одного такого. Да и переменная message будет актуальна только внутри этого обработчика, снаружи функции она не будет доступна.

    В общем, это никак не может работать.

    Плохая идея начинать изучения языка с ботов, области, в которой уже нужно обладать определённым уровнем познаний. Начинать имеет смысл с азов. Делать сначала простейшие задания (вида "попросить пользователя ввести два числа и вывести их сумму"), освоить циклы и функции, работу с файлами и строками, ну и всё такое. Затем, вернувшись к теме ботов, уже будешь делать всё не вслепую, а хоть как-то понимая происходящее.

    Представь себе, что ты бы купил автомобиль, и не смог бы понять, как его завести. Начал бы тыкать куда попало. Например, нашёл нипель на колесе - подёргал. Дворник крутится, если приложить усилия (ой, сломал, теперь не будет ездить?). Сзади труба торчил - к ней надо водопроводный шланг подвести? Вот примерно так сейчас ты делаешь бота. Даже если тебе подскажут, что изменить, ты всё равно не научишься программировать и не будешь понимать, что сделал.
    Ответ написан
    Комментировать
  • Как прокинуть порт на mikrotik только в случаи когда в запросе есть соответствующая строка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет работать, так как URI передаётся только после установки соединения, на момент установки соединения ещё нельзя идентифицировать, куда перенаправить трафик. Для решения этой задачи надо использовать reverse proxy, в качестве которого популярно использовать nginx. Но так как тут не нужно раскидывать по нескольким разным серверам, то проще просто в целевом web-сервере отвергать запросы, не подходящие под условие. Если это почему-то невозможно (например, сервер является чужим приложением, в котором нельзя ничего изменить), то можно поставить nginx в разрез.
    Ответ написан
    Комментировать
  • Как установить аватар?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Там же есть документация и даже с примером. Он, конечно, на js, но из него и так всё ясно: надо передать параметр avatar со ссылкой на аватарку,

    Установить никак. Боты не могут менять аватарки пользователей.
    Ответ написан
    Комментировать
  • Discord Бот выдающий роль по необходимому сообщению?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    add_roles - метод класса discord.Member, а не discord.Client. Соответственно, его надо вызывать от правильного объекта. В данном случае самый простой способ получить инстанс Member отправителя данного сообщения - это обратиться к message.author:

    await message.author.add_roles(role)

    При этом role тут должно быть не id роли, а объект discord.Role. Который можно получить методом get_role класса discord.Guild. А его для Member можно получить из поля guild.

    Итого получается, что нам надо:

    author = message.author
    guild = author.guild
    role = guild.get_role(898612321755230260)
    await author.add_roles(role)


    Или если собрать в одну строчку:

    await message.author.add_roles(message.author.guild.get_role(898612321755230260))
    Ответ написан
    Комментировать
  • Где взять api для приложения музыки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    https://www.jamendo.com/
    https://developer.jamendo.com/v3.0
    Довольно много музыки (в том числе очень неплохой) на либеральных лицензиях. Но исполнители преимущественно малоизвестные.
    Ответ написан
    Комментировать
  • Как вызвать функцию через inline mode?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак, inline mode для этого не предназначен.

    Inline mode - это средство помощи пользователю в наборе сообщения. В бота прилетает запрос, который он анализирует и выдаёт список вариантов. Этот список потом кэшируетя и может какое-то время не вызывать при таких же параметрах со стороны пользователя реального запроса к боту. Изменять уже отправленные ответы для inline mode бот не может. Узнать, отправил ли пользователь в итоге сообщения и в какой чат он тоже не имеет возможности.
    Ответ написан
    Комментировать
  • Как вивести елемент из словаря которкый находится в другом файле?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ошибка же всё объясняет: на момент окончания f-строки открытая внутри фигурная скобка не имеет парной закрытой. Всё потому, что в выражениях внутри f-строк надо использовать другие виды кавычек:

    f"{some_dict['some_key']}"

    или

    f'{some_dict["some_key"]}'

    или можно так:

    f"""{some_dict["some_key"]}"""
    Ответ написан
    1 комментарий
  • -1 / unknown wget неизвестная ошибка?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это bar function пишет. Самый простой способ - заменить её на фейковую, которая ничего не делает и не возвращает (кажется, в библиотеке нет собственной заглушки для этого):

    wget.download(url, bar=lambda x,y,z:None)

    Но в целом нет смысла использовать старую библиотеку из 2015 года, лучше освоить что-то более современное, например, requests.
    Ответ написан
    Комментировать
  • Есть ли сервис предостовляющий крипто дебетовую карту без верификации личности?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Банковскую карту может выпустить только банк с аккредитацией PCI DSS. Очевидно, что криптовалютные сервисы не могут такого предоставить. Также, платёжные операции в карточных системах выполняются в конкретных валютах (рубли/евро/доллары/тенге/лиры/юани/итд), поэтому банк, который бы согласился рисковать играми в криптовалюту, фактически бы всё равно имел бы для клиента настоящий денежный счёт и конвертировал бы в него криптовалюту по своему собственному курсу (скорее всего, с явной невыгодой для клиента для покрытия рисков и неудобств от волатильности криптовалют).
    Ответ написан
  • Как боту изменить сообщение?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    message в этой функции - это сообщение пользователя, который написал /start. Дальше бот пытается редактировать это сообщение... и не получается! Конечно, ведь он может редактировать только свои сообщения, а чужие не может.

    Он должен просто редактировать своё сообщение, а не сообщение пользователя:

    my_new_message = await bot.send_message(message.chat.id, 'Ждем: 2сек')
    await sleep(1)
    await bot.edit_message_text(chat_id=message.chat.id, message_id=my_new_message.message_id, text='Ждем: 1сек')
    ...
    Ответ написан
    Комментировать
  • Ошибка пайтон библа дискорд пай что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Рекоммендую отказаться от discord_slash и перейти на потомков discord.py 2.0 (который так и остался в alpha и в pypi не опубликован) в виде форков discord.py, в которых slash commands работают из коробки. Мои эксперименты показали, что discord_slash ломает часть функциональности discord.py, и разбираться, что там пошло не так, я посчитал малоосмысленным. Я протестировал pycord, nextcord и disnake и остановился на последнем как наиболее развитом (по состоянию на декабрь было именно так), но свой выбор не навязываю.

    Нужно будет всего лишь заменить декоратор @bot.command на @bot.slash_command, очень удобно и никакого мазохизма.
    Ответ написан
    Комментировать
  • Как определить язык написанного сообщения на discord.js?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если надо определять язык текста, то смотреть в сторону language identification, например, есть библиотека fasttext, и вот есть первый попавшийся пример реализации на js https://github.com/rse/fasttext-lid (но в гугле я видел и другие, не знаю, какая будет лучше).

    Если надо определять язык конкретных слов, то может быть интересно использовать стеммеры под нужные языки и затем проверять наличие слова в словаре для этого языка. Либо перебирать весь словарь с учётом расстояния Левенштейна либо другой текстовой метрики.

    В общем, это не самая тривиальная задача.
    Ответ написан
    3 комментария
  • Почему не отображается миниатюра результата Inline-запроса?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ссылка на файл на серверах Telegram - это плохо. Во-первых, она содержит токен бота (может утечь), во-вторых, она может меняться со временем. В большинстве ситуаций полагается передавать file_id, но для thumb_url надо передавать именно URL. Так что увы - придётся самому куда-то публиковать картинки.

    Скачивание файла вызывает заголовок Content-Disposition ответа.
    Ответ написан
    Комментировать
  • Как научить чат-бота в телеграм воспринимать буквы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я пришлю тебе

    '';drop table config;select bitcoin from config

    И таблица config будет удалена. Это называется SQL-инъекцией.

    Ты не оборачиваешь строку в кавычки, разумеется, ничего хорошего не получится. В случае цифр, конечно, запрос без кавычек выполняется успешно. Но вообще это неправильный способ использования SQL, так как любая кавычка его сломает, а тщательно подготовленный текст (пример я привёл) вообще вызовет не тот запрос, который планировался.

    Правильно использовать плейсхолдеры:

    q.execute("UPDATE config SET bitcoin=? WHERE id=?", (new_bitcoin, user_id))


    В этом случае база данных сама правильно всё подставит и выполнит.
    Ответ написан
    Комментировать
  • Почему при добавлении бота в канал (Telegram) - он не работает?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если у бота включена опция Group Privacy, то он не видит сообщений в ней. Её надо выключить.

    BotFather - Bot Settings - Group Privacy.

    upd: Хотя, конечно, дело в другом, речь идёт о каналах, каналы - это не группы, там другой метод обработки сообщений.
    Ответ написан
    3 комментария
  • Какой подход правильный в описании docker-compose?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    1. Очень сильно зависит от задачи. Конечно, если точно не понимаешь, зачем это тебе нужно, то имеет смысл доверить настройку сети докеру. Но если надо, чтобы вместо bridge был macvlan со строго заданной сетью и конкретным parent-интерфейсом, то этим нас докер сам не обеспечит, если ему не подсказать.

    2. Тут больше проблема в том, что имена получаются длинными. Но если чётко знаешь свою инфраструктуру и запускаешь предсказуемые контейнеры в пределах данного хоста - почему нет? В конце концов, именование контейнеров может тоже быть частью инфраструктурного решения. Главное не запустить два проекта с пересекающимися именами - получится ах и ох с пересозданием живого контейнера.

    3. Это попытка бороться с довольно типичным подходом начинающих докероводов, которые обходятся "универсальным" контейнером, исполняющим любой php-код с внешнего каталога. Конечно, для быстрых экспериментов "ща я чёта сваяю и запущу для проверки" это даже не очень плохое решение, но при широком использовании такого подхода смысл докера существенно уходит: вместо готового к разворачиванию приложения мы имеем контейнер, который ничего не умеет и которому приходится самостоятельно пилить отдельную систему доставки самого кода. Вместо этого лучше сразу научиться и отладиться готовить полноценный образ. В конце концов, можно все приложения делать потомками этого супер-образа с php, что сделает их сборку довольно быстрой.

    4. Относительные пути - это как раз очень удобно для многих задач. Мы имеем каталог с проектом, в котором docker-compose.yml и все нужные данные. Размещение данных предсказуемо, точно видно, кто их использует, какой у них размер и всё такое. Удобно в случае чего перекидывать между серверами вместе с данными: просто погасил, rsync, запустил. Напротив, хранение данных в анонимных томах в /var/lib/docker с непонятными именами - это часто антипаттерн, при котором ценное место в /var заполняется чем-то непонятным, что толком невозможно идентифицировать. А использование имён может привести к той же проблеме, что и container_name - в разных compose-проектах имена пересекутся, и узнаешь это только тогда, когда уже сломается.
    Ответ написан
  • Можно ли узнать HypeSquad пользователя с помощью discord.py?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Комментировать
  • Как сделать APK file?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нельзя просто так портировать интерфейс настольной программы в мобильное приложение. Там всё просто иначе устроено. Кроме того, скриптовые языки не очень удобны для мобильных приложений. Обычно на python делают с помощью Kivy (рекомендую ознакомиться и попробовать оценить на простых примерах).
    Ответ написан
    Комментировать
  • Как сделать рассылку юзерам телеграм-бота на python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно просто запустить другой скрипт, который создаст объект телебота с тем же токеном, но не будет использовать polling, а сразу вызовет send_message сколько нужно раз. Но надо не забывать про rate limit.

    PS: Почему тут каждую неделю спрашивают про рассылку ботом по списку? Неужели нет более интересных учебных задач?
    Ответ написан
    3 комментария
  • Почему не приходят OTP смс на номер Twilio?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нет, на номера Twilio шлют смс вовсе не операторы. Приложения и сервисы не используют сети операторов для доставки. A2P (application-to-person) SMS работают не так. Для этого используются специальные интеграции, промышленным стандартом здесь является протокол SMPP. Как правило, конкретный сервис пользуется услугами некоторого поставщика-агрегатора, в которого может посылать не только посредством SMPP, но и каких-то других протоколов. Но в дальнейшем агрегатор пошлёт уже по SMPP либо конечному оператору, либо другому посреднику. Интегрироваться напрямую со всеми операторами мира попросту нереально, их в России десятки, в США сотни, а сколько в целом по миру уже невозможно посчитать. При этом нельзя никогда узнать, пойдёт ли SMS из конкретного агрегатора напрямую конечному оператору или другому посреднику (и в целом невозомжно узнать, сколько посредников вообще будет по дороге). На любой стадии цепочки может что-нибудь глючить или работать недостаточно достоверно.

    Кроме того, любая стадия цепочки может что-то зарезать по своему усмотрению: по текстам, по номерам, по источнику трафика (с каким system_id поступило сообщение). В конце концов, во многих странах весьма сложные правила и технические условия. Например, в Индии максимальная длина альфанумерического имени 6 символов, а в России 11, во многих странах или у отдельных операторов имена должны предварительно регистрироваться (могут быть платны или бесплатны, могут требовать или не требовать документальных подтверждений на товарный знак). В некоторых странах мобильные сети в принципе не поддерживают альфанумерические имена (например, в США), и там необходимо делать подмену на цифровое, которое в дальнейшем не всякий оператор пропустит.

    До кучи, некоторые номерные ёмкости могут намеренно блокироваться, как используемые для целевой регистрации аккаунтов без наличия физической сим-карты. Например, на некоторые сервисы аренды номеров WhatsApp принципиально не отправляет SMS, даже если соответствующий номер никогда не использовался.

    Ссылаться на успешное хождение SMS между обычными абонентскими устройствами нельзя, так как обычные SMS могут ходить по SS7, что для A2P SMS вообще невозможно. Даже если найти за деньги или в даркнете дырку в сеть SS7 у какого-нить африканского оператора, то доставки не будет вообще или её качество будет ужасным (насколько помню, для России лет 5 назад доставка не превышала 40%, сейчас скорее всего ещё хуже).

    С вопросами о неработе следует обращаться в техподдержку конкретного сервиса. Пусть они пушат своего поставщика, а тот по цепочке добивается у своих партнёров.
    Ответ написан