Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/47: Рейтинг темы: голосов - 47, средняя оценка - 4.98
0 / 0 / 1
Регистрация: 15.12.2019
Сообщений: 107

Как вызвать функцию дискорд бота прямо из кода, а не из чата в дискорде?

26.11.2020, 18:03. Показов 9005. Ответов 6
Метки нет (Все метки)

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

То есть, у меня есть команда:

Python
1
2
3
@bot.command()
async def command(ctx, arg):
    await ctx.send(arg)
Чтобы ее вызвать, нужно в чате дискорда написать !command argument

Как я могу вызвать эту команду из кода?. Видел, что в asyncio есть метод asyncio.run(command()), но дискорд не хочет работать с ним.

Я бы хотел понять, как можно сделать что-то вроде этого:

Python
1
2
#21479587456456984576 - id канала, который будет в качестве контекста
asyncio.run(command(21479587456456984576, 'argument'))
И получить тот же результат, что и при вызове команды из чата.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2020, 18:03
Ответы с готовыми решениями:

Подноготная дискорд бота
здравствуйте товарищи! Недавно столкнулся с внутренними багами npm пакета discord.js. Долго пытался найти дыры в своём коде, который ещё...

Как вызвать функцию в коде qml из кода на c++
Приветствую. Подскажите, пожалуйста, как правильно вызвать js функцию в коде qml из кода с++. Примеров, как из кода qml вызывать с++...

Отправка сообщения дискорд бота по таймеру
Доброго дня. Создаю бота для discord. Интересует возможно ли отправлять сообщения от него по какому-то кулдавуну без вмешательства...

6
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
27.11.2020, 07:34
Python
1
2
3
4
5
6
7
@bot.command()
async def command(ctx, arg):
    await ctx.send(arg)
 
@bot.command()
async def command2(ctx, arg):
    await command(ctx, arg)
1
0 / 0 / 1
Регистрация: 15.12.2019
Сообщений: 107
27.11.2020, 08:20  [ТС]
DmFat, но ведь для вызова второй функции все равно нужно писать в чат !command2 arg

Если конкретизировать проблему, то опишу так:

Имеется дискорд-бот и графический интерфейс на PyQt5, содержащий в себе кнопку и поле для ввода текста.

Задача: при нажатии кнопки, забрать текст из поля ввода и передать его в функцию отправки сообщения в дискорд-канал. Текст вводится в формате <id канала> <сообщение>.

Проблема: все данные отлично передаются, но при вызове непосредственно асинхронной функции бота, программа вылетает с ошибкой

Code
1
RuntimeError: Timeout context manager should be used inside a task
Код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
from PyQt5.QtWidgets import QApplication, QMainWindow, qApp, QPushButton, QTextEdit
from PyQt5.QtCore import QSize, Qt
import discord
import asyncio
from discord.ext import commands
from threading import Thread
 
# объект дискорд-бота
bot = commands.Bot(command_prefix = '!', intents = discord.Intents.all())
 
# функция для отправки сообщения в дискорд
async def send_message(channel_id: int, msg):
    global bot
    channel = bot.get_channel(channel_id)
    await channel.send(msg)
 
 
class MainWindow(QMainWindow):
 
    # функция, вызываемая при нажатии кнопки
    def onClick(self):
        channel, msg = self.bot_write.toPlainText().split()
        channel = int(channel)
        asyncio.run(send_message(channel, msg))
 
    def __init__(self):
 
        QMainWindow.__init__(self)
 
        self.setFixedSize(QSize(295, 165))
 
        # поле ввода текста
        self.bot_write = QTextEdit(self)
        self.bot_write.move(10, 10)
        self.bot_write.setFixedSize(QSize(275, 120))
 
        # кнопка
        self.sendBtn = QPushButton('Отправить сообщение', self)
        self.sendBtn.move(10, 135)
        self.sendBtn.setFixedSize(QSize(275, 25))
        self.sendBtn.clicked.connect(self.onClick)
 
 
# запуск бота в отдельном потоке
def start():
    bot.run('TOKEN')
 
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    start = Thread(target = start).start()
    sys.exit(app.exec())

---------------------

Вместо asyncio.run(send_message(channel, msg)) пробовал также делать по другому:

Python
1
2
loop = asyncio.new_event_loop()
loop.run_until_complete(send_message(channel, msg))

Или так (Ничего не происходит ):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
loop = None
 
# функция, вызываемая при нажатии кнопки
def onClick(self):
    global loop
    channel, msg = self.bot_write.toPlainText().split()
    channel = int(channel)
    asyncio.run_coroutine_threadsafe(send_message(channel, msg), loop)
 
# запуск бота в отдельном потоке
def start():
    global loop
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    bot.run('TOKEN')
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
27.11.2020, 08:27
Лучший ответ Сообщение было отмечено Denis Numba как решение

Решение

Denis Numba,

Python
1
2
3
4
5
6
7
8
9
10
from discord.ext import commands
 
 
async def command():
    ...
 
 
bot = commands.Bot()
bot.loop.create_task(command())
bot.run("")
0
0 / 0 / 1
Регистрация: 15.12.2019
Сообщений: 107
27.11.2020, 08:59  [ТС]
DmFat, только через
Python
1
bot.loop.create_task(command())
почему-то выходит с задержкой в 5-10 секунд. Если сделать так, то будет без задержки:
Python
1
asyncio.run_coroutine_threadsafe(send_message(channel, msg), bot.loop)
Спасибо!
0
0 / 0 / 0
Регистрация: 09.02.2021
Сообщений: 1
09.02.2021, 12:02
Здравствуйте. Denis Numba, подскажите, ваш бот имеется где-то в свободном доступе? Неделя потраченная мною на понимание как написать бота, дала лишь понимание того, что когда я его напишу, Дискордом уже пользоваться ни кто не будет.
0
0 / 0 / 1
Регистрация: 15.12.2019
Сообщений: 107
09.02.2021, 16:27  [ТС]
Евгений-55, здравствуйте! Интересует полноценный код бота вместе с графическим интерфейсом? Полностью предоставить, к сожалению не смогу, так как код получился большой и в основном направлен на конкретного бота - моего.

Я могу предоставить вам какие-то рабочие блоки кода или помочь разобраться с вашим ботом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2021, 16:27
Помогаю со студенческими работами здесь

Исправить ошибки в коде Дискорд бота
И так, писал я код для бота в Thonny, игра 'камень ножницы бумага', и тут ошибки: Line 94: Item &quot;None&quot; of...

Ошибка в запуске дискорд бота, discord.py
Сделал бота на discord.py Запускаю, а он выдает ошибку Traceback (most recent call last): File...

Выдаёт ошибку когда пытаюсь запустить дискорд бота: 'str' object has no attribute 'loop'
Я новичок в сфере python и решил написать дискорд бота. Вот код import discord class MyClient(discord.Client): async def...

Сообщении из телеграмм бота прямо в личное сообщение
Об этом понятии не имею. Очень хотел бы реализовать такую систему в боте: Пользователь отправляет российский номер +7**********, после...

Вызвать функцию DLL независимую от основного кода
Подскажите, пожалуйста, решение задачи: Я написал небольшую программу, которая читает имена Mass Storage Device средствами WMI и по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru