如何为电报机器人实现没有触发事件的计划任务?

问题描述 投票:0回答:1

我想创建一个机器人来摆脱不活跃的用户。用户信息在加入群组后会记录到数据库 (MariaDB) 中。每次发送消息时,数据库中都会更新时间戳 (DATETIME)。目标是编写一个函数,能够反复删除一周或更长时间不活动的人。

我已经编写了一个能够做到这一点的函数(借助我实现的一些实用函数来从数据库检索数据):

async def RemoveUsers(update: Update) -> None:
    current_datetime = datetime.now().strftime(time_format)
    condition = f“TIMESTAMPDIFF(WEEK,{current_datetime},NOW())>1”
    success, data = db.select(tablename, “*”, condition)

    if success and len(data):
        db.delete(tablename, condition)
        for (uid, _) in data:
            update.effective_chat.ban_member(uid, until_date = datetime.now() + timedelta(seconds=30))

scheduler = BackgroundScheduler()
remove_inactive = scheduler.add_job(RemoveUsers, “interval”, days = 1, args = (?, ))

if __name__ == "__main__":
    scheduler.start()

    application = ApplicationBuilder().token(API_KEY).build()

    # Other handlers here...

    application.run_polling(allowed_updates = Update.ALL_TYPES, drop_pending_updates = True)

但是我应该如何将更新传递给函数呢?我不想设置触发事件(例如命令或新消息或其他事件)。我希望它每天都能独立运行。但是,我想不出办法来做到这一点。有更好的方法可以写这个吗?

如有任何帮助,我们将不胜感激!

编辑:我考虑过使用

JobQueue
模块中的
python-telegram-bot
。但是,它仍然没有解决我的问题,因为函数本身仍然需要一个事件来触发它。

如果重要的话,我正在使用 Python v3.9.5 和

python-telegram-bot
v20.6。

python telegram telegram-bot python-telegram-bot
1个回答
0
投票

由于您的

RemoveUsers
函数应该定期调用,而不是在收到更新时调用,因此没有使用
Update
对象作为参数。在该功能中,您真正需要的是您想要禁止用户的聊天的 ID。这可以是硬编码的,也可以作为参数传递给RemoveUsers。

请注意,基本上相同的论点也适用于 PTB

JobQueue
(它基本上是 APScheduler 的包装器)。另请参阅此 wiki 条目。此外,请注意,您不需要从 Telegram 进行更新即可通过
JobQueue
安排作业 - 只需在定义
application.job_queue.run_daily(…)
后运行
application
即可。


免责声明:我目前是

python-telegram-bot
的维护者。

© www.soinside.com 2019 - 2024. All rights reserved.