@desmos

Как проверить существование chat_id при отправке сообщений телеграм боту?

Здравствуйте! Есть телеграм бот, на который подписано n пользователей. Chat_id пользователя при запуске бота записывается в БД. Требуется отправить сообщение через бота всем его подписчикам. Отправка реализуется через цикл, в котором перебирается массив chat_id, отправка осуществляется через sendMessage(). Если в массиве оказывается chat_id, пользователь которого удалил у себя этого бота, то цикл на этом прерывается и скрипт перестает работать. Есть ли возможность проверки chat_id на привязку к боту, валидность? Есть ли возможность перехватывать событие: удаление бота и соответственно удалять chat_id из базы?
  • Вопрос задан
  • 768 просмотров
Пригласить эксперта
Ответы на вопрос 4
shurshur
@shurshur
Сисадмин, просто сисадмин...
При отправке в такой чат происходит исключение (сервер возвращает ошибку), его надо поймать и обработать (удалить из базы этот чат, например), тогда скрипт падать не будет.
Ответ написан
Комментировать
dabudi
@dabudi
2*2=5
Проверить юзера на его присутсвие в боте можно только через рассылку

count = 0
errors = 0

with sq.connect('base.db') as con:
    cur = con.cursor()
    cur.execute('''SELECT userid FROM users''')
    AllUser = cur.fetchall()
    
start_time = time.time()
for s in range(len(AllUser)):
    user_id = AllUser[count][0]
    try:
        bot.send_message(user_id, text='Текст для рассылки')
        count += 1
    except:
        count += 1
        errors += 1
        with sq.connect('base.db') as con:
            cur = con.cursor()
            cur.execute('''DELETE FROM users WHERE userid=?''', (user_id,)) # поймали ошибку на айди юзера и удалили его из базы
        
allusers = int(len(dataid))

goodresult = allusers - errors

goodresult = str(goodresult)

errors = str(errors)

times = "Время выполнения: %s сек." % round((time.time() - start_time))

sms = 'Рассылка завершена!'+'\n'+ 'Успешных результатов: '+goodresult+'\n'+'Ошибок: '+errors+'\n'+str(times)
bot.send_message(твой_айди, sms)# сюда придет уведомление о результатах рассылки
Ответ написан
Комментировать
@desmos Автор вопроса
Всем спасибо! У меня бот на php.
Добавил пустой обработчик
function myCustomErrorHandler(int $errNo, string $errMsg, string $file, int $line) {}
set_error_handler('myCustomErrorHandler');

Затем в цикле использовал try catch
foreach($arUsers as $user) {
    try {
        $bot->send($user['chat_id']);
    } catch (Throwable $e) {
        $bot->run(
            "DELETE FROM `users` WHERE `chat_id` =  :chat_id",
            array('chat_id' => $user['chat_id']),
            PDO::FETCH_ASSOC
        );

        continue;
    }
}
Ответ написан
Комментировать
@x2pix
Если вы всё ещё не хотите удалять пользователя из базы данных, то можете использовать следующий код:

JavaScript
// for example
    for(user in users) {
        try {
            sendMessage(user_id, text)
        } catch(error) {
            continue;
        }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы