Vk-io: Ошибка при попытке удалить пользователя из беседы.

Созданный на 3 дек. 2017  ·  20Комментарии  ·  Источник: negezor/vk-io

VK-IO - 4.0.0-alpha.4
Node - v9.2.0
Хотел отправить 2 одинаковых запроса на удаление участника из 2х бесед.
1 запрос прошел, а на втором поймал ошибку.

You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
FetchError: network timeout at: https://api.vk.com/method/messages.removeChatUser?access_token=ТОКЕН&v=5.69
    at Timeout._onTimeout (/home/vk/node_modules/node-fetch/lib/index.js:1272:13)
    at ontimeout (timers.js:478:11)
    at tryOnTimeout (timers.js:302:5)
    at Timer.listOnTimeout (timers.js:262:5)
Caught unhandledRejection: { FetchError: network timeout at: https://api.vk.com/method/messages.removeChatUser?access_token=ТОКЕН&v=5.69
    at Timeout._onTimeout (/home/vk/node_modules/node-fetch/lib/index.js:1272:13)
    at ontimeout (timers.js:478:11)
    at tryOnTimeout (timers.js:302:5)
    at Timer.listOnTimeout (timers.js:262:5)
  message: 'network timeout at: https://api.vk.com/method/messages.removeChatUser?access_token=ТОКЕН&v=5.69',
  type: 'request-timeout',
  stackframes:
   [ { file_name: '/home/vk/node_modules/node-fetch/lib/index.js',
       line_number: 1272 },
     { file_name: 'timers.js', line_number: 478 },
     { file_name: 'timers.js', line_number: 302 },
     { file_name: 'timers.js', line_number: 262 } ] }

Самый полезный комментарий

Если после перезапуска приложения бот отвечает какое-то время, а потом перестаёт, то, скорее всего, во всем виноват Long Poll, если ты больше нигде не накосячил. Вероятнее всего, ты забыл прикрутить обработку ошибок неудачных запросов, а Long Poll сервер ВК частенько любит отдавать 403, 500-503.

При этом, важно помнить, что node-fetch передаёт все ответы сервера (пусть даже с ошибкой) в then() блок, судя из README:

3xx-5xx responses are NOT network errors, and should be handled in then()

Так что, возможно, ошибка закралась где-нибудь здесь, например.

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

P. S. И ещё, лучшим вариантом будет постараться "упаковать" эти последовательные запросы в твоём коде users.get → messages.getChatUsers → messages.removeChatUser → message.send → users.get? в один execute-запрос. Так будет эффективнее с точки зрения экономии запросов, ибо есть известное ограничение в 3 запроса в секунду.

Все 20 Комментарий

Можно код и список установленных опций?

vk.api.messages.getChatUsers({chat_id: iChatID, fields: "online"}).then((chat) => {
    if (chat.indexOf(user.id) > -1) {
        vk.api.messages.removeChatUser({chat_id: iChatID, user_id: user.id}).then(() => {
            return message.send(`@id${user.id} (${user.first_name} ${user.last_name}) ${user.sex == 1 ? "удалена" : "удалён"} из беседы!`);
        });
    } else {
        vk.api.messages.removeChatUser({chat_id: iChatID, user_id: user.id}).then((remove) => {
            if (remove == 1) {
                return message.send(`@id${user.id} (${user.first_name} ${user.last_name}) принудительно ${user.sex == 1 ? "удалена" : "удалён"} из беседы!`);
            } else {
                vk.api.users.get({user_ids: user.id, name_case: 'acc', fields: 'sex'}).then(([user2]) => {
                    return message.send(`Не могу удалить @id${user2.id} (${user2.first_name} ${user2.last_name}), так как ${user2.sex == 1 ? "её" : "его"} нет в беседе.`);
                });
            }
        })
    }
});

Возможно проблема в не верной проверке if (chat.indexOf(user.id) > -1)
Так как chat возвращает массив объектов.

Может стоит сделать так?

vk.api.messages.removeChatUser({
    chat_id: iChatID,
    user_id: user.id
})
    .catch((error) => {
        if (error.code === 15) {
            return 0;
        }

        throw error;
    })
    .then((removed) => {
        if (removed === 1) {
            return message.send(`@id${user.id} (${user.first_name} ${user.last_name}) ${user.sex === 1 ? 'удалена' : 'удалён'} из беседы!`);
        }

        return message.send(`Не могу удалить @id${user.id} (${user.first_name} ${user.last_name}), так как ${user.sex === 1 ? 'её' : 'его'} нет в беседе.`);
    });

Я использую vk.api.users.get({user_ids: user.id, name_case: 'acc', fields: 'sex'}).then(([user2]) второй раз так как разные падежи в сообщениях.

Опять непонятные ошибки, уже на ровном месте.

Caught unhandledRejection: { FetchError: network timeout at: https://api.vk.com/method/friends.getRequests?access_token=ТОКЕН&v=5.69
    at Timeout._onTimeout (/home/bots/vk/node_modules/node-fetch/lib/index.js:1272:13)
    at ontimeout (timers.js:478:11)
    at tryOnTimeout (timers.js:302:5)
    at Timer.listOnTimeout (timers.js:262:5)
  message: 'network timeout at: https://api.vk.com/method/friends.getRequests?access_token=ТОКЕН&v=5.69',
  type: 'request-timeout',
  stackframes: 
   [ { file_name: '/home/bots/vk/node_modules/node-fetch/lib/index.js',
       line_number: 1272 },
     { file_name: 'timers.js', line_number: 478 },
     { file_name: 'timers.js', line_number: 302 },
     { file_name: 'timers.js', line_number: 262 } ] }
Caught unhandledRejection: { FetchError: network timeout at: https://api.vk.com/method/friends.getRequests?access_token=ТОКЕН&v=5.69
    at Timeout._onTimeout (/home/bots/vk/node_modules/node-fetch/lib/index.js:1272:13)
    at ontimeout (timers.js:478:11)
    at tryOnTimeout (timers.js:302:5)
    at Timer.listOnTimeout (timers.js:262:5)
  message: 'network timeout at: https://api.vk.com/method/friends.getRequests?access_token=ТОКЕН&v=5.69',
  type: 'request-timeout' }

При этом бот сидит онлайн но не реагирует на сообщения вообще.
Если что friends.getRequests стоит на таймере, каждые 30 секунд проверяется.

После того как перезагрузил его, проблема пропала.

Версия VK-IO - 4.0.0-alpha.5

Опять отвалился бот, сидит в сети, но на сообщения не реагирует.
Я так понимаю отваливается Long Poll

DEBUG=vk-io:updates, сначала собрать информацию надо бы.

Если после перезапуска приложения бот отвечает какое-то время, а потом перестаёт, то, скорее всего, во всем виноват Long Poll, если ты больше нигде не накосячил. Вероятнее всего, ты забыл прикрутить обработку ошибок неудачных запросов, а Long Poll сервер ВК частенько любит отдавать 403, 500-503.

При этом, важно помнить, что node-fetch передаёт все ответы сервера (пусть даже с ошибкой) в then() блок, судя из README:

3xx-5xx responses are NOT network errors, and should be handled in then()

Так что, возможно, ошибка закралась где-нибудь здесь, например.

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

P. S. И ещё, лучшим вариантом будет постараться "упаковать" эти последовательные запросы в твоём коде users.get → messages.getChatUsers → messages.removeChatUser → message.send → users.get? в один execute-запрос. Так будет эффективнее с точки зрения экономии запросов, ибо есть известное ограничение в 3 запроса в секунду.

Проблема появилась после обновления библиотеки с 3 на 4 версию.
До этого проблем не было.

2017-12-08T08:27:13.947Z vk-io:updates http -->
2017-12-08T08:27:13.947Z vk-io:updates http <--
2017-12-08T08:27:13.947Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.947Z vk-io:updates http -->
2017-12-08T08:27:13.948Z vk-io:updates http <--
2017-12-08T08:27:13.948Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.948Z vk-io:updates http -->
2017-12-08T08:27:13.948Z vk-io:updates http <--
2017-12-08T08:27:13.948Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.949Z vk-io:updates http -->
2017-12-08T08:27:13.949Z vk-io:updates http <--
2017-12-08T08:27:13.949Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.949Z vk-io:updates http -->
2017-12-08T08:27:13.947Z vk-io:updates http -->
2017-12-08T08:27:13.947Z vk-io:updates http <--
2017-12-08T08:27:13.947Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.947Z vk-io:updates http -->
2017-12-08T08:27:13.948Z vk-io:updates http <--
2017-12-08T08:27:13.948Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.948Z vk-io:updates http -->
2017-12-08T08:27:13.948Z vk-io:updates http <--
2017-12-08T08:27:13.948Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.949Z vk-io:updates http -->
2017-12-08T08:27:13.949Z vk-io:updates http <--
2017-12-08T08:27:13.949Z vk-io:updates longpoll update [ 9, -286131                      123, 1, 1512721234 ]
2017-12-08T08:27:13.949Z vk-io:updates http -->

Дальше бот просто заглох и снова стал игнорить все сообщения.

Я залил обновление, попробуй с ним.

А сейчас другая ситуация, написал сообщение и в логах бота появились сообщения, но на команду он так и не отреагировал.

2017-12-08T14:44:02.580Z vk-io:updates http -->
2017-12-08T14:44:02.581Z vk-io:updates http <--
2017-12-08T14:44:02.581Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.581Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.581Z vk-io:updates http -->
2017-12-08T14:44:02.581Z vk-io:updates http <--
2017-12-08T14:44:02.581Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.581Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.581Z vk-io:updates http -->
2017-12-08T14:44:02.582Z vk-io:updates http <--
2017-12-08T14:44:02.582Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.582Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.582Z vk-io:updates http -->
2017-12-08T14:44:02.582Z vk-io:updates http <--
2017-12-08T14:44:02.582Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.583Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.583Z vk-io:updates http -->
2017-12-08T14:44:02.583Z vk-io:updates http <--
2017-12-08T14:44:02.583Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.583Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.583Z vk-io:updates http -->
2017-12-08T14:44:02.584Z vk-io:updates http <--
2017-12-08T14:44:02.584Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.584Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.584Z vk-io:updates http -->
2017-12-08T14:44:02.584Z vk-io:updates http <--
2017-12-08T14:44:02.584Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.584Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.584Z vk-io:updates http -->
2017-12-08T14:44:02.585Z vk-io:updates http <--
2017-12-08T14:44:02.585Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.585Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.585Z vk-io:updates http -->
2017-12-08T14:44:02.585Z vk-io:updates http <--
2017-12-08T14:44:02.585Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.585Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.585Z vk-io:updates http -->
2017-12-08T14:44:02.586Z vk-io:updates http <--
2017-12-08T14:44:02.586Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.586Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.586Z vk-io:updates http -->
2017-12-08T14:44:02.586Z vk-io:updates http <--
2017-12-08T14:44:02.586Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.586Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.587Z vk-io:updates http -->
2017-12-08T14:44:02.587Z vk-io:updates http <--
2017-12-08T14:44:02.587Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.587Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.587Z vk-io:updates http -->
2017-12-08T14:44:02.588Z vk-io:updates http <--
2017-12-08T14:44:02.588Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.588Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.588Z vk-io:updates http -->
2017-12-08T14:44:02.588Z vk-io:updates http <--
2017-12-08T14:44:02.588Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.588Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.588Z vk-io:updates http -->
2017-12-08T14:44:02.589Z vk-io:updates http <--
2017-12-08T14:44:02.589Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.589Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.589Z vk-io:updates http -->
2017-12-08T14:44:02.589Z vk-io:updates http <--
2017-12-08T14:44:02.589Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.589Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.589Z vk-io:updates http -->
2017-12-08T14:44:02.590Z vk-io:updates http <--
2017-12-08T14:44:02.590Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.590Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.590Z vk-io:updates http -->
2017-12-08T14:44:02.590Z vk-io:updates http <--
2017-12-08T14:44:02.590Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.590Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.590Z vk-io:updates http -->
2017-12-08T14:44:02.591Z vk-io:updates http <--
2017-12-08T14:44:02.591Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.591Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.591Z vk-io:updates http -->
2017-12-08T14:44:02.591Z vk-io:updates http <--
2017-12-08T14:44:02.591Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.591Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.591Z vk-io:updates http -->
2017-12-08T14:44:02.592Z vk-io:updates http <--
2017-12-08T14:44:02.592Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.592Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.592Z vk-io:updates http -->
2017-12-08T14:44:02.592Z vk-io:updates http <--
2017-12-08T14:44:02.592Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.592Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.592Z vk-io:updates http -->
2017-12-08T14:44:02.593Z vk-io:updates http <--
2017-12-08T14:44:02.593Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.593Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.593Z vk-io:updates http -->
2017-12-08T14:44:02.593Z vk-io:updates http <--
2017-12-08T14:44:02.593Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.593Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]
2017-12-08T14:44:02.593Z vk-io:updates http -->
2017-12-08T14:44:02.594Z vk-io:updates http <--
2017-12-08T14:44:02.594Z vk-io:updates longpoll update [ 7, 2000000004, 84955 ]
2017-12-08T14:44:02.594Z vk-io:updates longpoll update [ 4,
  84959,
  532497,
  2000000004,
  1512744139,
  '/ping',
  { from: '46199828' } ]

А сам код?

vk.auth.implicitFlowUser().run().then((response) => {
    vk.setToken(response.token);
    vk.updates.startPolling();
});

vk.updates.on('message', (message, next) => {
    if (!message.text || message.from.id != 2000000004 && message.from.id != ***) return;
    let command = message.text.split(" ")[0].slice(1).toLowerCase()
    if (command === 'ping') {
        vk.api.users.get({user_ids: message.payload.user_id}).then(([user]) => {
            message.send(`Pong!\n@id${message.payload.user_id} (${user.first_name}) 😉`);
        });
    }
});

Извините за долгий ответ :)

Сразу скажу что не стоит напрямую обращаться к контекстным свойствам. Потому что для разных типов получения данных они могут отличаться, а так же не нужно каждый раз заново авторизоваться не стоит если не хочется получить бан IP от ВК ну или просто капчу.
Так же можно следовать простому боту

По коду скажу что он рабочий, проблема видимо просто в прямом обращении к from.id. Если нужно проверить ID чата то можно воспользоваться context.getChatId() !== 4 && context.getUserId() !== ***

не нужно каждый раз заново авторизоваться

Не подскажете где у меня ошибка с авторизацией ?
И как правильно сделать.

Стоит после авторизации сохранить токен и использовать его из конфига.

Проблема с polling связана c #43

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

T1MOXA picture T1MOXA  ·  22Комментарии

ProgrammingLife picture ProgrammingLife  ·  9Комментарии

AndreiSoroka picture AndreiSoroka  ·  6Комментарии

alexey2baranov picture alexey2baranov  ·  8Комментарии

zardoy picture zardoy  ·  18Комментарии