我想创建一个机器人来摆脱不活跃的用户。用户信息在加入群组后会记录到数据库 (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。
由于您的
RemoveUsers
函数应该定期调用,而不是在收到更新时调用,因此没有使用 Update
对象作为参数。在该功能中,您真正需要的是您想要禁止用户的聊天的 ID。这可以是硬编码的,也可以作为参数传递给RemoveUsers。
请注意,基本上相同的论点也适用于 PTB
JobQueue
(它基本上是 APScheduler 的包装器)。另请参阅此 wiki 条目。此外,请注意,您不需要从 Telegram 进行更新即可通过 JobQueue
安排作业 - 只需在定义 application.job_queue.run_daily(…)
后运行 application
即可。
免责声明:我目前是
python-telegram-bot
的维护者。