【发布时间】:2021-07-09 23:27:34
【问题描述】:
我的机器人是一个“夜间模式”机器人,从晚上 10 点开始,到早上 7 点结束,它会删除它们之间的消息。我正在尝试删除从机器人发送的先前的夜间模式消息,但不确定如何处理,我考虑存储先前的消息更新,然后向其添加 1 并存储它,但我不确定如何去做如果机器人在多个组中运行,则会出现此情况。这是我的代码:
import logging
from telegram import Update, ForceReply
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext, Handler
import datetime as dtm
import pytz
night_hours = ['22','23','00','01','02','03','04','05','06']
allowed_groups = ['GROUP ID 1','GROUP ID 2','GROUP ID 3']
# Enable logging
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
)
logger = logging.getLogger(__name__)
def error(update, context):
"""Log Errors caused by Updates."""
logger.warning('Update "%s" caused error "%s"', update, context.error)
def start(context: CallbackContext):
morning_time = dtm.time(hour=7, minute=0, tzinfo=pytz.timezone('Europe/London'))
evening_time = dtm.time(hour=22, minute=0, tzinfo=pytz.timezone('Europe/London'))
context.job_queue.run_daily(morning_message, morning_time)
context.job_queue.run_daily(night_message, evening_time)
def log_channel(context: CallbackContext,name,chat_name,message):
deleted_message = ("Message Deleted from *" +name+ "* in the group *'" +chat_name+ "'*: " +message)
context.bot.send_message(chat_id="LOG CHANNEL ID", text=deleted_message,
disable_notification=True, parse_mode="MARKDOWNV2")
print(deleted_message)
def morning_message(context: CallbackContext):
context.bot.send_message(chat_id="TEST GROUP ID",text="*NIGHT MODE END:*\n\nMessage sending enabled until 10PM",
disable_notification=True,parse_mode="MARKDOWNV2")
def night_message(context: CallbackContext):
context.bot.send_message(chat_id="TEST GROUP ID", text="*NIGHT MODE START:*\n\nMessage sending disabled until 7AM",
disable_notification=True,parse_mode="MARKDOWNV2")
def during_night_mode(update: Update,context: CallbackContext):
UK = pytz.timezone('Europe/London')
uk_time = dtm.datetime.now(UK).strftime('%H:%M:%S')
hour = dtm.datetime.now(UK).strftime('%H')
chat_id = update.message.chat.id
chat_name = update.message.chat.title
message_id = update.message.message_id
print(chat_id)
print(message_id)
incoming_text = str(update.message.text)
incoming_entities = update.message.entities #images, videos, files etc... probably not gonna use.
message_sender = str(update.message.from_user.first_name)
print(hour)
if str(hour) in night_hours and str(chat_id) in allowed_groups: # and Enabled == True
print("working")
context.bot.delete_message(chat_id,message_id)
log_channel(context,message_sender,chat_name,incoming_text)
def main() -> None:
"""Start the bot."""
updater = Updater("BOT KEY")
dp = updater.dispatcher
#dp.add_handler(CommandHandler("start", start))#, pass_job_queue=True))
#dp.add_handler(CommandHandler(start))
dp.add_handler(MessageHandler(Filters.all,during_night_mode))
dp.add_error_handler(error)
# Start the Bot
updater.start_polling()
start(dp)
updater.idle()
if __name__ == '__main__':
main()
谢谢
编辑 1: 基本上,我只想要聊天中的 1 个夜间模式消息实例。因此,例如,当早上消息运行时,它会删除之前的夜间消息,这样它就不会与消息混淆聊天。
【问题讨论】:
-
我不明白你想做什么,但可能
send_message应该给你消息的 ID -message_id = send_message(...)- 你可以使用这个 ID 删除消息 -
真的这么简单吗?我现在试试。我将编辑帖子以解释更多我想要做的事情!
-
doc for send_message 显示
"Returns: On success, the sent message is returned."所以它不仅提供 ID,还提供完整的对象 Message 以及所有信息 -message_id、chat等 - 所以你可以保存所有 (即使用pickle) 或仅需要的值,稍后您可以使用它来删除此消息。
标签: python telegram python-telegram-bot