Как получить список всех идентификаторов чата в данном боте в Telegram? - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю бот-телеграмму с использованием задания CRON, поэтому он будет обновляться со всеми интересными выпусками фильмов / сериалов, и я хочу, чтобы он отправлял обновление раз в месяц.

Вы можете просмотреть его в этом Библиотека GitHub

Я также видел другие темы здесь в stackoverflow related .Но такое решение не относится к моей проблеме, или, по крайней мере, мне так кажется, поскольку мне не нужно получать обновления из каждого чата, в который будет загружаться мой бот, поскольку он будет ботом для рассылки новостей.

В основном у меня есть:

public void sendMessage(String message) {
        SendMessage messageSender = new SendMessage().setChatId(someId).setText(message);
        try {
            execute(messageSender);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

Что хорошо, если вы отправляете одно сообщение, если вы уже знаете, что в чате хотите отправить сообщение.Но я хотел бы иметь функцию (или конечную точку REST), которая возвращает список chetIds, к которым привязан мой бот, чтобы я мог что-то вроде:

List<Integer> chatIds = someMagicRESTendpointOrFunction();
chatIds.stream().forEach(message -> sendMessage(message));

1 Ответ

0 голосов
/ 05 мая 2019

Вы не можете получить все chatId с помощью Telegram API.См. Официальные документы .

Я думаю, что лучшее решение - хранить все chatId в базе данных или файле.Вы можете получить chatId из переменной update из метода public void onUpdateReceived(Update update), когда пользователь запускает бота или выполняет некоторые действия:

long chatId = update.hasMessage() 
           ? update.getMessage().getChat().getId() 
           : update.getCallbackQuery().getMessage().getChat().getId();

Пример хранилища идентификаторов на основе файлов:

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();
    }
}

}
...