如何让漫游器每5分钟或由于其他事件而发布/发送消息?

时间:2020-05-28 15:58:49

标签: python bots discord.py

我认为这将是一个简单的任务,但是我什至可以把它弄乱。 所以我只想让我的机器人每5分钟发送一条消息(以拖曳我的朋友)为一条特定的消息。 所以我发现这不起作用或任何其他代码。我什至没有收到错误消息。因此,我几乎一无所知,这很糟糕。

import discord
import asyncio

client = discord.Client()

async def my_background_task():
    await client.wait_until_ready()
    counter = 0
    channel = discord.Object(id='channel_id_here')
    while not client.is_closed:
        counter += 1
        await client.send_message(channel, counter)
        await asyncio.sleep(60) # task runs every 60 seconds

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

client.loop.create_task(my_background_task())
client.run('token')

无论如何,这是我编写的代码,没有所有的Bot命令。

import discord
from discord.ext.commands import Bot, has_permissions

import secrets
import numpy as np
import re

TOKEN = 'mytokenasastring'
BOT = Bot(command_prefix='!')
#... some commands for my bot for my friends and myself
BOT.loop.create_task(my_background_task())
BOT.run(TOKEN)

所以我只是这样添加了上面的代码

async def my_background_task():
await BOT.wait_until_ready()
counter = 0
channel = discord.Object(id='mytestchannelidasastring') #i also tried as int but also doenst work
while not BOT.is_closed:
    counter += 1
    await BOT.send_message(channel, counter)
    await asyncio.sleep(60) # task runs every 60 seconds

然后vs代码告诉我的Bot doenst有一个send_message方法。所以我将send_message的代码更改为此

await channel.send(counter)

但是现在我得到了警告/错误形式的VS代码,该通道确实具有send方法,所以我得到了这样的(真实?!)通道

BOT.get_channel(id='mychannelidasstring')

它仍然不起作用,或者我没有收到任何类型的错误消息...请帮助,否则我会发疯....

2 个答案:

答案 0 :(得分:3)

尝试使用discord.tasks.loop

from discord.ext import tasks

counter = 0

@tasks.loop(minutes=1.0, count=None)
async def my_background_task():
    global counter
    channel = BOT.get_channel(123456789) # channel id as an int
    counter += 1
    await channel.send(f'{counter}')
my_background_task.start()

每分钟循环一次您的巨魔功能。

答案 1 :(得分:1)

似乎您正在使用一些旧的异步(v0.16.x)文档/教程,可以从send_message()中看到并将ID编写为字符串。我建议您尝试查找更多最新的教程并改为阅读最新的文档。

有关此后到最新版本的所有主要更改,请参见here,重写(v1.x)

关于您的代码,它应该是这样的:

async def my_background_task():
    await client.wait_until_ready() # ensures cache is loaded
    counter = 0
    channel = client.get_channel(id=112233445566778899) # replace with target channel id
    while not client.is_closed():
        counter += 1
        await channel.send(counter)
        await asyncio.sleep(60) # or 300 if you wish for it to be 5 minutes

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')
    client.loop.create_task(my_background_task()) # best to put it in here

client.run("token")

参考: