如何实现机器人创建的Telegram投票自动(2天)或手动关闭?
问题与解决方案
当前代码
@Scheduled(cron = "* * * * * *") private void sendFriPoll(){ SendPoll sendPoll = new PollService().getPoll(String.valueOf(chatIdPoll), "friday"); sendPoll.enableNotification(); sendSchPoll(sendPoll); } private void sendSchPoll(SendPoll sendPoll){ sendPoll.setChatId(String.valueOf(chatIdPoll)); try { if (!isPollExist){ execute(sendPoll); //isPollExist = true; } } catch (TelegramApiException e) { System.out.println(e.getMessage()); } }
需求
实现机器人创建的Telegram投票在2天后自动关闭,或通过/stop命令手动关闭。
遇到的问题
- Telegram官方API的
close_date参数最大值仅为600秒,无法满足2天的自动关闭需求; - 重写的
onUpdateReceived(Update update)方法无法跟踪机器人自身发送的消息,导致无法获取投票的messageId; - 尝试让机器人给自己发送命令的方式也未成功。
解决方案
1. 获取投票的messageId(解决跟踪自发送消息问题)
execute(sendPoll)执行后会直接返回包含投票信息的Message对象,无需依赖onUpdateReceived追踪。修改sendSchPoll方法保存ID:
private void sendSchPoll(SendPoll sendPoll){ sendPoll.setChatId(String.valueOf(chatIdPoll)); try { if (!isPollExist){ // 保存发送后的消息对象,提取投票ID Message pollMessage = execute(sendPoll); long pollMsgId = pollMessage.getMessageId(); // 将chatId与投票ID绑定存储,可用全局Map或数据库 activePolls.put(chatIdPoll, pollMsgId); isPollExist = true; } } catch (TelegramApiException e) { System.out.println(e.getMessage()); } }
2. 实现2天后自动关闭(解决close_date时长限制问题)
利用定时任务框架(如已使用的@Scheduled配套的TaskScheduler),在发送投票时创建延迟2天的关闭任务:
// 发送投票时调度延迟任务 long twoDaysInMs = 2 * 24 * 60 * 60 * 1000; taskScheduler.schedule(() -> { try { Long msgId = activePolls.get(chatIdPoll); if (msgId != null) { ClosePoll closePoll = new ClosePoll(String.valueOf(chatIdPoll), msgId); execute(closePoll); activePolls.remove(chatIdPoll); isPollExist = false; } } catch (TelegramApiException e) { System.out.println(e.getMessage()); } }, new Date(System.currentTimeMillis() + twoDaysInMs));
注:需确保taskScheduler是已配置好的Spring TaskScheduler实例,或用Quartz等工具实现延迟逻辑。
3. 实现/stop手动关闭(解决机器人自发送命令无效问题)
直接在onUpdateReceived中处理用户的/stop命令,从存储容器中取出对应投票ID执行关闭:
@Override public void onUpdateReceived(Update update) { if (update.hasMessage() && update.getMessage().hasText()) { String text = update.getMessage().getText(); long chatId = update.getMessage().getChatId(); if ("/stop".equals(text)) { Long pollMsgId = activePolls.get(chatId); if (pollMsgId != null) { try { ClosePoll closePoll = new ClosePoll(String.valueOf(chatId), pollMsgId); execute(closePoll); activePolls.remove(chatId); isPollExist = false; // 给用户发送关闭反馈 execute(new SendMessage(String.valueOf(chatId), "投票已关闭")); } catch (TelegramApiException e) { System.out.println(e.getMessage()); } } else { try { execute(new SendMessage(String.valueOf(chatId), "当前没有活跃投票")); } catch (TelegramApiException e) { System.out.println(e.getMessage()); } } } // 其他业务逻辑... } }
内容的提问来源于stack exchange,提问作者Dmitriy Komar
相关产品推荐
相关产品推荐

