如何使我的机器人在没有更新的情况下发送消息?

时间:2019-01-01 15:26:30

标签: java telegram-bot

我正在用Java bot创建电报bot,但是我遇到了问题,我已经看到有bot在没有用户更新的情况下发送文本\ ad的消息,我想知道我该怎么做。用户向它发送消息。我需要知道如何使我的机器人在没有onUpdateReceived的情况下发送一些消息。(对不起,我的英语)

onUpdateReceived(更新更新)仅在用户发送命令时发送消息

谢谢。

3 个答案:

答案 0 :(得分:0)

只需创建一个Send message实例。 例如

SendMessage message = new SendMessage (chatid,text)

然后让您的机器人执行实例。

SendMessage message = new SendMessage (chatid,text)
bot.execute(message)

很明显,应该对聊天室阵营进行硬编码。

答案 1 :(得分:0)

onUpdateReceived(Update)只是机器人获取更新时调用的方法,但这并不是您的机器人可以调用execute(SendMessage)的唯一位置。 您需要的是在bot中编写类似的方法

public void sendAds() {
    for (Integer chatId: usersYouWantToPing) {
        SendMessage ad = new SendMessage
            .setChatId(chatId)
            .setText(text);
        execute(ad);
    }
}

显然,由于您没有User发送者对象,因此您必须找到发送消息的人的标准(也许您想在数据库中存储要ping的用户的ID)。

现在的问题是:如何触发此方法?答案是:随心所欲。

一种方法可能是安排一些 cron作业以定期执行sendAds()。为此,您可以在注册机器人之后立即在main方法中对其进行定义。使用Quartz lib,您可以编写类似

的内容
    /* Instantiate the job that will call the bot function */
    JobDetail jobSendAd = JobBuilder.newJob(SendAd.class)
        .withIdentity("sendAd")
        .build();

    /* Define a trigger for the call */
    Trigger trigger = TriggerBuilder
        .newTrigger()
        .withIdentity("everyMorningAt8")
        .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(8, 0))
        .build();

    /* Create a scheduler to manage triggers */
    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    scheduler.getContext().put("bot", bot);
    scheduler.start();
    scheduler.scheduleJob(jobSendAd, trigger);

SendAdJob接口的实现,实际上调用了bot方法,例如

public class SendNotification implements Job {
    public void execute(JobExecutionContext jobExecutionContext) {
        schedulerContext = jobExecutionContext.getScheduler().getContext();
        YourBot bot = (YourBot) schedulerContext.get("bot");
        bot.sendNotification();
    }
}

有关更多详细信息,建议您检查提供此解决方案的telegram bot template

答案 2 :(得分:0)

这种棘手的方法对我有用。

Telegram机器人需要知道与之聊天的特定群组或个人聊天的 chatID

首先,您需要获取的chatId。

借助BotFather在电报中创建/ chatid命令。

并在Java中使用该命令,如下所示:

public class TelegramBot extends TelegramLongPollingBot {
    public Long chatId = null;

    public void onUpdateReceived(Update update) {

        String input = update.getMessage().getText();
        SendMessage output = new SendMessage();

        if (input.equals("/chatid")) {
            chatId = update.getMessage().getChatId();
            System.out.println("chatId = " + chatId);
            output.setText("chatid is  = " + chatId);
        }

        output.setChatId(update.getMessage().getChatId());
        try {
            execute(output);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }

    }

    public void sayImNotRobot() {
    SendMessage message = new SendMessage();

    message.enableMarkdown(true);
    message.setChatId((long) chatIdLike123456); //Write chatID manually here
    message.setText("Im not robot");
    try {
        execute(message);
    } catch (TelegramApiException e) {
        e.printStackTrace();
    }

}
    
    public String getBotUsername() {
        return "your bot name here";
    }

    public String getBotToken() {
        return "your bot token here";
    }
}

在主类中,使用该方法将chatId打印到控制台,并将其复制(从控制台结果中)粘贴到我在TelegramBot类中编写的chatIdLike123456中。

 public class Main {
        public static void main(String[] args) {
            ApiContextInitializer.init();
            TelegramBotsApi telegramBotsApi = new TelegramBotsApi();
            try {
                telegramBotsApi.registerBot(new TelegramBot());
                TelegramBot bot = new TelegramBot();
                bot.sayImNotRobot(); //now, you can call this method whenever you want
 
  
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }