我正在用Java bot创建电报bot,但是我遇到了问题,我已经看到有bot在没有用户更新的情况下发送文本\ ad的消息,我想知道我该怎么做。用户向它发送消息。我需要知道如何使我的机器人在没有onUpdateReceived的情况下发送一些消息。(对不起,我的英语)
onUpdateReceived(更新更新)仅在用户发送命令时发送消息
谢谢。
答案 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);
SendAd
是Job
接口的实现,实际上调用了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();
}
}
}