电报机器人仅用于发送消息

时间:2020-10-15 09:03:56

标签: java telegram telegram-bot

我希望Telegram机器人在用户在我的网站上执行某些操作时通知我。我一直在测试Telegram机器人发送消息并通过轮询使用getUpdates进行接收,并且一切正常。我已经知道,轮询方法比Webhooks消耗更多的CPU(因为它不断检查新消息),但是实现起来更加复杂,因此我放弃了Webhooks。

实际上,我不需要使用轮询或webhooks,因为我想要的是发送消息,但是我必须强制实施getUpdates方法。有什么方法可以只使用发送消息功能而避免接收消息?就像只读机器人或电报频道一样。

谢谢!

编辑。这是我的Java代码:

public class TelegramBot extends TelegramLongPollingBot {

    @Override
    public void onUpdateReceived(Update update) {
        // Stuff when the bot receive a message
        // I don't need this method, but it is compulsory to implement it
    }

    public synchronized void sendMsg(String msg) {
        // Stuff to send a message 
        // Here goes the code I only need
    }

    @Override
    public String getBotUsername() {
        // Compulsory to implement
        return "my_bot_user_name";
    }

    @Override
    public String getBotToken() {
        // Compulsory to implement
        return "my_token";
    }
}

2 个答案:

答案 0 :(得分:1)

无需实际执行轮询就可以配置和启动聊天机器人

 updater = Updater('token', use_context=True)

 dp = updater.dispatcher
 updater.idle()

 updater.bot.send_message(chat_id='YYYY', text='hoi')

在这种情况下,不会进行轮询,但会向聊天室发送一条消息。

注意:

  • 您需要知道聊天ID
  • updater.idle()仅在需要继续运行聊天机器人时才需要(否则,您可以仅发送消息并关闭应用程序)

答案 1 :(得分:0)

我已经使用 Jersey WS jersey-clientjersey-common软件包)解决了所有问题

这是我的代码现在的样子,只在需要时调用它,而根本不轮询:

private static int sendMessage(String message) {
    HttpResponse<String> response = null;
    
    HttpClient client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(5))
            .version(HttpClient.Version.HTTP_2)
            .build();

    UriBuilder builder = UriBuilder
            .fromUri("https://api.telegram.org")
            .path("/{token}/sendMessage")
            .queryParam("chat_id", CHAT_ID)
            .queryParam("text", message)
            .queryParam("parse_mode", "html");

    HttpRequest request = HttpRequest.newBuilder()
            .GET()
            .uri(builder.build("bot" + TELEGRAM_TOKEN))
            .timeout(Duration.ofSeconds(5))
            .build();
    try {
        response = client.send(request, HttpResponse.BodyHandlers.ofString());
    }
    catch(IOException | InterruptedException ex) {
        LOGGER.warn("Error sending message to Telegram Bot");
    }

    return (response != null) ? response.statusCode() : -1;
}