首页 > 解决方案 > 即使函数正在循环,也让机器人保持活力

问题描述

我正在开发一个不和谐的 covid 跟踪器机器人,信息是从 facebook 页面上抓取的。我成功地抓取了信息并将其存储到列表中,但是当我运行机器人时,机器人将首先工作,但每 5 分钟机器人将断开连接并且没有响应,因为每 5 分钟def scrape刷新一次。所以我的问题是,即使抓取功能正在循环,我如何才能让机器人继续工作?

我的代码:

import discord
import random
import time
import asyncio
from facebook_scraper import get_posts
from discord.ext import commands, tasks

listposts = []

token = 'xxxx'

client = discord.Client()

listposts = []
@tasks.loop(minutes=5)
async def scrape():
    wanted = "Pecahan setiap negeri (Kumulatif)"  # wanted post
    for post in get_posts("myhealthkkm", pages=5):
        if post.get("text") is not None and wanted in post.get("text"):
            # print("Found", t)
            listposts.append(post.get("text"))
        else:
            pass
            # print("Not found")
    print(listposts)


@client.event
async def on_message(message):
  
    if message.content.startswith("-malaysiacase"):
        await message.channel.send(listposts)


@client.event
async def on_ready():
    print("RUN")

scrape.start()

client.run(token)

结果: 在此处输入图像描述 在此处输入图像描述

5 分钟后(抓取功能重新加载),机器人无法再响应用户请求,直到抓取过程完成 在此处输入图像描述

在此处输入图像描述

标签: python

解决方案


facebook_scraper 模块不是异步的,因此会阻塞,这将使您的机器人冻结直到它完成并错过导致断开连接的心跳。

不要在不和谐的机器人中使用时间模块,因为同样的原因你必须使用 asyncio.sleep。

您可以做的一些替代方案是:将 BS4 与 AIOHTTP 结合使用。或者查看在 loop.run_in_executor 中运行同步函数。

这里有一些例子:Python lib 美丽的汤使用aiohttp


推荐阅读