Telegram 机器人仅用于发送消息
Telegram bot only for send messages
我希望当用户在我的网站上执行某些操作时,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";
}
}
可以在不实际执行轮询的情况下配置和启动聊天机器人
updater = Updater('token', use_context=True)
dp = updater.dispatcher
updater.idle()
updater.bot.send_message(chat_id='YYYY', text='hoi')
在这种情况下,没有轮询,但会向聊天室发送一条消息。
通知:
- 你需要知道聊天ID
- updater.idle() 只有在您需要保留 运行 聊天机器人时才需要(否则您可以发送消息并关闭应用程序)
我已经使用 Jersey WS(jersey-client
和 jersey-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;
}
我希望当用户在我的网站上执行某些操作时,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";
}
}
可以在不实际执行轮询的情况下配置和启动聊天机器人
updater = Updater('token', use_context=True)
dp = updater.dispatcher
updater.idle()
updater.bot.send_message(chat_id='YYYY', text='hoi')
在这种情况下,没有轮询,但会向聊天室发送一条消息。
通知:
- 你需要知道聊天ID
- updater.idle() 只有在您需要保留 运行 聊天机器人时才需要(否则您可以发送消息并关闭应用程序)
我已经使用 Jersey WS(jersey-client
和 jersey-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;
}