【问题标题】:Async - Await Discord.py Function Problem异步 - 等待 Discord.py 函数问题
【发布时间】:2019-03-02 14:42:42
【问题描述】:

我想让 Discord 机器人做某事,等待 1 分钟,然后做某事,之后,循环(while 循环)将继续做同样的事情,直到我停止程序。

这是我的代码:

import discord
from discord.ext import commands
import requests
from bs4 import BeautifulSoup
import time

TOKEN = "MyToken!"
bot = commands.Bot(command_prefix='!')

@bot.event
async def on_ready():
    print("Started!")

@bot.command(pass_context=True)
async def start_bot():
    isAlreadyLive = False
    print("Let's get it started! :D")
    url = 'someLink'
    while True:
        soup = BeautifulSoup(requests.get(url).content, 'html.parser')
        varName = soup.find('span', {'class': 'firstClass secondClass'})
        if varName != None and boolVarName == False:
            await bot.say("SAY THIS! :D ")
            boolVarName = True
        if varName == None:
            await bot.say("SAY THIS #2! :D")
            boolVarName = False
        await time.sleep(60)
        print("Refreshed")

bot.run(TOKEN)

为了更清楚:我希望它检查 varName(来自抓取)是否不等于 None(这意味着它抓取了一些东西)并检查 boolVar 是否为真,因为如果它是真的,它不会'如果页面上仍有内容,则不要每分钟发送相同的消息。它每 60 秒刮一次页面,所以我可以说它正在页面上寻找一些“变化”。 好吧,我启动了机器人,它打印了消息……但随后出现了这个错误:

Ignoring exception in command start_bot
Traceback (most recent call last):
  File "C:\Users\WiMAX\PycharmProjects\KockarBot\venv\lib\site-packages\discord\ext\commands\core.py", line 50, in wrapped
    ret = yield from coro(*args, **kwargs)
  File "LiveBot.py", line 27, in start_bot
    await time.sleep(60)
TypeError: object NoneType can't be used in 'await' expression

提前谢谢你!

【问题讨论】:

  • 请改用asyncio.sleep。您还应该查看 discord.py 项目中的后台任务示例:github.com/Rapptz/discord.py/blob/async/examples/…
  • 谢谢,它正在工作。另外,我不知道我可以在这里问,但我能以某种方式停止不和谐机器人吗?某些功能会停止程序并关闭机器人?如果在cmets这里不允许问,请告诉我,我会立即删除评论!谢谢!
  • 您可以使用await bot.logout() 以编程方式执行此操作,也可以手动终止该进程。
  • 谢谢!它对我有很大帮助:D

标签: python bots discord discord.py


【解决方案1】:

要使用异步睡眠,请执行以下操作:

await asyncio.sleep(60)

【讨论】:

  • 你需要使用await
【解决方案2】:

如果您正在谈论制作循环,那么 discord 对此有一些帮助。 discord.py 有一个名为 tasks 的内置模块,其中包括循环。您可以使用

from discord.ext import tasks

然后把它放在你的命令定义之前

@tasks.loop(seconds=some_float)

然后您可以通过将其放入您的 on_ready 函数来启动循环

function_name.start()

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2020-04-20
    • 2018-12-09
    • 2023-03-13
    • 1970-01-01
    • 2022-10-25
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多