首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >机器人不断执行循环的随机部分

机器人不断执行循环的随机部分
EN

Stack Overflow用户
提问于 2020-04-17 13:44:23
回答 1查看 19关注 0票数 0

我试图使一个机器人,每当它检测到页面状态变化时发送消息,但3-5秒后,它随机发送“服务器在线”,即使页面没有任何变化。

代码语言:javascript
复制
import os
import discord
from dotenv import load_dotenv
import time
import requests

def check(r):
    if "online" in r.text:
        return True
    else:
        return False

online = False

load_dotenv()
TOKEN = "#hidden"
GUILD = #hidden

client = discord.Client()

@client.event 
async def on_ready():
    for guild in client.guilds:
        if guild.name == GUILD:
            break
    print(
        f'{client.user} is connected to the following guild:\n'
        f'{guild.name}(id: {guild.id})')
    channel = client.get_channel(#hidden)

    last_status = check(requests.get("#page"))
    while True:
        if check(requests.get("#page")) == last_status:
            continue
        else:
            if check(requests.get(#page")):
                await channel.send("server is online")
                last_status = check(requests.get("#page"))
            else:
                await channel.send("Server is offline")
                last_status = check(requests.get("#page"))


client.run(TOKEN)
EN

回答 1

Stack Overflow用户

发布于 2020-04-20 19:28:05

这可能是因为您有多个正在运行的on_ready函数实例。

不一致API通常会发送重新连接的指令(特别是在由于流行病而导致负载过载的这段时间内)。

当discord.py收到此指令时,它会重新连接并再次调用on_ready,而不会终止另一个。

解决方案是使用asyncio.ensure_futureclient.wait_until_ready来确保只有一个实例

代码:

代码语言:javascript
复制
import os
import discord
from dotenv import load_dotenv
import time
import requests
import asyncio

def check(r):
    if "online" in r.text:
        return True
    else:
        return False

online = False

load_dotenv()
TOKEN = "#hidden"
GUILD = #hidden

client = discord.Client()

async def routine():
    await client.wait_until_ready()

    channel = client.get_channel(#hidden)    
    last_status = check(requests.get("#page"))

    while True:
        if check(requests.get("#page")) == last_status:
            continue
        else:
            if check(requests.get(#page")):
                await channel.send("server is online")
                last_status = check(requests.get("#page"))
            else:
                await channel.send("Server is offline")
                last_status = check(requests.get("#page"))


@client.event 
async def on_ready():
    for guild in client.guilds:
        if guild.name == GUILD:
            break
    print(
        f'{client.user} is connected to the following guild:\n'
        f'{guild.name}(id: {guild.id})')

asyncio.ensure_future(routine())
client.run(TOKEN)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61264878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档