vk-io icon indicating copy to clipboard operation
vk-io copied to clipboard

Ошибка при отправке фото в беседу сообщества

Open FeDaniil opened this issue 2 years ago • 8 comments

What did you do?

  1. Пишем бота, который отправляет картинки в ответ на сообщения с помощью context.sendPhotos
  2. Добавляем в беседу, которая была создана группой
  3. Триггерим бота, чтобы отправил картинку

Минимальный код для воспроизведения:

import { VK } from 'vk-io';
const vk = new VK({ token: process.env.TOKEN });
vk.updates.on('message_new', async (ctx) => {
    console.log(ctx.peerId);
    await ctx.sendPhotos([{
        value: './test.png'
    }]);
});
vk.updates.start();

What did you expect to happen?

Картинка успешно загружается и отправляется в беседу

What was the actual result?

APIError: Code №1 - Unknown error occurred image

Интересная особенность: вывод console.log(ctx.peerId) и peer_id из лога об ошибке отличаются. Второй – отрицательный и соответствует peer_id группы, которая создала беседу. Он был получен у ВК, может быть, проблема на их стороне (что сказано в https://github.com/negezor/vk-io/issues/302#issuecomment-670100356)

Additional Info

Аналогичный код, который работает:

import { VK } from 'vk-io';
const vk = new VK({ token: process.env.TOKEN });
vk.updates.on('message_new', async (ctx) => {
    console.log(ctx.peerId);
    await ctx.send({
        attachment: await vk.upload.messagePhoto({
            source: {
                value: './test.png'
            }
        })
    });
});
vk.updates.start();

Мне кажется, проблема именно в peer_id. Учитывая, что photos.getMessagesUploadServer не требует его обязательно, возможно, имеет смысл не посылать его вообще. Прошло полтора года с https://github.com/negezor/vk-io/issues/302#issuecomment-670100356 и ВК до сих пор ничего не изменил, может по их мнению это и есть задуманное поведение?

Об этой проблеме уже репортили в 2020 году: #302 #372 Проблема до сих пор есть и вынуждает пользоваться более длинной синтаксической конструкцией, если не хочется терять поддержку бесед сообществ.

Versions

package version
vk-io 4.5.2
node 16.13.2
TypeScript -
yarn or npm 8.3.0

FeDaniil avatar Mar 26 '22 18:03 FeDaniil

Уточню, всё работает правильно кода группа не является создателем беседы? Мне бы хотелось сохранить поведение с peer_id. Возможно это будет работать правильно если игнорировать peer_id если он отрицательный как для групп 🤔

negezor avatar Apr 02 '22 12:04 negezor

Да, всё работает правильно везде, кроме бесед, которые создали в группе. Причём peer_id в контексте сообщения у таких бесед правильный, как у обычных бесед, но если передать его в метод photos.getMessagesUploadServer и загрузить фото на выданный сервер, в ответ придёт магическая строчка от ВК с отрицательным peer_id. Ловить отрицательный peer_id и вырезать его – сомнительная идея, потому что ВК говорит передавать эту строчку в photos.saveMessagesPhoto без изменений. То есть, если и ифать этот случай (и не передавать peer_id с самого начала), надо пользоваться .chat_settings.is_group_channel из объекта беседы, но его придётся запрашивать по API отдельно. Может, я что-то упустил и по объекту сообщения всё же можно понять, что оно из беседы и беседа создана группой, тогда есть надежда заифать не очень криво. Лучшим решением будет, конечно, фикс со стороны ВК.

FeDaniil avatar Apr 02 '22 15:04 FeDaniil

Я имел ввиду не изменять значение после загрузки, а предварительно проверить его. До этого я не работал с чатами группы. Как выглядит peer_id беседы? Со смещением 2e9?

negezor avatar Apr 02 '22 17:04 negezor

Да, и нумерация такая же, с точки зрения peer_id нет разницы, что это за беседа. На скриншоте вверху жёлтыми цифрами написан пример peer_id (2e9 + 3) и видно начало peer_id из ответа ВК (это такой же peer_id, как в ЛС с сообществом – id сообщества со знаком минус)

FeDaniil avatar Apr 02 '22 17:04 FeDaniil

Я думаю стоит сначала открыть в баг трекере ВКонтакте вопрос по поводу этой ошибки 🤔

negezor avatar Apr 17 '22 05:04 negezor

Баг стар, как этот мир. https://vk.com/bug193585

lilchacha avatar May 01 '22 09:05 lilchacha

а как фиксить

kostyaavdonin avatar Dec 08 '22 09:12 kostyaavdonin

а как фиксить

peer_id = from_id соответственно у чела должен быть открыт ЛС для бота.

TheEVolk avatar Dec 13 '22 09:12 TheEVolk