Ответы пользователя по тегу Боты
  • Как сделать так, чтобы дискорд бот не трогал права администратора, модератора и не привлекал их к нарушению?

    Vindicar
    @Vindicar
    RTFM!
    Igor Pecherskih, читай документацию. Достаточно проверить, есть ли у целевого пользователя некоторый минимальный набор прав модера - и тогда будет непринципиально, как роль модератора называется да и есть ли она вообще.
    Ответ написан
  • Выдаёт ошибку в боте для тг, не получается вызвать функцию, как это починить?

    Vindicar
    @Vindicar
    RTFM!
    Уф. Тут очень много проблем. В первую очередь с пониманием того, как выполняется скрипт на питоне, и областей видимости.
    Для начала:
    if call.data == "yes":
          bot.send_message(call.message.chat.id, "Отлично")
          game = True

    Ты присваиваешь значение локальной переменной game, а не глобальной, которую ты описал выше.
    Далее:
    if game == True:
      def play(message):
        ...
    else:
      bot.send_message(message.from_user.id, "Напиши /reg")

    Ты понимаешь, что этот код объявлен вне функции? Как следствие, он выполнится один раз, при старте скрипта. У тебя game в этот момент не будет равно True, и функция play() не будет определена.

    Боты - это не простая тема, а боты с автоматами состояний - тем более. Поучи Питон сначала, кроме шуток.
    Ответ написан
    Комментировать
  • Как создать 'фиктивный' канал для captcha.not?

    Vindicar
    @Vindicar
    RTFM!
    Сделать канал, назначить его каналом по умолчанию.
    Пользователям по умолчанию (@everyone) показывать только этот канал.
    По вводу капчи давать пользователю роль, роль настроить так, чтобы этот канал им не был виден, но были видны все остальные.
    Ответ написан
    Комментировать
  • Почему пишет NameError: name 'message' is not defined?

    Vindicar
    @Vindicar
    RTFM!
    def callback_inline(call):
    У функции нет ни параметра message, ни локальной переменной message. А дальше у тебя идёт обращение к такой переменной по имени message - message.chat.id.
    Ответ написан
  • Какой декоратор отработал @dp.callback_query_handler или @dp.message_handler?

    Vindicar
    @Vindicar
    RTFM!
    Сделать отдельную функцию, чтобы у каждой был свой декоратор. Общую часть можно вынести в третью функцию, без декоратора, и вызывать её самостоятельно.
    Ответ написан
    Комментировать
  • Выдает ошибку "TypeError: 'module' object is not subscriptable" что делать?

    Vindicar
    @Vindicar
    RTFM!
    Что такое config? Судя по сообщению об ошибке, это модуль, т.е. где-то выше у тебя import config. Что ты пытался этим сделать?

    Ну и да, пусть бот проверяет id отправителя на совпадение с твоим.
    Ответ написан
  • Почему код выдает ошибку?

    Vindicar
    @Vindicar
    RTFM!
    Передаваемые значения для execute() должны быть завёрнуты в кортеж, т.е.
    execute('INSERT INTO foo VALUES (%s, %s)', ('bar', 'baz'))

    Ну и да, проверь синтаксис SQL-запроса.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы дискорд бот на python воспринимал ещё одно сообщение после if?

    Vindicar
    @Vindicar
    RTFM!
    Не очень понятно, что ты хочешь. Но тебе нужно решить:
    а) Или у тебя последовательность сообщений не важна, тогда вопрос стоит только в формулировании правильных условий.
    б) Или у тебя последовательность сообщений важна, тогда нужно для каждого пользователя помнить, на каком месте последовательности он остановился. Эту информацию придётся хранить самому.

    Есть, конечно, вариант с wait_for() (если у тебя discord.py а не что-то другое), но он тоже не из простых.
    Ответ написан
  • TypeError: unhashable type: 'list'?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе довольно таки прямо сказано: списки не являются хэшируемым типом (так как они изменяемы). А потому они не могут использоваться как ключи в словаре или элементы множеств.
    А у тебя:
    new = dict()
    p = [i for i in n]

    и обращение к new[p].
    Ответ написан
    Комментировать
  • Как редактировать сообщение бота в Discord // python?

    Vindicar
    @Vindicar
    RTFM!
    Если ты используешь discord.py, то примерно так
    1. Узнать id канала (он неизменен, его можно прописать в коде), получить его объект через метод бота .fetch_channel()
    2. Узнать id сообщения(он неизменен, его можно прописать в коде), получить объект сообщения через метод канала .fetch_message()
    3. Вызываешь метод .edit() сообщения.

    Читай документацию, там много интересного.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы без выполнения @dp.message_handler(commands='Висельница') - start_game() не выполнялась @dp.message_handler()-game?

    Vindicar
    @Vindicar
    RTFM!
    Это называется машина состояний. Упрощённо, тебе нужно хранить для каждого участника сведения о том, играет он или нет. Например, словарь, где ключ - ID участника а значение - состояние игры. Если ID нет в словаре, то участник не играет.
    Решение Kvason плохо тем, что оно работает только для одного собеседника, т.е. либо все играют, либо никто не играет.
    Ответ написан
    1 комментарий
  • Как сделать чтобы при вводе команды писались все участники роли. discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ты документацию читал? Там нужная информация есть.
    А что касается задания роли - указываешь тип параметра команды discord.Role, и 90% дела сделано.
    Ответ написан
  • Как сделать сообщение бота ответом на команду?

    Vindicar
    @Vindicar
    RTFM!
    Может и слепой.
    Берешь свойство message у контекста, получаешь объект сообщения. У него есть метод reply().
    Ответ написан
    Комментировать
  • Как перенести код с консольного питона на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    1. Поучи, как работают асинхронная программа, и почему цикл вида
    while True:
        schedule.run_pending()

    парализует её работу.
    2. Портируй код с использованием асинхронного aioschedule.
    Ответ написан
    8 комментариев
  • Что делать если при попытке выдачи роли через бота дискорд появляется ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Что делать? Открыть глаза, прочитать ошибку, понять ошибку. Мыслить логически.
    await req(guild_id, user_id, role.id, reason=reason)
    AttributeError: 'NoneType' object has no attribute 'id'

    "У None нет атрибута id". Т.е. вместо некоего объекта с атрибутом id передали None.
    Смотрим на строку кода и ищем обращение к атрибуту id. Это role.id, т.е. вместо параметра роли в метод передали None.
    Смотрим выше, пока не найдём ссылку на строку не из discord.py.
    await author.add_roles(role)
    Т.е. твоя переменная role имеет значение None.
    Ищем эту строку в коде, потом смотрим выше откуда взялось role.
    role = guild.get_role(940997266100064316)
    Смотрим документацию на get_role().
    Returns the role or None if not found.

    Т.е. role может содержать None, если переданный id не соответствует роли в этом сервере.
    Вот тебе и ответ. Перепроверь id, который ты передаёшь в get_role().
    Ответ написан
    Комментировать
  • Как исправить ошибку с выдачей роли в дискорд боте пайтон?

    Vindicar
    @Vindicar
    RTFM!
    что еще за self.get_guild(), и почему нельзя взять guild из ctx?
    Сейчас discord.py ожидает, что self будет передана как параметр при вызвое команды пользователем.
    Ответ написан
    Комментировать
  • Где перечислено это, что используется в хендлере?

    Vindicar
    @Vindicar
    RTFM!
    1. По приведённой ссылке описывается API запросов Телеграма, а не API для питон кода. Используй одну из библиотек, вроде pyTelegramBotAPI или aiogram. У первого доки получше, вроде.
    2. Если используешь aiogram, то в асинхронность вникать придётся. pyTelegramBotAPI использует синхронный код. В чём-то это будет проще, в чём-то - сложнее.
    Ответ написан
  • Нужна помощь с sqlite3, discord.py?

    Vindicar
    @Vindicar
    RTFM!
    В коде неправильного больше чем правильного...
    1. У тебя написано, что команда должна получить два параметра - text и id. Если id она должна найти сама, то его нужно убрать из параметров купить(). id нужно получить из ctx.author.id.
    2. Ты вообще пробовал обращаться к своей базе? Смотрел, что тебе возвращает fetchone()?
    По твоему запросу она вернёт либо кортеж с одним значением, либо None, если не было найдено ни одной подходящей строки.
    Ни то ни другое сравнивать непосредственно нельзя!
    Вытащи результат в переменные, проверь на None, а потом уже сравнивай нулевые элементы.
    3. Убери токен бота из тела вопроса.
    4. Советую cursor создавать внутри обработчика, во избежание заморочек с одновременным использованием.
    5. Советую указывать типы параметров в описании команды! discord.py обращает на них внимание, и пытается конвертировать входную строку.
    async def купить(ctx, text: str):
    6. Как уже было написано, execute() принимает вторым параметром КОРТЕЖ, пусть даже из одного элемента. А кортеж из одного элемента пишется как (item,).
    Ответ написан
  • Как исправить ошибку с одновременными запросами в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    1. Первый пользователь посылает сообщение. Запускается копия search_vk() и выполняет синхронный запрос:
    user_data = vk_parser.get_user_data(user_id)
    Пока запрос выполняется, бот стоит, так как код синхронный.
    2. get_user_data() деляет глупости вида
    with open("FIO.txt", "w") as file: #открываем один и тот же файл для любого запроса

    или
    global bio # используем одну и ту же переменную для любого запроса

    Ну и прочие медиа-файлы тоже одни и те же для разных запросов.
    3. Обработчик сообщения первого пользователя доходит до строки
    loading = await message.answer('<b>Идёт поиск</b>')

    Так как это await-вызов, планируется вызов корутины, и асинхронная программа переходит к следующей доступной операции, пока выполняется отправка сообщения. Собранные данные лежат в файлах.
    4. Второй пользователь посылает сообщение. Запускается ещё одна копия search_vk() и тоже выполняет синхронный запрос get_user_data(). Второй вызов get_user_data() перезаписывает данные в файлах.
    5. Обработчик сообщения второго пользователя доходит до строки
    loading = await message.answer('<b>Идёт поиск</b>')

    и засыпает, пока сообщение отправляется.
    6. Тем временем сообщение первого пользователя отправилось. Обработчик получает управление, и отправляет содержимое файлов - которое было перезаписано, заодно закрывая их.
    7. Сообщение второго пользователя отправилось. Его копия search_vk() пытается отправить файлы, но первый обработчик их уже закрыл.
    Дело ещё осложняется сетевым лагом, так что трудно сказать, кто в итоге будет первым.

    Если по прочтению ты ещё не понял, в чём дело, скажу прямо: не используй глобальные объекты, будь то файлы или переменные, в конкурентной среде! Убедись, что каждая копия обработчика запроса имеет свои хранилища для данных! Локальные переменные безопасны, они создаются каждый раз заново. Если не можешь обойтись без файлов на диске, либо используй модуль tempfile, либо привяжи их имена к ID отправителя сообщения, чтобы хотя бы разные пользователи не сталкивались лбами.
    Ответ написан
    Комментировать