使用Discord for python时'NoneType'对象没有属性'send'

时间:2019-07-06 13:30:56

标签: python discord discord.py

我想在没有命令的情况下写一条僵尸消息。但是我遇到一个问题,当我运行代码时,它说:'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),则说未定义名称“渠道”

2 个答案:

答案 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:

没有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:

仅当您的 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转换为整数。