Ответы пользователя по тегу Python
  • Как сказать что-то от имени бота в Discord?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Функция channel_conv ищет в первом слове канал, если не находит - отправляет None, которое создает при попытке отправки исключение, приводящее к отправке в текущий канал

    ctx, *, text - звездочка означает, что в text будут записываться все идущее после ctx

    split - разбивает строку в список
    isdigit - проверят, является ли строка числом
    replace - заменяет фрагмент в строке на другой данный (В данном случае канал заменяется на пустое место, чтобы в случае отправки в другой канал его не отправляло вместе с текстом)

    async def say(ctx, *, text):
        def channel_conv(text):
            value  = text.split(" ")
            string = value[0]
    
            if string.isdigit():
                return (
                    client.get_channel(int(string)),
                    text.replace(string, "")
                )
            elif string.startswith("<#"):
                return (
                    client.get_channel(int(string[2:20])),
                    text.replace(string, "")
                )
            else:
                return (
                    None,
                    text
                )
    
        try:
            channel = channel_conv(text)
            await channel[0].send(channel[1])
        except:
            await ctx.send(text)


    Так же можно использовать конвертер из оригинальной библиотеки:
    from discord.ext.commands import TextChannelConverter


    Код:
    async def say(ctx, *, text):
        v = text.split(" ")
    
        try:
            channel = await TextChannelConverter().convert(ctx = ctx, argument = v[0])
            await channel.send(text.replace(v[0], ""))
        except:
            await ctx.send(text)
    Ответ написан
    2 комментария
  • Как узнать пользовательский статус?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    В discord.py подразумевается, что у пользователя может быть 3 вида статусов (Мобильный, Веб и Десктопный)

    А так попробуйте так:
    if str(member.status) == 'online':
         d = "<:online2:842130462038425653> В сети"
    elif str(member.status) == 'idle':
         d = "<:away:842130479339667497> Не активен"
    elif str(member.status) == 'dnd':
         d = "<:dnd2:842130417406181436> Не беспокоить"
    elif str(member.status) == 'offline':
         d  = "<:offline2:842130438209536000> Не в сети"
    elif str(member.status) == "streaming":
        d = "<:streaming:846048619571314719> Стримит"
    Ответ написан
    Комментировать
  • Как удалить роль у пользователя по истечении времени?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Попробуйте так

    import asyncio
    
    async def ping(ctx):
        role = ctx.guild.get_role(863103946063478824) 
        await ctx.author.add_roles(role, reason=None)
        await asyncio.sleep(300)
        await ctx.author.remove_roles(role, reason=None)
    Ответ написан
  • Как работать с несколькими пользователями VK_API BOT Python?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Попробуйте использовать VkWave или VkBottle (Асинхронные библиотеки).
    Это может помочь с решением вашей проблемы
    Ответ написан
    Комментировать
  • Fetch_member в функции?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Можете использовать bot.get_guild(id)

    Если у вас коги, то это в классе делать и там уже self.bot.get_guild(id)
    Ответ написан
    Комментировать
  • Как импортировать модуль tkinter питон?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Если у вас OS семейства Linux (Как погляжу по директории home), то ниже.
    Если Windows, то тут устанавливать Python выше желательно уже.

    Попробуйте использовать команды:
    sudo apt-get install python3-tk 
    sudo apt-get install python3.6-tk
    sudo dnf install python3-tkinter


    И на крайняк может помочь: sudo apt-get install python3.7-tk

    А так посоветую обновить версию python
    Ответ написан
    Комментировать
  • Как отправить эмодзи через discord.py?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Надо использовать полное имя эмодзи.
    Его можно получить, набрав само эмодзи и поставив перед ним знак \.

    Само полное название будет формата: <:имя_эмодзи:id_эмодзи>
    Ответ написан
  • Как сделать ярлык с помощью python?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Можете попробовать вот так
    import os
    from win32com.client import Dispatch
    
    path = os.path.join("Путь, куда сохранять", "Name.lnk")
    
    target = r"Полный путь к файлу"
    wDir   = r"Путь к папке с файлом"
    icon   = r"Путь к иконке с файлом (Можно к .exe)"
    
    shell    = Dispatch('WScript.Shell')
    shortcut = shell.CreateShortCut(path)
    
    shortcut.Targetpath       = target
    shortcut.WorkingDirectory = wDir
    shortcut.IconLocation     = icon
    
    shortcut.save()
    Ответ написан
    Комментировать
  • TypeError: Object of type Embed is not JSON serializable. Как исправить?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Как знаю - File не может принимать значение байтов, по-этому сначала можно попробовать конвертировать его в изображение с помощью PIL (Pillow)
    from PIL import Image

    Сам код:
    @commands.command()
    @commands.guild_only()
    async def tweet(self, ctx, *, message):
        api     = nekobot.NekoBot()
        message = str(api.tweet(ctx.author.display_name, message))[18:-59]
      
        async with aiohttp.ClientSession() as ClientSession:
            async with ClientSession.get(message) as reslink:
                res   = await reslink.read()
                data  = io.BytesIO(res)
                image = Image.open(data)
    
                file = io.BytesIO()
    
                image.save(file, format="PNG")
                file.seek(0)
    
                embed = discord.Embed(color = 0x33FF57).set_image(url = "attachment://tweet.png")
                
                await ctx.send(embed = embed, file = discord.File(image, filename="1.png"))


    Если не работает можете комментарий написать, уже у себя потестирую. Сейчас просто не особо времени нет
    Ответ написан
    3 комментария
  • Как сделать задержку на команду в боте дискорд?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    У discord.py это уже предусмотрено, вы можете добавить декоратор:
    @commands.cooldown(1, (Время задержки), commands.BucketType.user)


    Для вывода необходимо использовать событие:
    async def on_command_error(ctx, error):
        if isinstance(error, commands.CommandOnCooldown):
            embed = discord.Embed( 
                title = 'Команда на задержке.', 
                description = f'Повторить через `{error.retry_after :.0f} секунд', 
                colour = discord.Color.red() 
            )
    
            return await ctx.send(embed = embed)
    Ответ написан
    3 комментария
  • Почему после использования pyinstaller вместо exe файла появляется "разделяемая библиотека"?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Pyinstaller используется с некоторыми тегами. В вашем случае необходим: --onefile
    Ответ написан
    1 комментарий
  • Как исправить missing permission?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Данная ошибка означает, что у бота нет необходимых прав для очистки канала.
    Просто необходимо выдать боту права и все будет работать
    Ответ написан
    Комментировать
  • Как отправлять скриншот экрана компьютера в вк через бота написанного на Python?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Вот, попробуй.

    import mss
    import vk_api
    import requests
    
    from random import randint
    
    FILE_NAME = "1.png"
    
    vk_session = vk_api.VkApi(token = 'ТУТ_ТОКЕН') # Можно получить вбив в Google
    vk         = vk_session.get_api()
    
    with mss.mss() as sct:
        sct.shot(output = FILE_NAME)
    
    url   = vk.photos.getMessagesUploadServer()['upload_url']
    photo = requests.post(url, files = {'photo': open(FILE_NAME, 'rb')}).json()
    save_ = vk.photos.saveMessagesPhoto(server = photo['server'], photo = photo['photo'], hash = photo['hash'])[0]
    
    vk.messages.send(
        user_id    = 0, # ТУТ ID ЮЗЕРА
        random_id  = randint(-2147483648, 2147483647),
        attachment = "photo%s_%s" % (save_['owner_id'], save_['id'])
    )
    Ответ написан
    Комментировать
  • Как Найти канал по названию и отправить в него сообщение?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    @bot.command()
    async def send(ctx):
        for channel in ctx.author.guild.channels:
            if channel.name == ТУТ_НАЗВАНИЕ_КАНАЛА:
                await channel.send(ТУТ_СООБЩЕНИЕ)


    Если надо чтобы все серверы проверяло:
    @bot.command()
    async def send(ctx):
        for guild in bot.guilds:
            for channel in guild.channels:
                if channel.name == ТУТ_НАЗВАНИЕ_КАНАЛА:
                    await channel.send(ТУТ_СООБЩЕНИЕ)
    Ответ написан
    Комментировать
  • Не работает on_member_join. Как исправить?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Если вы не знали - коги создаются отдельными файлами. И в предоставленном вами коде я не вижу client.run(), внутри которого указывается токен.

    Вот пример как можно изменить ваш код, при этом он должен работать (Если не работает - упомяните в комментарии, я проверю ошибки и исправлю)

    Основной файл:
    main.py
    import discord
    
    from discord.ext import commands
    
    
    client = commands.Bot(
        command_prefix = "Тут любой префикс",
        intents        = discord.Intents().all()
    )
    
    client.load_extension("Welcome")
    
    client.run("Тут должен быть токен")


    Файл кога (На заметку: Данный код рассчитан, что они будут в одной папке)
    Welcome.py
    import discord
    
    from discord.ext import commands
    
    
    class Welcome(commands.Cog):
        def __init__(self, client):
            self.client = client
    
        @commands.Cog.listener()
        async def on_member_join(self, member):
            welcome     = 'Чтобы попасть на сервер тебе нужно пройти верификацию. Ты готов?\n`по возможности ответь "да, хорошо"`'
            channel_age = self.client.get_channel(847966940844261448)
            embed       = discord.Embed(
                title       = f"{member.name} добро пожаловать на сервер!", 
                description = f"{member.guild.name} приветствует тебя!"
            ).set_thumbnail(url = member.avatar_url)
    
            await channel_age.send(embed = embed)
            await channel_age.send(welcome)
    
    def setup(client):
        client.add_cog(Welcome(client))
    Ответ написан
    Комментировать
  • Какой модуль нужно использовать для управления древом каталогов?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Как мне известно - нет, но все в ваших руках и ограничивается лишь способностями, временем и знаниями. Можно самому сделать

    Вот небольшая версия (Просто для примера)

    import os
    import os.path
    
    now_path = "C:/"
    
    while True:
        cmd = input(f"{now_path}>")
    
        if cmd == "":                 continue
        elif len(cmd.split(" ")) > 1: cmd = cmd.split(" ")
        else:                         cmd = [cmd]
    
        if cmd[0] == "cd":
            if os.path.exists(f"{now_path}{' '.join(cmd[1:len(cmd)])}"):
                now_path += ' '.join(cmd[1:len(cmd)])
            else:
                print(f"Директория {cmd[1:len(cmd)]} не найдена")
            continue
        if cmd[0] == 'ls':
            cataloge = os.listdir(now_path)
            print(', '.join(cataloge))
            continue
    Ответ написан
    Комментировать
  • Как строить Embed из полученного в команде JSON?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Вот как вы просили. Если есть вопросы по использованию - можете написать в коменатрии

    import json
    from discord import Embed
    
    def get_embed(json_):
        embed_json = json.loads(json_)
    
        embed = Embed().from_dict(embed_json)
        return embed
    
    @bot.command(name = 'embed')
    async def embed_send(ctx, channel: discord.TextChannel, *, args):
        embed = get_embed(args)
        
        if channel == "-":
            await ctx.send(embed = embed)
        else:
            await channel.send(embed = embed)
    Ответ написан
    6 комментариев
  • Как в Discord.py сделать создание приваток на 2 серверах?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    В вашем коде указана такие строки как:
    for guild in Bot.guilds:
        maincategory = discord.utils.get(guild.categories, id=848659633664032829)


    Стоит учесть, что название категорий у каждого сервера разные.
    Вот, по идеи данный код должен работать (Если не работает, напишите в коментариях, проверю уже полностью что да как):
    @Bot.event
    async def on_voice_state_update(member, before, after):
        if after.channel != None:
            if after.channel.id == 843730990408007698:
                category = after.channel.category
                
                channel2 = await member.guild.create_voice_channel(
                    name     = f' || { member.display_name }', 
                    category = category
                )
                
                await channel2.set_permissions(member, connect = True)
                await member.move_to(channel2)
    
                def check(x, y, z): return len(channel2.members) == 0
                
                await Bot.wait_for('voice_state_update', check = check)
                await channel2.delete()
    Ответ написан
  • Почему возникает ошибка в при запуске файла питон?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    1. Возможно дело в кодировке (Должна стоять utf-8)
    2. Возможно где-то используется символ /

    Но без кода сказать что-либо сложно
    Ответ написан
    1 комментарий
  • Как сделать что бы при вводе команды бот выдавал роль?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    1. При написании была допущена ошибка в слове discord (Лишняя s сзади)
    2. Для использования discord.utils - его надо импортировать отдельно
    3. (Это конечно ваше дело) Меня напрягают как у вас прописаны интесты, вы сначала их задаете на сообщения и сервера, потом устанавливаете дефолтные с пользователями (Проще тогда уже использовать discord.Intents.all())

    import discord
    import discord.utils
    
    from discord.ext import commands
    
    intents = discord.Intents(messages=True, guilds=True)
    intents = discord.Intents.default()
    intents.members = True
    
    client = commands.Bot(command_prefix='!', intents=intents)
    
    @client.event
    async def on_ready():
        await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="#Общение"))
        print("Bot is ready!")
    
    @client.command()
    async def admin(ctx):
      member = ctx.author
      role   = discord.utils.get(member.guild.roles, id = 852691194433503232)
      
      await member.add_roles(role)
    Ответ написан
    Комментировать