Задать вопрос
  • Как сделать, чтобы бот discord.py писал, что у него нету прав?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала
    async def rtest(ctx, *, member = discord.Member, role = discord.Role):

    Не "=" а ":". Это type hint, а не значение по умолчанию.
    discord.py сам преобразует указанные параметры в объекты Member и Role.
    Так что по идее достаточно будет написать
    await member.add_roles(role)
      await ctx.send("+")
    Ответ написан
  • Ошибка при получении пинга бота?

    Vindicar
    @Vindicar
    RTFM!
    from discord.ext.commands import bot
    Что это за импорт и зачем он тебе? Это внутренний модуль bot, а не объект bot, которым ты рулишь и про который говорится в доках.
    import discord
    from discord.ext import commands
    
    intents = discord.Intents.default()
    bot = commands.Bot(command_prefix='!', intents=intents)
    Ответ написан
    Комментировать
  • Почему у меня не создаться задача?

    Vindicar
    @Vindicar
    RTFM!
    Подозреваю, что дело в синхронном input(). Пока код стоит в нём, другие корутины не выполняются.
    В прииинципе можешь схитрить и использовать run_in_executor().
    Грубо говоря, он позволяет вынести длительный синхронный код в отдельный поток, и завернуть это в обычный task. Так что с точки зрения остальной програмы код становится как бы асинхронным.

    EDIT: а ещё есть пакет aioconsole - как раз для таких вещей.
    Ответ написан
    Комментировать
  • Как заставить бота отправлять сообщение раз в 30 секунд, Python Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, зачем тебе 2 main-блока?
    При этом обрати внимание, что первый main-блок не закончит работу, пока не закончит работу твоя корутина helloworld(), так как ты используешь метод run_until_complete(). А твоя корутина никогда не закончит работу.
    Используй loop.create_task(), чтобы запланировать выполнение корутины "в свободное время" работы системы и продолжить работу.
    if __name__ == '__main__':
      loop.create_task(helloworld())
      executor.start_polling(dp, skip_updates=True)


    Во-вторых, длительные синхронные операции в корутине блокируют её работу, и работу остальных корутин. Это основы асинхронного прогарммирования, блин!
    Поэтому твой time.sleep() вешает всего бота. Используй await asyncio.sleep(), она отдаст управление другим корутинам бота на время сна текущей корутины.
    Ответ написан
    Комментировать
  • Как запустить залитый на хостинг Python скрипт при переходе по ссылке?

    Vindicar
    @Vindicar
    RTFM!
    Скрипт должен запускаться на каком компе? На хостинге? Т.е. тебе, грубо говоря, нужен сайт на питоне? Смотри в сторону Flask, он простой и понятный. Ну и хостинг ищи. На худой конец можно арендовать виртуалку (VPS) и поставить нужное ПО туда.

    А вот если на компе кликнувшего, ну извини, не судьба. Если клиент решить скачать и запустить твой скрипт, то другое дело.
    Ответ написан
    Комментировать
  • Не робит токен для бота?

    Vindicar
    @Vindicar
    RTFM!
    Ну прочитай же внимательно сообщение об ошибке.
    discord.errors.PrivilegedIntentsRequired: Shard ID None is requesting privileged intents that have not been explicitly enabled in the developer portal. It is recommended to go to https://discord.com/developers/applications/ and explicitly enable the privileged intents within your application's page. If this is not possible, then consider disabling the privileged intents instead.

    У тебя бот просит интенты, которые не включены в настройках учётной записи бота (по ссылке).
    Либо умерь его аппетиты, запрашивая только те интенты, которые тебе реально нужны, либо включи их.
    Ответ написан
    Комментировать
  • Как спарсить таблицу python?

    Vindicar
    @Vindicar
    RTFM!
    Ищи все теги td. См. документацию по фильтрации в BS4.
    Содержимое тега будет лежать в свойстве .string у объекта тега. Можешь также посмотреть на атрибут class тега, доступный через ключ ['class']. На данном сайте он, похоже, обозначает позицию ячейки в таблице.
    Ответ написан
    Комментировать
  • Как сделать автоматический набор кода?

    Vindicar
    @Vindicar
    RTFM!
    Используй методы формальных грамматик (термин для гугла).
    Представим генерируемый текст как последовательность символов (символ != буква).
    У нас есть терминальные символы - это строки, которые будут встречаться в итоговом тексте. Например: "if", "for", ":"
    У нас есть нетерминальные символы - это обозначения сущностей в тексте. Например: ПРИСВАИВАНИЕ, ВЕТВЛЕНИЕ, ОПЕРАТОР, КЛАСС
    У нас есть аксиома - нетерминальный символ, с которого мы начинаем генерацию. Например, ПРОГРАММА.
    И, самое главное, у нас есть правила замены одних символов другими.
    Например:
    ПРИСВАИВАНИЕ = ПЕРЕМЕННАЯ "=" ВЫРАЖЕНИЕ

    Один символ может заменяться по нескольким правилам - выбор случаен (возможно с некоторым весом?)
    ВЕТВЛЕНИЕ = "if" ВЫРАЖЕНИЕ ":\n" ОТСТУП+ ОПЕРАТОРЫ ОТСТУП-
    ВЕТВЛЕНИЕ = "if" ВЫРАЖЕНИЕ ":\n" ОТСТУП+ ОПЕРАТОРЫ ОТСТУП- "else:\n" ОТСТУП+ ОПЕРАТОРЫ ОТСТУП-

    Чтобы генерировать цепочки символов, используй рекурсию. Первое правило продолжает цепочку, второе - прерывает.
    ОПЕРАТОРЫ = ОПЕРАТОРЫ "\n" ОПЕРАТОР
    ОПЕРАТОРЫ = ОПЕРАТОР

    Тебе также потребуется хранить некое глобальное состояние - использованные имена функций и переменных, текущий отступ, и т.п. То есть у тебя замена символа может требовать дополнительной логики, как для ОТСТУП+ и ОТСТУП-.

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

    Vindicar
    @Vindicar
    RTFM!
    random_team0 = random.choice(man) + ' из ' + random.choice(place)
    random_team1 = random.choice(prilag) + ' ' + random.choice(such)
    team_name = [random.choice(team), random_team0, random_team1]

    Этот код выполняется один раз при запуске бота, а не каждый раз при выполнении team(). Внеси его внутрь подпрограммы team().
    Ответ написан
    Комментировать
  • Не открывается окно tkinter?

    Vindicar
    @Vindicar
    RTFM!
    root.mainloop()
    Ответ написан
    Комментировать
  • Как сделать проверку ссылки в телеграм боте?

    Vindicar
    @Vindicar
    RTFM!
    Если вы не знаете, как искать наличие подстроки в строке (либо через оператор in, либо через метод index()), или как пользоваться регулярными выражениями, то вам рано браться за ботов. Начните с упражнений попроще, потом вернётесь к теме.

    Вот кроме шуток. Это основы стандартной библиотеки языка. Прежде чем бросаться что-то разрабатывать - их надо знать, хотя бы на уровне возможностей, т.е. "я не помню, как называется метод для перевода строки в нижний регистр, но я точно знаю, что он есть, пойду поищу".
    Ответ написан
    Комментировать
  • Выдает ошибку "int() argument must be a string, a bytes-like object or a real number, not 'NoneType' ", что делать?

    Vindicar
    @Vindicar
    RTFM!
    number=print(input("сколько человек в каждой команде? "))

    print() всегда возвращает None. Нафиг он вообще тут?
    Ответ написан
    Комментировать
  • Discord bot не начинает воспроизведение трека, что не так?

    Vindicar
    @Vindicar
    RTFM!
    Телепаты на карантине, так что придётся тебе самому раздобывать сообщение об ошибке.
    Например, с помощью модуля traceback. Импортируешь его, а потом в except пишешь что-то вроде
    except:
            await ctx.send("Не удалось выполнить команду:\n" + traceback.format_exc())


    Вообще except, который даже не пишет сообщение об ошибке ни в журнал, ни куда-то ещё - хуже чем бесполезен. Никакой возможности понять, что случилось и где это случилось.
    Ответ написан
    3 комментария
  • DISCORD BOT sqlite3.OperationalError: near "#": syntax error почему такая ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Не формируй SQL-запросы форматированием строк! Особенно если не знаешь SQL достаточно. Либо поймаешь ошибку синтаксиса, либо SQL-инъекцию.

    Используй placeholders, как показано в документации к модулю.

    import sqlite3
    
    con = sqlite3.connect(":memory:")
    cur = con.cursor()
    cur.execute("create table lang (name, first_appeared)")
    
    # This is the qmark style:
    cur.execute("insert into lang values (?, ?)", ("C", 1972))
    
    # The qmark style used with executemany():
    lang_list = [
        ("Fortran", 1957),
        ("Python", 1991),
        ("Go", 2009),
    ]
    cur.executemany("insert into lang values (?, ?)", lang_list)
    
    # And this is the named style:
    cur.execute("select * from lang where first_appeared=:year", {"year": 1972})
    print(cur.fetchall())
    
    con.close()
    Ответ написан
    Комментировать
  • Возможно выполнение одного из нескольких декораторов в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, если бы вы хоть немного представляли, что такое декоратор и как он работает, то идея с or вам бы в голову не пришла...
    А если бы покопались в документации, то нашли бы commands.check()
    def check_if_it_is_me(ctx):
        return ctx.message.author.id == 85309593344815104
    
    @bot.command()
    @commands.check(check_if_it_is_me)
    async def only_for_me(ctx):
        await ctx.send('I know you!')

    Очевидно, что внутри предиката (в примере он назван check_if_it_is_me) можно помещать самую разную логику проверок.
    Ответ написан
    Комментировать
  • Как указать тип данных Python?

    Vindicar
    @Vindicar
    RTFM!
    Если нужно указать типы в своём коде - используй type hints.
    Если нужно в чужом - найди/напиши stub-файлы.
    Ответ написан
    Комментировать
  • Как запускать метод каждую минуту?

    Vindicar
    @Vindicar
    RTFM!
    Ответ зависит от целого ряда факторов.
    1. Должна ли программа делать что-то ещё? Если да, то что именно?
    2. Сколько таких периодических методов будет существовать? Строго один, или может быть более? Должны ли у них быть разные периоды?

    Если программа синхронная, и метод только один, то можно использовать простой приём:
    import time
    
    stop = False
    def proc_to_call():
      global stop
      #Это твой периодический вызов
      #когда нужен останов, делаешь stop = True
      pass
    
    while not stop:
      time.sleep(60)
      proc_to_call()
    #код после цикла выполнится только после прерывания цикла.


    Если вызовов несколько и с разной периодичностью, то лучше использовать пакет schedule. Но у тебя всё равно будет бесконечный цикл вида
    while True:
        schedule.run_pending()
        time.sleep(1)

    И пока программа крутится в этом цикле, она не будет делать ничего другого.

    Если тебе нужно делать что-то параллельно с периодическим вызовом, то дело усложняется.
    Если твоя программа синхронная, то тебе потребуется отдельный поток выполнения.
    import threading
    
    class MyJob(threading.Thread):
      def __init__(self):
        super().__init__(self)
        self.stop = threading.Event()
    
      def proc_to_call(self):
        #Это твой периодический вызов
        pass
      
      def run(self):
        while not self.stop.wait(60):
          self.proc_to_call()
    
    job = MyJob()
    job.start()
    #код основного потока продолжает выполняться после этого
    #когда нужен останов, делаешь 
    job.stop.set() #сигналим об останове
    job.join() #ждём завершения потока

    Почему использую Event вместо простой логической переменной и time.sleep()? Потому что в случае с time.sleep() тебе придётся ждать конца минуты, прежде чем поток снова проверит логический флаг и поймёт, что пора останавливаться. А при использовании Event его установка тут же прервёт ожидание - и выйдет из цикла.

    А если твоя программа асинхронная, то всё упрощается, так как корутины уже могут чередовать своё выполнение, выполняясь "как бы параллельно". Можно использовать как schedule, так и простой цикл, просто не забывай использовать await asyncio.sleep() вместо time.sleep().
    Ответ написан
    3 комментария
  • Неправильное поведение Thread с target=lambda?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в первом случае тело потока (лямбда) захватывает через замыкание не значение i, а ссылку на i.
    К моменту старта в первом случае i будет иметь другое значение.
    Вот почему нужно использовать args - как во-втором случае. Тогда происходит захват значения - не через замыкание, а через параметр.
    Ответ написан
    4 комментария
  • Не работает многопоточность?

    Vindicar
    @Vindicar
    RTFM!
    Thread(target=egz_checkden(), args=())

    Когда уже погромисты научатся различать результат вызова функции (со скобками) и ссылку на функцию (без скобок).
    У тебя сейчас Питон пытается выполнить egz_checkden(), чтобы получить её возвращаемое значение и использовать его в качестве target.

    И да, у тебя в egz_checkden() бесконечная рекурсия, пусть и медленная. Вылетит с переполнением стека, хотя и не сразу. Не делай так, используй нормальный цикл.
    Ответ написан
    4 комментария