Ответы пользователя по тегу Боты
  • Как реализовать порядок выполнения и зависимость при создании ТГ бота?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужна реализация state machine (автомат состояний).
    Упрощённо, для каждого пользователя, событие от которого мы обрабатываем, нужно хранить, в каком состоянии он находится (например, в твоём случае "начальное" или "была послана команда /send_id"). Тогда при обработке событий проверяешь, находится ли пользователь в нужном состоянии.

    Хранить состояния можно по разному. В простейшем случае, если состояния не обязаны переживать перезапуск бота и не имею дополнительных данных, может хватить словаря вида "ID пользователя - код состояния".
    Ответ написан
    Комментировать
  • Как остановить цикл по нажатию инлайн кнопки в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    У тебя бот многопоточный? Потому что иначе единственный главный поток будет занят циклом, и боту будет не до общения с сервером телеги.
    Ответ написан
    Комментировать
  • Как сделать проверку на совпадении элемента из списка и значение в sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    .fetchone()[0]
    Выстрелил себе в ногу, называется. .fetchone() может вернуть None, если SELECT не нашел ни одной подходящей записи, и тогда попытка обратиться по индексу сгенерирует
    исключение
    TypeError: 'NoneType' object is not subscriptable

    Так что проверяй, что тебе вернул fetchone().
    Ответ написан
  • Как правильно настроить бот на python?

    Vindicar
    @Vindicar
    RTFM!
    Быстрый гуглинг показывает, что content_types для появления юзера может быть new_chat_members, а не new_chat_member. Проверь, работает ли.
    Ответ написан
  • Как сделать чтобы бот отправил любое сообщение?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию на discord.py, и вопросы отпадут.
    async def command(ctx, param: str) даст первое слово в строке (до пробела, или строку в кавычках).
    async def command(ctx, *params: str) даст каждое слово в строке (разделенной по пробелам, с учётом кавычек) отдельно, в виде кортежа.
    async def command(ctx, *, param: str) даст всё содержимое строки в виде одной строки.
    Ответ написан
    Комментировать
  • Понять понять из-за чего не работает команда мут?

    Vindicar
    @Vindicar
    RTFM!
    Как понять? Голову включить и документацию прочитать.
    @commands.has_any_role('mute' , 908382396112592926 )

    Читаем доки:
    A check() that is added that checks if the member invoking the command has any of the roles specified. This means that if they have one out of the three roles specified, then this check will return True.

    "Если участник, вызвавший команду, имеет любую из указанных ролей". Т.е. этой командой может пользоваться только участник, у которого есть либо роль с названием 'mute', либо роль с id 908382396112592926.

    Далее, смотрим на нижележащую глупость.
    muted_role = discord.utils.get( ctx.message.guild.roles, name = mute )

    Ты в качестве name передал функцию mute. Это по-твоему вообще имеет смысл? Может, всё же имел ввиду name = 'mute'? Но тогда означает, что команду может вызвать только замьюченный пользователь. Я сомневаюсь, что ты этого хотел.
    Ответ написан
  • Почему Сайт не видит отправленые сообщения?

    Vindicar
    @Vindicar
    RTFM!
    Причины может быть две.
    1. .tiktok-19dw2t5-DivLayoutContainer выглядит как сгенерированное имя стиля, оно может меняться хоть при каждом открытии страницы.
    2. Более вероятно, аккаунт бота был тихо помечен как спамерский, и теперь его сообщения видит только он сам. Учитывая действия бота, заслуженно, скорее всего.
    Ответ написан
    3 комментария
  • Возможно ли дублирование чата с стороннего Дискорд сервера на свой при помощи бота?

    Vindicar
    @Vindicar
    RTFM!
    Если целевые каналы помечены как новостные, то можно обойтись и без бота.

    Если нет, то да, это несложно, хотя дискорд очень не любит, когда боты работают из-под учетки пользователя.
    Просто записываешь в программе список ID каналов, с которых нужно перекидывать сообщения, а также ID канала, куда их нужно перекидывать. В реакции на сообщение боту, проверяешь, где оно было размещено, и если ID беседы входит в список, то аккуратно дублируешь поля сообщения для отправки в целевой канал.
    Ответ написан
    Комментировать
  • Как написать сообщение с помощью selenium, если в html коде нету тега input?

    Vindicar
    @Vindicar
    RTFM!
    Можно попробовать так:
    pseudo_input = driver.find_element_by_css_selector(".btn") # ну или что там у тебя за элемент
    ( selenium.webdriver.common.action_chains.ActionChains(driver)
        .move_to_element(pseudo_input)
        .click(pseudo_input)
        .send_keys_to_element(pseudo_input, *keys_to_send)
        .perform()
    )
    Ответ написан
    2 комментария
  • Телебот.Как выполнить в основном файле .py команды из другого .py файла?

    Vindicar
    @Vindicar
    RTFM!
    Твоя проблема в том, что ты в каждом файле определил объект bot, и в итоге каждый файл подписывается на своего бота... но работает только бот из main.py, так как он определяется ПОСЛЕДНИМ и переписывает имя bot на себя. Так что bot.infinity_polling() в итоге запускает только бота из main.py, а остальные боты остаются незапущенными.
    Можно схитрить и заставить все файлы использовать один объект бота. Например, переписав вспомогательные файлы таким образом:
    # commands.py
    def register_commands(bot):
      # функция register_commands должна присутствовать в каждом файле,
      # и содержать вложенные объявления обработчиков событий.
      # bot - объект бота, на котором регаются обработчики. 
      # таким же способом можно пробросить другие глобальные объекты программы.
      # очень важно, чтобы функция вызывалась РОВНО один раз в программе!
      # дальше пошли обработчики...
      @bot.message_handler(commands=['version'])
      def version_message(message):
          bot.send_message(message.chat.id, 'Текущая версия бота 1.0')
          bot.send_message(message.chat.id, 'Что умеет эта версия?\n1.Что-то точно умеет')

    Тогда в main.py будет что-то вроде...
    import commands
    import weather
    
    bot = telebot.TeleBot(.................)
    
    # заставляем модули объявить и зарегистрировать свои обработчики
    commands.register_commands(bot)
    weather.register_commands(bot)
    
    # дальше идут местные обработчики
    @bot.message_handler(content_types=['text'])
    def send_text(message):
        if message.text.lower() in a:
            bot.send_message(message.chat.id, 'Привет, создатель')
        elif message.text.lower() =='ghbdtn':
             bot.send_message(message.chat.id, 'Тебе тоже привет, раскладку переключи')
        elif message.text.lower() in b:
            bot.send_message(message.chat.id, 'Прощай, создатель ')
    
    # ну и запускаем бота
    bot.infinity_polling()
    Ответ написан
    Комментировать
  • Как сделать /slash команды в боте на библеотеке discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Никак. Разработка discord.py остановилась, и автор не стал добавлять slash команды. Используй другие либы.
    Ответ написан
    Комментировать
  • Актуально ли сейчас делать и продавать телеграмм ботов, написанных на Python?

    Vindicar
    @Vindicar
    RTFM!
    Конструкторов ботов полно, в т..ч. бесплатных. Хочешь монетизировать знания - погуляй по фриланс-сайтам.
    Ответ написан
    Комментировать
  • Как поставить таймер на функцию в дискорд боте?

    Vindicar
    @Vindicar
    RTFM!
    1. В документации есть пример.
    2. Тебе не нужен контекст (ctx), ты можешь получить объект канала просто по его ID. Через него же можно получить и приватный канал с юзером. Получив объект канала, можешь писать просто в него.
    Ответ написан
  • Непонятная ошибка KeyError, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    queue_len = len(self.song_queue[ctx.guild.id])
    KeyError: 902227097647468664

    Число выглядит как id в дискорде. KeyError обычно случается, когда пытаешься обратиться к несуществующему ключу в словаре. В указанной строке кода есть кусочек, который выглядит как обращение к словарю: self.song_queue[ctx.guild.id]
    Вывод: в словаре self.song_queue нет ключа для того сервера (ctx.guild) с которого пришла команда боту. А вот почему его там нет, и почему нет логики, предусматривающей этот сценарий - это уже вопрос к вам.
    Ответ написан
    Комментировать
  • Как сделать чтобы бот удалил все каналы?

    Vindicar
    @Vindicar
    RTFM!
    1. Получить список всех каналов на сервере
    2. Пройтись по списку циклом for и удалить каждый.
    Но зачем?
    Ответ написан
    Комментировать
  • Как остановить поток при вводе команды?

    Vindicar
    @Vindicar
    RTFM!
    Единственный вменяемый способ - тело потока должно время от времени проверять какое-то условие (будь то объект threading.Event, или просто будевая переменная). Соответственно, если условие выполнилось, тело потока должно немедленно завершиться, не доделывая начатое.

    Если ты не контролируешь, что происходит в теле потока, и не можешь разделить его работу на отдельные мелкие итерации (чтобы в промежутке между ними проверять условие), то хорошего решения нет.
    Ответ написан
    Комментировать
  • Пример команды с мутом?

    Vindicar
    @Vindicar
    RTFM!
    По команде на выдачу мута заноси в таблицу БД ID пользователя и время, когда надо снять мут.
    Также периодически (скажем, раз в несколько минут), выбирай из этой таблицы все записи, у которых время снятия мута меньше, чем текущее время. Если такие записи нашлись, снимаешь мут для пользователей, к которым они относятся, и удаляешь эти записи.
    Перезапуск бота такая схема переживает без нужды в дополнительных телодвижениях.

    Как сделать периодическую задачу, зависит от используемого языка и библиотеки - ты их не указал, кстати. Но это реализуемо в любом языке.
    Ответ написан
  • Python | Как получить общее количество пользователей в голосовых каналах моего Discord сервера?

    Vindicar
    @Vindicar
    RTFM!
    Как всегда, достаточно внимательно прочитать документацию.
    Guild.voice_channels: List[VoiceChannel]
    Т.е. это список, а ты дергаешь у него какие-то посторонние свойства.
    Вот у отдельного VoiceChannel и впрямь есть свойство members: List[Member].
    Как дальше, догадаешься?

    Что-то вроде
    sum(len(vc.members) for vc in member.guild.voice_channels)


    Этот подход удобен для инициализации количества участников при запуске бота.
    А вот для отслеживания можно не дергать вышеописанное каждый раз, а поступить иначе. Если before.channel is None, то человек вошел в войс-чат. Если after.channel is None, то человек вышел из войс-чата. Если ни тот ни другой, человек просто перешел из одного войс-канала в другой. Тогда хранишь количество юзеров, и делаешь ему +1/-1 согласно этим условиям.
    Ответ написан
    1 комментарий
  • Как реализовать поиск в sqlite на python?

    Vindicar
    @Vindicar
    RTFM!
    Это называется "нечеткий поиск", и это непростая тема. Как говорится в одном анекдоте, "длина, ширина, высота и глубина - это совсем не то же, что длинка, ширинка, высотка и глубинка".
    Ответ написан
    6 комментариев
  • Почему не добавляет роль по реакции?

    Vindicar
    @Vindicar
    RTFM!
    Удаление роли работает, а добавление нет?
    Первое, что бросается в глаза - при удалении роли не проверяется ID поста, на котором была поставлена реакция.
    ID точно задан корректно? Как целое число?
    Ответ написан
    5 комментариев