vk-io
vk-io copied to clipboard
Ошибка при отправке фото в беседу сообщества
What did you do?
- Пишем бота, который отправляет картинки в ответ на сообщения с помощью
context.sendPhotos
- Добавляем в беседу, которая была создана группой
- Триггерим бота, чтобы отправил картинку
Минимальный код для воспроизведения:
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
Интересная особенность: вывод 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 |
Уточню, всё работает правильно кода группа не является создателем беседы? Мне бы хотелось сохранить поведение с peer_id
. Возможно это будет работать правильно если игнорировать peer_id
если он отрицательный как для групп 🤔
Да, всё работает правильно везде, кроме бесед, которые создали в группе. Причём peer_id
в контексте сообщения у таких бесед правильный, как у обычных бесед, но если передать его в метод photos.getMessagesUploadServer
и загрузить фото на выданный сервер, в ответ придёт магическая строчка от ВК с отрицательным peer_id
. Ловить отрицательный peer_id
и вырезать его – сомнительная идея, потому что ВК говорит передавать эту строчку в photos.saveMessagesPhoto
без изменений. То есть, если и ифать этот случай (и не передавать peer_id
с самого начала), надо пользоваться .chat_settings.is_group_channel
из объекта беседы, но его придётся запрашивать по API отдельно. Может, я что-то упустил и по объекту сообщения всё же можно понять, что оно из беседы и беседа создана группой, тогда есть надежда заифать не очень криво.
Лучшим решением будет, конечно, фикс со стороны ВК.
Я имел ввиду не изменять значение после загрузки, а предварительно проверить его. До этого я не работал с чатами группы. Как выглядит peer_id
беседы? Со смещением 2e9?
Да, и нумерация такая же, с точки зрения peer_id
нет разницы, что это за беседа. На скриншоте вверху жёлтыми цифрами написан пример peer_id
(2e9 + 3) и видно начало peer_id
из ответа ВК (это такой же peer_id
, как в ЛС с сообществом – id сообщества со знаком минус)
Я думаю стоит сначала открыть в баг трекере ВКонтакте вопрос по поводу этой ошибки 🤔
Баг стар, как этот мир. https://vk.com/bug193585
а как фиксить
а как фиксить
peer_id = from_id
соответственно у чела должен быть открыт ЛС для бота.