Discord py, прочитать сообщение пользователя
суть такова. Человек отправляет сообщение, к примеру "4". Затем бот записывает это значение в переменную, и далее спрашивает, ваша ставка? Далее ему пишут ставку, и опять же добавляет это значение в переменную. Я написал такой код
Ошибка выдается, вроде -"content не содержится. " Как мне получить это сообщение? Перепробовал много вариантов, ничего не помогло Видел что реализуют через @client_event async def on_message, но тогда он будет на каждую цифру отвечать, а мне нужно чтобы запускался только через !Казино, спасибо
Постараюсь понятно объяснить. Для того, чтобы совершить ожидание, можете воспользоваться функцией wait_for и записать его в переменную, с которой потом можно делать то, что хочется.
Name already in use
discord-py-guide / discord-py.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
1 contributor
Users who have contributed to this file
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Руководство по использованию библиотеки discord-py
Здесь вы можете почитать об основах, которые необходимо понимать, чтобы грамотно работать с библиотекой и не задавать вопросов, касающихся самых базовых вещей
Вероятнее всего у вас уже имеется созданный бот, поэтому инструкция по его созданию будет пропущена (но, возмжно появится позже).
Прежде чем начать.
Прежде чем приступать к работе с ботом, я сразу рекомендую зайти на страницу вашего бота и включить намерения ( intents , подробнее). Для этого зайдите в раздел приложений и выберите вашего бота. Затем, слева, на вкладке «Bot»
Включите параметры PRESENCE INTENT и SERVER MEMBERS INTENT

После этого выдайте намерения в коде при инициализации бота
Намерения нужны для работы с некоторыми событиями, объектами пользователей серверов ( участник / member ) и др. Они вам точно понадобятся, поэтому лучше включить их сразу, чтобы потом не спрашивать, почему вам не удается получить данные о пользователе сервера или чего-либо еще.
Начало работы с ботом и discord-py
Бот, которого вы создали на странице приложений, является аккаунтом дискорда, который по сути является таким же пользовательским аккаунтом, как и ваш, но с атрибутом bot и некоторыми ограничениями. Чтобы бот начал что-то делать, нужно создать его в коде и прописать логику.
Для начала рассмотрим виды ботов, которые предоставляет библиотека:
-
— фактически, самый базовый бот, на котором основаны другие. Умеет обрабатывать события по типу получения сообщений on_message() , установки реакции on_raw_reaction_add() и другие. — тот же discord.Client , только умеет находить в сообщениях и обрабатывать отдельные команды, которые начинаются с какого-либо префикса, например !test — про этого бота ничего сказать не могу, так как ни разу не использовал. Насколько мне известно, он нужен в тех случаях, когда вы планируете задать боту кучу разных комманд, событий и организовать все это в один отдельный класс.
В общем-то, выбор бота зависит напрямую от цели использования. Если вам нужен простой бот, который будет читать чат, фильтровать мат и т.п., считывать реакции, выдавать роли при входе нового пользователя и т.д., то вам хватит базового бота discord.Client .
Если помимо того, что я написал выше, вы хотите добавить еще и обработку команд по типу !ban <@User> , !play <Ссылка на видео с YouTube> , !погода и т.п., то использовать надо именно discord.ext.commands.Bot .
Теперь, когда вы определились с ботом можно наконец-то приступить к написанию кода.
Для начала подключим библиотеку.
На данном этапе я настоятельно рекомендую ознакомиться с руководством по использованию документации, так как на эту самую документацию я буду ссылаться очень часто и без ее использования вы вряд ли напишете что-то самостоятельно и будете постоянно спрашивать как реализовать ту или иную функцию.
В случае, если вы хотите использовать discord.ext.commands.Bot , я бы сразу отдельно подключил еще и этот пакет
Теперь создадим объект бота, который будет обрабатывать события и команды:
Из документации видим, что единственным обязательным аргументом при создании экземпляра класса является command_prefix .
Он принимает строку ( str ), по которой бот будет определять, то что сообщение является командой и обрабатывать его нужно именно как команду.
Помимо этого, выдадим боту намерения ( intents ), инструкция по настройке которых была в начале.
В качестве префикса команды укажем ! , намерения нужно выдавать именно те, которые вы будете использовать, но на первое время можно выдать все, то есть discord.Intents.all()
Если у вас discord.ext.commands.Bot :
Если у вас discord.Client , то префикс указывать не нужно (класс не принимает такого аргумента):
Основные обработчики событий
Теперь у нас есть объект bot , для которого нужно написать логику взаимодействия.
В качестве обработчиков событий используются асинхронные ( async ) функции ( def ), помеченные декоратором @bot.event , где bot — название объекта вашего бота. Функция должна иметь название, строго как в документации — иначе событие просто не будет обработано.
Если коротко, то все, что делает декоратор @bot.event — это помещает написанную вами функцию в другую функцию из библиотеки discord , которая, в свою очередь, передает вашей функции какие-либо параметры. Поэтому, если не пометить функцию декоратором, discord не обратит на нее внимание и она не будет вызвана.
async def on_ready()
Первым делом, нужно удостовериться, что бот успешно запустился и готов к работе. В списке событий находим событие on_ready() , которое вызывается один раз при запуске кода и обозначает то, что бот загрузился и готов к работе.
Здесь нужно отметить, что в этой функции не следует размещать фрагменты кода, которые должны будут выполняться в дальнейшем, так как функция будет вызвана только один раз. Поэтому в этой функции можно разместить какое-либо сообщение, о том, что бот запущен и, если есть работа с данными из файлов, то самое время их подгрузить. В общем, выполнить все единоразовые процедуры.
Выглядеть это будет вот так:
async def on_message(message)
Добавим обработчик сообщений, чтобы получать вызов функции каждый раз, когда bot получает сообщение в ЛС или на сервере.
В списке событий находим событие on_message(message) , которое принимает обязательный аргумент message . Этот аргумент имеет тип discord.Message из которого вы можете получить текст сообщения, а также объекты автора сообщения, сервер, канал, вложения, реакции, упоминания, ссылку на сообщение и много чего еще
Здесь вы можете прописать любую логику взаимодействия. Хоть даже удалять все только что переданные обработчиком сообщения (главное чтобы у бота были на то права). Самое главное — задать функции аргумент, который будет принимать объект сообщения. Вы можете назвать его как хотите, например даже так: async def on_message(собщение) , главное чтобы он был.
Если аргумент не указать, то при вызове события нового сообщения, 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() :
Данная строка должна всегда находиться в самом низу кода. После ее выполнения бот будет запущен и весь код, который находится ниже этой строки будет выполнен только после завершения работы бота.
Бот будет выполнять работу до дех пор, пока вы не завершите выполнение кода. Это означает, что если вы закроете консольное окно программы, то бот перестанет работать и обрабатывать какие-либо события.
Чтобы бот работал без вашего участия, его можно поставить на хостинг — тогда он будет постоянно запущен на удаленном сервере, а не на вашем устройстве. Например, можно использовать бесплатный (уже не бесплатный) хостинг Heroku. В интернете есть куча разных туториалов по настройке. Возможно, когда-нибудь здесь появится ссылка на мой 🙂
В итоге должен получиться примерно такой код, посмотреть который можно здесь.
Данный бот выводит сообщение при успешном запуске, а также подробную информацию о каждом полученном сообщении.
Для этого примера достаточно было бы простого бота discord.Client , так как он обрабатывает только события. Но я наперед прописал в коде бота discord.ext.commands.Bot , так как дальше в этот код мы будем добавлять обработку команд.
Обработка отдельных команд
Данный раздел содержит информацию об устаревших в дискорде prefix-командах ( !command / >command / $command и т.п.). На данный момент актуально создавать именно slash-команды ( /command ), которые интегрируются в дискорд и позволяют более комфортно разделять аргументы и добавлять к ним описание.
Так или иначе, руководство по slash-командам подразумевает знание материала по работе с prefix-командами. Поэтому прежде чем переходить к slash-командам, я рекомендую ознакомиться с материалом ниже.
Напоминаю, что для работы с командами, в качестве бота нужно использовать объект 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 и нужен для того, чтобы проверять, являестя ли сообщение командой. Многие, забыв добавить эту строку, потом не понимают, почему их бот игнорирует команды (подробный разбор проблемы)
Ключевое слово return завершает выполнение функции, то есть код, который идет дальше, так или иначе не будет выполнен.
Создание первой команды
Создадим команду с названием test , при вызове которой бот будет отвечать в чат «Успешный тест!»:
Результат:

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

Чтобы принять эти параматры, нужно указать их в качестве аргументов функции, которая используется в качестве команды:
Поскольку Python — язык с динамической типизацией, по умолчанию все полученные значения принимают строковый тип str , так как фактически были получены из строки ( str ), содержащей текст сообщения.
Тогда
- number будет равно ’16’
- boolean будет равно ‘True’
- member будет равно ‘<@!239863351063144451>’
То есть из number нельзя будет вычесть число, boolean == True примет значение False , а member просто примет строку, содержащую форму упоминания пользователя.
Вместо того, чтобы вручную выполнять приведение типов ( number = int(number) , boolean = bool(boolean) и т.д.), можно сразу же явно указать тип аргумента функции:
И вот теперь уже все будет работать корректно. Помимо discord.Member можно указать любой другой тип библиотеки discord-py .
Из объекта member , например, можно получить id ( member.id ), ссылку на аватар ( member.avatar_url ) и другую информацию, которую можно найти в документации по объекту discord.Member .
Получить весь текст как один аргумент
В случае, когда вам в качестве аргумента нужен весь текст команды, можно использовать оператор * :

text будет иметь тип str и значение ‘это тестовый текст для проверки функции’
Если сделать так:
text будет иметь тип tuple и значение (‘это’, ‘тестовый’, ‘текст’, ‘для, ‘проверки’, ‘функции’)
Также можно сначала получить несколько отдельных слов, а уже потом оставшийся текст:
- first_word будет иметь тип str и значение ‘это’
- second_word будет иметь тип str и значение ‘тестовый’
- other_text будет иметь тип str и значение ‘текст для проверки функции’
Если смешать все команды из базового руководства в один код, то должно получиться что-то такое.
Данной информации должно хватить для понимания базовых вещей, таких как работа с документацией, создание prefix-команд, работа с обработчиками событий и т.д.
Sending and Receiving Messages
Now that we’ve created our bot and added it to our server it is likely that we would like it to give us some information about that specific server. Maybe how many member there are, how many people are online or the channels that exist. To be able to gather this information we need what’s known as the server ID.
To get the server ID we need to enable developer mode on discord. To do this go to User Setting > Appearance and turn Developer Mode on. 
Then you need to go to your Server Settings > Widget and copy the server ID. 
Getting Number of Members
Now that we need have the server ID we have to use it to reference the server. We will declare the variable ID to be the following.
To get the number of members in our server we can do the following.
Welcoming Users
Something that we may want to do is welcome users when they first join the server. To do this we need to create a new event.
Restricting Channels
We may want to restrict the channels in which we can use bot commands. To do this we need to make a list of valid channels and check if the user typed in that channel.
Restricting Users
Similarly to above we may only want certain users to be able able to execute certain commands.
How to Gather Message Data Using a Discord Bot From Scratch With Python
If you want to work with text data from your discord servers, a simple bot is the best way to go.
Introduction
In this day and age, applications that make use of text analysis are everywhere from your typical e-mail spam filter to chatbots capable of making enough sense out of messages that they can even respond to them.
There’s a lot of possibilities regarding text processing, but whatever it is that you might want to do, you’ll need data to do it. And, while that data can come from pretty much anywhere, if you’re after text data that represents how people talk on the daily, you need to look no further than to social media.
Some social media platforms like WhatsApp or Telegram allow you to directly export your chat history for you to use however you’d like. But, for those of us who want to do something involving other platforms, we have to figure our own way to do it. This is why in this post I’ll be showing you how to use a Discord bot to scrape your own servers for message history data to use for whatever you’d like.
Getting Set Up
First, you will need to create an application in the Discord Developer Portal to have a token for your bot. All you need to do is sign in with your Discord account and, once you’re in, click New Application and give it a name. You can also upload a picture and describe it if you wish.
With your application created, go into the bot tab in the settings menu and click Add Bot. You can choose your bot’s username in Discord and upload its profile picture, which will be the same as the one for the application by default. But the thing we want on this page is your Token, which we will need to run the bot.
With the bot created, the last thing you’ll need to do before starting to code is to install discord.py, a library used to code Discord bots with Python, and Pandas, which is a data analysis and manipulation library. The installation can be easily done using pip by running one of the following lines:
For anaconda users, Pandas already comes installed.
Starting The Bot
We start by importing the two modules we installed and define the client and guild variables, which are used to refer to the bot itself and the servers, also called guilds, respectively.
To make the bot universal so we don’t have to keep getting the unique ID of each server we want to analyze, we will be making it so the bot reads whichever channel we call our command in.
To do so, we use the on_message() asynchronous function from the discord.py library, which runs every time a new message is sent. Then, we check if the message author is the bot itself, and, if not, whether the message starts with whatever string we define as our command call, which in this case I set to “_”.
If the message does start with the command call, I like to split it’s content and then save the first element into a ‘command’ variable and the rest into a list of parameters. But since we’ll be making the bot read whichever channel we call the command on, that part is optional.
If the ‘command’ variable is equal to whatever we named our command — in this case, “_scan” — then we run our code.
Reading The Data
There are many variables we could want to track from a server’s message history. But, to keep it simple, we’ll only be looking at when the messages were sent, who sent them, and the content of the message itself. And, to do that, we create a Data Frame containing one column for each.
To read the data into the data frame, we will make use of the history() method of the TextChannel class in the discord.py library, which we get access to by using the channel attribute of our message. The method allows us to use a for loop to iterate through n messages in the channel history, with n being a parameter of the method itself set, by default, to 100.
Once inside the loop, we can use if statements to avoid messages sent by our bot — in this case, it won’t send any messages — and the command calls we used to trigger it. Then we append the message’s content, time of creation, and author — which can all be accessed via the message’s attributes — to the data frame and use Pandas’ to_csv() method to save it locally as a .CSV file.
Lastly, use the client.run() function to set your bot running, and paste the token you got from the developer portal as the parameter.
Conclusion
Text data from social media can give us many insights as to how people behave and this is no exception. Although making a bot to scrape the data isn’t as easy as simply exporting it, doing so opens the door to yet another platform with data to be analyzed.
In case you’d like a bot that takes in the channel and number of messages to read as command parameters and has a help command. I have a fancier version of this bot with those features in my GitHub in case you’d like to copy or check the full code.
Either way, now that you know how to get the data, the sky is the limit as to what you can do with it.