You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现机器人创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:41:34