如何获取 Telegram 中给定机器人中所有聊天 ID 的列表?
How to get the list of all chat IDs in a given bot in Telegram?
我正在使用 CRON 作业创建电报机器人,因此它会随每个有趣的 movie/series 版本更新,我希望它每月发送一次更新。
你可以在这个GitHub Library
中查看
我还在 Whosebug 中看到了其他主题 related。
但是,这种解决方案不适用于我的问题,或者至少我是这么认为的,因为我不必从我的机器人进行的每次聊天中获得更新,因为它将是一个时事通讯机器人。
基本上我有:
public void sendMessage(String message) {
SendMessage messageSender = new SendMessage().setChatId(someId).setText(message);
try {
execute(messageSender);
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
如果您已经知道要向其发送消息的 chatId,则可以发送一条消息。但是,我想要一个函数(或 REST 端点),returns 我的机器人附加到的 chetIds 列表,这样我就可以做类似的事情:
List<Integer> chatIds = someMagicRESTendpointOrFunction();
chatIds.stream().forEach(message -> sendMessage(message));
您无法通过 Telegram API 获取所有 chatId。参见 official docs。
我认为最好的解决方案是将所有 chatId 存储在数据库或文件中。
当用户启动机器人或执行某些操作时,您可以从方法 public void onUpdateReceived(Update update)
的 update
变量中获取 chatId:
long chatId = update.hasMessage()
? update.getMessage().getChat().getId()
: update.getCallbackQuery().getMessage().getChat().getId();
基于文件的 ID 存储示例:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FileUtil {
private static final String FILE_NAME = "chatIds.txt";
public static boolean writeChatId(long chatId) {
try {
Path path = Paths.get(FILE_NAME);
List<Long> adminChatIds = getChatIds();
if (adminChatIds.contains(chatId)) return true;
Files.write(path, (String.valueOf(chatId) + System.lineSeparator()).getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
return false;
}
return true;
}
public static List<Long> getChatIds() {
try {
Path path = Paths.get(FILE_NAME);
List<Long> result = new ArrayList<>();
for (String line : Files.readAllLines(path)) {
result.add(Long.valueOf(line));
}
return result;
} catch (Exception e) {
return Collections.emptyList();
}
}
}
我正在使用 CRON 作业创建电报机器人,因此它会随每个有趣的 movie/series 版本更新,我希望它每月发送一次更新。
你可以在这个GitHub Library
中查看我还在 Whosebug 中看到了其他主题 related。 但是,这种解决方案不适用于我的问题,或者至少我是这么认为的,因为我不必从我的机器人进行的每次聊天中获得更新,因为它将是一个时事通讯机器人。
基本上我有:
public void sendMessage(String message) {
SendMessage messageSender = new SendMessage().setChatId(someId).setText(message);
try {
execute(messageSender);
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
如果您已经知道要向其发送消息的 chatId,则可以发送一条消息。但是,我想要一个函数(或 REST 端点),returns 我的机器人附加到的 chetIds 列表,这样我就可以做类似的事情:
List<Integer> chatIds = someMagicRESTendpointOrFunction();
chatIds.stream().forEach(message -> sendMessage(message));
您无法通过 Telegram API 获取所有 chatId。参见 official docs。
我认为最好的解决方案是将所有 chatId 存储在数据库或文件中。
当用户启动机器人或执行某些操作时,您可以从方法 public void onUpdateReceived(Update update)
的 update
变量中获取 chatId:
long chatId = update.hasMessage()
? update.getMessage().getChat().getId()
: update.getCallbackQuery().getMessage().getChat().getId();
基于文件的 ID 存储示例:
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class FileUtil {
private static final String FILE_NAME = "chatIds.txt";
public static boolean writeChatId(long chatId) {
try {
Path path = Paths.get(FILE_NAME);
List<Long> adminChatIds = getChatIds();
if (adminChatIds.contains(chatId)) return true;
Files.write(path, (String.valueOf(chatId) + System.lineSeparator()).getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
return false;
}
return true;
}
public static List<Long> getChatIds() {
try {
Path path = Paths.get(FILE_NAME);
List<Long> result = new ArrayList<>();
for (String line : Files.readAllLines(path)) {
result.add(Long.valueOf(line));
}
return result;
} catch (Exception e) {
return Collections.emptyList();
}
}
}