Как получить id сервера discord py
Перейти к содержимому

Как получить id сервера discord py

  • автор:

Как в discord.py узнать ID сервера?

Это можно сделать через ctx.message.guild.id ! Вот пример кода:

@client.command(aliases=['guildid', 'id']) async def айди(ctx): await ctx.reply(f'Здравствуйте! Айди данного сервера: ') 

извиняюсь за белую тему

Вот как это будет выглядить в живую ((((извиняюсь за белую тему)))):

Вы можете как либо изменять данный код. Если нужна помощь, то пишите комментарий! Удачного дня

Welcome to discord.py¶

discord.py is a modern, easy to use, feature-rich, and async ready API wrapper for Discord.

Features:

  • Modern Pythonic API using async / await syntax
  • Sane rate limit handling that prevents 429s
  • Command extension to aid with bot creation
  • Easy to use with an object oriented design
  • Optimised for both speed and memory

Getting started¶

Is this your first time using the library? This is the place to get started!

  • First steps:Introduction | Quickstart | Setting Up Logging
  • Working with Discord:Creating a Bot Account | A Primer to Gateway Intents
  • Examples: Many examples are available in the repository.

Getting help¶

If you’re having trouble with something, these resources might help.

  • Try the Frequently Asked Questions first, it’s got answers to all common questions.
  • Ask us and hang out with us in our Discord server.
  • If you’re looking for something specific, try the index or searching .
  • Report bugs in the issue tracker.
  • Ask in our GitHub discussions page.

Extensions¶

These extensions help you during development when it comes to common tasks.

  • discord.ext.commands – Bot commands framework
  • discord.ext.tasks – asyncio.Task helpers

Manuals¶

These pages go into great detail about everything the API can do.

  • API Reference
  • Interactions API Reference
  • discord.ext.commands API Reference
  • discord.ext.tasks API Reference

Meta¶

If you’re looking for something related to the project itself, it’s here.

  • Changelog
  • Version Guarantees
  • Migrating to v2.0
  • Migrating to v1.0

Руководство по использованию библиотеки discord-py

Вероятнее всего у вас уже имеется созданный бот, поэтому инструкция по его созданию будет пропущена (но, возмжно появится позже).

Прежде чем начать…

Прежде чем приступать к работе с ботом, я сразу рекомендую зайти на страницу вашего бота и включить намерения ( intents , подробнее). Для этого зайдите в раздел приложений и выберите вашего бота. Затем, слева, на вкладке «Bot»

Бот

Включите параметры PRESENCE INTENT и SERVER MEMBERS INTENT

введите сюда описание изображения

После этого выдайте намерения в коде при инициализации бота

Намерения нужны для работы с некоторыми событиями, объектами пользователей серверов ( участник / member ) и др. Они вам точно понадобятся, поэтому лучше включить их сразу, чтобы потом не спрашивать, почему вам не удается получить данные о пользователе сервера или чего-либо еще.

Начало работы с ботом и discord-py

Бот, которого вы создали на странице приложений, является аккаунтом дискорда, который по сути является таким же пользовательским аккаунтом, как и ваш, но с атрибутом bot и некоторыми ограничениями. Чтобы бот начал что-то делать, нужно создать его в коде и прописать логику.

Для начала рассмотрим виды ботов, которые предоставляет библиотека:

  • discord.Client — фактически, самый базовый бот, на котором основаны другие. Умеет обрабатывать события по типу получения сообщений on_message() , установки реакции on_raw_reaction_add() и другие.
  • discord.ext.commands.Bot — тот же discord.Client , только умеет находить в сообщениях и обрабатывать отдельные команды, которые начинаются с какого-либо префикса, например !test
  • discord.ext.commands.Cog — про этого бота ничего сказать не могу, так как ни разу не использовал. Насколько мне известно, он нужен в тех случаях, когда вы планируете задать боту кучу разных комманд, событий и организовать все это в один отдельный класс.

В общем-то, выбор бота зависит напрямую от цели использования. Если вам нужен простой бот, который будет читать чат, фильтровать мат и т.п., считывать реакции, выдавать роли при входе нового пользователя и т.д., то вам хватит базового бота discord.Client .

Если помимо того, что я написал выше, вы хотите добавить еще и обработку команд по типу !ban , !play , !погода и т.п., то использовать надо именно discord.ext.commands.Bot .

Пишем код

Теперь, когда вы определились с ботом можно наконец-то приступить к написанию кода.

Для начала подключим библиотеку.

import discord 

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

В случае, если вы хотите использовать discord.ext.commands.Bot , я бы сразу отдельно добавил еще и этот класс

from discord.ext import commands 

Инициализация бота

Теперь создадим объект бота, который будет обрабатывать события и команды:

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

Он принимает строку ( str ), по которой бот будет определять, то что сообщение является командой и обрабатывать его нужно именно как команду.

Помимо этого, выдадим боту намерения ( intents ), инструкция по настройке которых была в начале.

В качестве префикса команды укажем ! , намерения нужно выдавать именно те, которые вы будете использовать, но на первое время можно выдать все, то есть discord.Intents.all()

Если у вас discord.ext.commands.Bot :

bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) 

Если у вас discord.Client , то префикс указывать не нужно (класс не принимает такого аргумента):

bot = discord.Client(intents=discord.Intents.all()) 

Основные обработчики событий

Теперь у нас есть объект bot , для которого нужно написать логику взаимодействия.

В качестве обработчиков событий используются асинхронные ( async ) функции ( def ), помеченные декоратором @bot.event , где bot — название объекта вашего бота. Функция должна иметь название, строго как в документации — иначе событие просто не будет обработано.

Если коротко, то все, что делает декоратор @bot.event — это помещает написанную вами функцию в другую функцию из библиотеки discord , которая, в свою очередь, передает вашей функции какие-либо параметры. Поэтому, если не пометить функцию декоратором, discord не обратит на нее внимание и она не будет вызвана.

async def on_ready()

Первым делом, нужно удостовериться, что бот успешно запустился и готов к работе. В списке событий находим событие on_ready() , которое вызывается один раз при запуске кода и обозначает то, что бот загрузился и готов к работе.

Здесь нужно отметить, что в этой функции не следует размещать фрагменты кода, которые должны будут выполняться в дальнейшем, так как функция будет вызвана только один раз. Поэтому в этой функции можно разместить какое-либо сообщение, о том, что бот запущен и, если есть работа с данными из файлов, то самое время их подгрузить. В общем, выполнить все единоразовые процедуры.

Выглядеть это будет вот так:

@bot.event async def on_ready(): # сам по себе объект bot (discord.ext.commands.Bot) не содержит имени бота # зато содержит объект пользователя, которым он является # а вот объект пользователя уже хранит в себе имя print(f'bot.user.name> запустился и готов к работе!') 
async def on_message(message)

Добавим обработчик сообщений, чтобы получать вызов функции каждый раз, когда bot получает сообщение в ЛС или на сервере.

В списке событий находим событие on_message(message) , которое принимает обязательный аргумент message . Этот аргумент имеет тип discord.Message из которого вы можете получить текст сообщения, а также объекты автора сообщения, сервер, канал, вложения, реакции, упоминания, ссылку на сообщение и много чего еще

@bot.event async def on_message(message): print(f'Получено сообщение! Текст: message.content>, Сервер: message.guild>') 

Здесь вы можете прописать любую логику взаимодействия. Хоть даже удалять все только что переданные обработчиком сообщения (главное чтобы у бота были на то права). Самое главное — задать функции аргумент, который будет принимать объект сообщения. Вы можете назвать его как хотите, например даже так: async def on_message(soobshenie) , главное чтобы он был.

Если аргумент не указать, то при вызове события нового сообщения, discord-py отправит в функцию on_message() аргумент, содержащий объект сообщения, но получит ошибку о том, что указанная функция не принимает аргументов и ничего работать не будет. Это равноценно созданию функции, которая должна считать сумму 2 переданных в виде аргументов числа, но при этом она не принимает их.

Другие события

По аналогии с примерами, приведенными выше, можно создать обработчик любого другого события, предствленного в discord-py . Главное, чтобы совпадало название и принимаемые аргументы.

Примеры других часто используемых событий:

on_raw_reaction_add(payload) , on_raw_reaction_remove(payload) — события добавления и удаления реакции с сообщения, соответствено. Из объекта payload вы можете получить сервер, сообщения и прочую инфу

on_member_join(member) , on_member_remove(member) — события подключения и выхода участника с сервера, в качестве аргумента принимает объект участника из которого можно получить всю информацию о пользователе.

Остальное вы можете найти в списке событий.

Запуск бота

У вас уже есть объект бота и, вероятно, обработчики событий. Теперь бота нужно запустить.

При помощи токена, который нужно скопировать на странице бота, в разделе приложений вы можете авторизоваться в аккаунте бота.

Для этого у объекта bot нужно вызвать функцию run() :

TOKEN = '' # здесь ваш токен bot.run(TOKEN) 
Особенности

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

Бот будет выполнять работу до дех пор, пока вы не завершите выполнение кода. Это означает, что если вы закроете консольное окно программы, то бот перестанет работать и обрабатывать какие-либо события.

Чтобы бот работал без вашего участия, его можно поставить на хостинг — тогда он будет постоянно запущен на удаленном сервере, а не на вашем устройстве. Например, можно использовать бесплатный хостинг Heroku. В интернете есть куча разных туториалов по настройке. Возможно, когда-нибудь здесь появится ссылка на мой 🙂

В итоге должен получиться примерно такой код, посмотреть который можно здесь.

Данный бот выводит сообщение при успешном запуске, а также подробную информацию о каждом полученном сообщении.

Для этого примера достаточно было бы простого бота discord.Client , так как он обрабатывает только события. Но я наперед прописал в коде бота discord.ext.commands.Bot , так как дальше в этот код мы будем добавлять обработку команд.

Обработка отдельных команд

Напоминаю, что для работы с командами, в качестве бота нужно использовать объект discord.ext.commands.Bot , а не discord.Client ! Не забудьте также про префикс

  • Команды бота, как и обработчики событий, являются асинхронными функциями ( async def ).
  • Чтобы discord-py обнаружил команду в коде, функцию нужно пометить декоратором @bot.command() , где bot — название объекта вашего бота. Скобки в декораторе @bot.command() обязательны, в отличии от @bot.event , так как декторатор discord.ext.commands.Command() принимает необязательные аргументы. Без скобок декоратор корректно работать не будет. *Подробнее про декораторы можно почитать выше
  • В отличии от обработчиков событий, функцию можно назвать как захочется — название функции станет названием команды.
  • Любая функция, являющаяся командой, должна принимать обязательный аргумент ctx (можно назвать как угодно). Аргумент является контекстом ( discord.ext.commands.Context ) выполнения команды, из которого можно получить сервер, автора, сообщение, канал и др. информацию. При вызове команды, Контекст в функцию передает библиотека discord-py .
Перед созданием первой команды

Для начала, если у вас в коде есть обработчик событий on_message() , его нужно немного доработать.

Из документации видим, что у объекта пользователя ( discord.User ) есть свойство bot , имеющее тип bool . Значит, если свойство имеет значение True — пользователь является ботом, иначе — не является)

Допишем условие, чтобы сообщения от любых ботов (включая нашего) игнорировались. Это часто делается для того, чтобы другие боты не могли спамить вызовами команд, обработка которых сначала проходит через on_message() , ведь любая команда в дискорде по сути является просто сообщением.

Для этого, кстати, в on_message() нужно добавить еще одну строку await bot.process_commands(message) , которую можно найти в списке методов объекта discord.ext.commands.Bot . Метод принимает в качестве аргумента сообщение с типом discord.Message и нужен для того, чтобы проверять, являестя ли сообщение командой. Многие, забыв добавить эту строку, потом не понимают, почему их бот игнорирует команды (подробный разбор проблемы)

@bot.event async def on_message(message): if message.author.bot: return await bot.process_commands(message) 

Ключевое слово return завершает выполнение функции, то есть код, который идет дальше, так или иначе не будет выполнен.

Создание первой команды

Создадим команду с названием test , при вызове которой бот будет отвечать в чат “Успешный тест!”:

@bot.command() async def test(ctx): # список свойств и методов контекста можно найти в документации по запросу context await ctx.send('Успешный тест!') 

Результат:

image

Реализацию такой команды можно было бы сделать через обычного бота discord.Client прямо в on_message() , проверяя, наличие префикса и конкретного названия команды. Однако при большом количестве команд запихивать все в одну функцию не очень хорошо, да и не удобно разделять аргументы, про которые, кстати, можно почитать далее.

*Почитать подробнее, почему не стоит делать команды через on_message() можно здесь

Сложные команды
Несколько названий

Для создания нескольких названий одной команды можно передать в декоратор @bot.command() аргумент aliases , принимающий список ( list ) или кортеж ( tuple ) с названиями команды. При этом самого названия функции там быть не должно.

@bot.command(aliases=['test', 'тест', 'тестовая_команда', 'test_command']) async def test_(ctx): pass 
Работа с аргументами команды

Предположим, вам нужно при вызове функции принять от пользователя число , значение типа bool и участника сервера discord.Member

image

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

@bot.command() async def get_values(ctx, number, boolean, member): . 

Поскольку Python — язык с динамической типизацией, по умолчанию все полученные значения принимают строковый тип str , так как фактически были получены из строки ( str ), содержащей текст сообщения.

Тогда

  • number будет равно ’16’
  • boolean будет равно ‘True’
  • member будет равно »

То есть из number нельзя будет вычесть число, boolean == True примет значение False , а member просто примет строку, содержащую форму упоминания пользователя.

Вместо того, чтобы вручную выполнять приведение типов ( number = int(number) , boolean = bool(boolean) и т.д.), можно сразу же явно указать тип аргумента функции:

@bot.command() async def get_values(ctx, number: int, boolean: bool, member: discord.Member): . 

И вот теперь уже все будет работать корректно. Помимо discord.Member можно указать любой другой тип библиотеки discord-py .

Из объекта member , например, можно получить id ( member.id ), ссылку на аватар ( member.avatar_url ) и другую информацию, которую можно найти в документации по объекту discord.Member .

Получить весь текст как один аргумент

В случае, когда вам в качестве аргумента нужен весь текст команды, можно использовать оператор * :

image

@bot.command() async def get_text(ctx, *, text): . 

text будет иметь тип str и значение ‘это тестовый текст для проверки функции’

Если сделать так:

@bot.command() async def get_text(ctx, *text): . 

text будет иметь тип tuple и значение (‘это’, ‘тестовый’, ‘текст’, ‘для, ‘проверки’, ‘функции’)

Также можно сначала получить несколько отдельных слов, а уже потом оставшийся текст:

@bot.command() async def get_text(ctx, first_word, second_word, *, other_text): . 
  • first_word будет иметь тип str и значение ‘это’
  • second_word будет иметь тип str и значение ‘тестовый’
  • other_text будет иметь тип str и значение ‘текст для проверки функции’

Если смешать все команды из руководства в один код, то должно получиться что-то такое.

Данной информации должно хватить для понимания базовых вещей, таких как работа с документацией, создание команд, работа с обработчиками событий и т.д.

На основе этого, имея навыки программирования, можно создать любого бота, ограничиваясь только своей фантазией (ну и функционалом библиотеки discord-py xD).

Как получить ID сервера дискорд?

Делаю бота чат менеджера для дискорда на Discord.js@v12, мне нужно получить айди сервера, и сохранить в json. Как это сделать?

  • Вопрос задан более двух лет назад
  • 2255 просмотров

2 комментария

Простой 2 комментария

Pavel_Matskevich @Pavel_Matskevich
Я знаю как но мне лень дискорд качать

как получить и сохранить в mysql могу сказать, json мало кто пользуется, потому что он крашится часто и стирается.
А так получить message.guild.id

Решения вопроса 1

Lordliness

Федор Масленников @Lordliness
Математик, начинающий программист Python

Если нужен конкретный сервер, то вы можете получить ID вручную. Для этого необходимо:
1) Зайти в настройки приложения Discord
2) Выбрать раздел «Расширенные»
3) Включить «Режим разработчика»
Далее заходим на сервер и жмём правой кнопкой мыши по его названию. В самом низу должна появиться кнопка «Копировать ID». Помимо этого теперь вы можете копировать ID любых чатов и пользователей.
Если вы являетесь администратором сервера, то так же можно поступить и с ролями.

P.S. Программным, так программным, ладно.
var server = message.guild.id;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *