我想在没有命令的情况下写一条僵尸消息。但是我遇到一个问题,当我运行代码时,它说:'NoneType'对象没有属性'send'
回溯(最近通话最近一次):文件“ D:/开发/代码 “ Python / Bot Discord / discord-testbot.py”,第18行,位于my_background_task中 等待channel.send(channel,'New')
AttributeError:'NoneType'对象没有属性'send'
import discord
client = discord.Client()
@client.event
async def on_ready():
print('Bot is ready')
async def my_background_task():
await client.wait_until_ready()
await channel.send(channel, 'Bot say')
client.loop.create_task(my_background_task())
client.run(tokenBot)
如果我删除行channel = client.get_channel(574514361394266125)
,则说未定义名称“渠道”
答案 0 :(得分:0)
对我有用。看来您是在client.get_channel(id)
之前致电client.wait_until_ready()
(您已发送了已编辑的代码,所以我不能保证)。
此代码对我来说很好:
async def background():
await client.wait_until_ready()
channel = client.get_channel(int(MY_CHANNEL))
await channel.send("Test")
client.loop.create_task(background())
由于 discord.py v1.1 ,您可以更轻松,更安全地声明和管理后台任务。
这就是我们在嵌齿轮中的工作方式:
import discord
from discord.ext import tasks, commands
class OnReady_Message(commands.Cog):
def __init__(self, client):
self.client = client
self.send_onready_message.start()
def cog_unload(self):
self.send_onready_message.close()
return
# task
@tasks.loop(count = 1) # do it only one time
async def send_onready_message(self):
channel = self.client.get_channel(int(MY_CHANNEL))
await channel.send("Test")
@send_onready_message.before_loop # wait for the client before starting the task
async def before_send(self):
await self.client.wait_until_ready()
return
@send_onready_message.after_loop # destroy the task once it's done
async def after_send(self):
self.send_onready_message.close()
return
最后要运行任务send_onready_message()
,我们可以创建一个Task_runner()
对象,也可以简单地在该任务的实例中创建。
这将使您轻松运行所有任务:
# importing the tasks
from cogs.tasks.on_ready_task import OnReady_Message
class Task_runner:
def __init__(self, client)
self.client = client
def run_tasks(self):
OnReady_Message(self.client)
return
在您的主文件中:
import discord
from discord.ext import commands
from cogs.tasks.task_runner import Task_runner
client = commands.Bot(command_prefix = PREFIX)
runner = Task_runner(client)
runner.run_tasks()
client.run(token)
没有Task_runner()
,我们有:
import discord
from discord.ext import commands
from cogs.tasks.on_ready_task import OnReady_Message
client = commands.Bot(command_prefix = PREFIX)
OnReady_Message(client)
client.run(TOKEN)
仅当您的 discord.py 版本为最新版本时,以上示例才有效。
要知道是否可以,您可以在终端中运行:
>>> import discord
>>> discord.__version__
'1.2.3'
如果您的版本较旧,则可以在终端中使用以下命令进行更新:
pip install discord.py --upgrade
希望有帮助!
答案 1 :(得分:0)
免责声明:我今天才发现这个问题。我知道它已经解决了,但是我想我可以将答案留作将来使用或其他用户使用。
这是我仅用于发送直接消息的解决方案(以我为例):
# DM message
@client.command(aliases=["dm"])
@commands.has_permissions(administrator=True)
async def _dm_(ctx, content, user_id):
# Variables
user = client.get_user(int(user_id))
msg = "Sending to DM!"
# Process
await ctx.send(msg)
print(msg)
await user.send(content)
在这种情况下,我的问题最初是通过不和谐将user_id
填充为字符串。现在,它将其作为字符串输入,然后将ID转换为整数。