Как убедиться, что chat_id существует? - PullRequest
1 голос
/ 11 мая 2019

Я написал фрагмент кода, который отправляет сообщения боту Telegram.Для этого я использую chat_id последнего разговора, полученного с помощью метода getUpdates .

id = requests.get(f"https://api.telegram.org/bot{token}/getUpdates").json()['result'][-1]['message']['chat']['id']

Насколько я понимаю, разговор существует, если кто-то началодин с ботом через /start.

Как из моего кода начать разговор, чтобы убедиться, что chat_id доступен? (= что есть преобразование Iможно запросить).

Я также уверен, что разговоры, если они существуют, не хранятся бесконечно (это еще одна причина, по которой запрос на обновление может привести к пустым результатам)

1 Ответ

1 голос
/ 11 мая 2019

Насколько я понимаю, разговор существует, если кто-то начал его с ботом через /start.

Да, разговор всегда инициируется пользователем :

Боты не могут начинать разговоры с пользователями. Пользователь должен либо добавить их в группу, либо сначала отправить им сообщение. Люди могут использовать telegram.me/ ссылки или поиск по имени пользователя, чтобы найти вашего бота.

Обратите внимание, что /start здесь не единственный вариант.

Если вы попытаетесь отправить сообщение для пользователя, который не начал разговор с ботом, вы получите что-то вроде этого: {"ok":false,"error_code":400,"description":"Bad Request: chat not found"}.


Как из моего кода начать разговор, чтобы убедиться, что chat_id доступен? (= что есть конверсия, которую я могу запросить).

Обычно вам не стоит об этом беспокоиться. Бот не запрашивает конкретные действия / запросы пользователя с помощью getUpdates, он запрашивает все взаимодействия от всех пользователей и затем решает, что делать в соответствии с предоставленной вами внутренней логикой.

Возможно, вы захотите хранить информацию о пользователях и / или их запросах в базе данных каждый раз, когда вы получаете Update от конкретного пользователя в getUpdates.

Исходя из этого, бот может принять решение, например, отправить ему сообщение.


Я также уверен, что разговоры, если они существуют, не хранятся бесконечно (это еще одна причина, по которой запрос на обновление может привести к пустым результатам)

Да, В документах четко указано , что

Входящие обновления хранятся на сервере до тех пор, пока бот не получит их в любом случае, но они не будут храниться дольше, чем 24 часа .

Update на серверах Telegram - это объект с коротким сроком службы.

Если вы не сохранили информацию о существующих пользователях или не потеряли базу данных, нет способа извлечь эти данные с серверов Telegram.


PS: в качестве примечания я бы предложил использовать длинный опрос, так как Telegram Bot API предназначен для использования с длинным опросом , если вы используете getUpdates , Наиболее важным является параметр запроса timeout метода getUpdates:

(время ожидания равно) Время ожидания в секундах для длительного опроса. По умолчанию 0 , т.е. обычный короткий опрос. Должно быть положительным, короткий опрос должен использоваться только для целей тестирования .

Как написано в вопросе, вы используете короткий опрос.

...