Данная статья рассказывает о моем опыте и о моих ошибках при работе с VK API на flutter, для вас она может быть бесполезной.
Привет, народ, пишу первый раз и то, только из-за того, что хочу поделится с такой бесполезной вещью, как VK API во flutter...шутка. Цель мой задачи была проста, меня попросили написать "ту самую фигню, для того что бы в группе картинки выкладывались сами" бота для публикации записей в сообщество, так как я сам пишу моб приложения и имел БОЛЬШУЮ ошибку обмолвиться этим в кругу друзей. то это участь, а вернее оказание помощи девушке выпало на мои плечи...
И так, первое, что я захотел сделать, это само собой зайти на платформу https://vk.com/dev
и узнав информацию, что для начала надо создать приложение, я, как настоящий дебил воин интернета, пошел создавать приложение, и тут же вылезла первая проблема, поскольку у меня очень старый акк вк, то пришлось ждать 7 дней для смены номера, а после уже продолжать работу.

Дальше, как создал Standalone приложение, назвав самым оригинальным способом BotDlySranyhPlodstihUteh BotTest, пошел смотреть, что же он может, НО, поскольку я гениальный человек, то по пути наименьшего сопротивления, я пошел смотреть видосики на youtube, как очень умные школьники на питухоне за 10МИН ИНФА 100 ВСЕМ РЕКОМЕНДУЮ на питоне полный гайд. И так, что я уяснил, нужно получить токен для работы, и конечно же. для начала я подумал, что этот токен есть у приложения)

И так, получив права и добавив бота в свою группу, я попробовал сделать классический hello world для бота. и вроде даже все работало. Бот публиковал сообщения по типу, "я крутой, все работает" "test", "test111", "teststs". и так далее, и все, можно радоваться жизни и идти дальше.
P.S. метод wall.post, вся инфа тут есть https://vk.com/dev/wall.post
Дальше, надо было реализовать публикацию изображения в группу вк,
и как вы поняли, мой сверхразум снова пошел на youtube, ибо первый же раз сработало)
Найдя метод photos.getWallUploadServer, и тут уже обратился к Vk dev (наконец-то до меня дошло, что я страдал херней и задачу, которая решалась 15-30 мин, потратил 3 часа), получил след поля
https://vk.com/dev/photos.getWallUploadServer
НО ТУТ, когда я продвигался по своей цели, а именно выкладывать изображения, я столкнулся с тем, что токен, который я получил тогда и активно использовал не работает) Я ТАКОЙ УМНЫЙ нет Как оказалось, это все херня (про приложение), ибо это не то, что нам надо.(спасибо остальные видосики на youtube). И так, потратив еще N-нацать минут на поиск инфы, что за фигня, я понял, что надо давать права и брать токен из разрешений (и да, это было на на портале vk dev, но помните, я же сказал, что я сверхумный и видосики лучше скажут, чем портал) ), По тем веткам форумов нашел протрясающий сайт наших друзей с портала 1XBET, стоп, не тот ресурс. но сайт и правда полезный, называется vk host https://vkhost.github.io/
И так, поняв, что сайт позволяет получать токен на права, я принял волевое решение и подумал, логично, что боту для публикации фото нужны ПРАВА ГРУППЫ, осознания того, что я тупой альтерумный, не читая доки вк, пошел смотреть, ПОЧЕМУ ЖЕ ПРАВА ГРУППЫ НЕ РАБОТАЮТ...

И так, закончив на том, что я кретин и дебил .Вернулся к пункту о получение прав https://vkhost.github.io/ на этом сайте. Получил токен пользователя, а не группы, забыв о youtube как о страшном сне, вооружившись cuberforum и vk.com/dev, работа пошла значительно быстрее.
НО ТУТ, я по счастливой случайности, наткнулся на packages. https://pub.dev/packages/vkio
в очередной раз почувствовав себя дебилом, я переписал свой проект под этот проект, и знаете что?!
Дальше все пошло как по маслу.
...Как по маслу, по машинному в космосе..
Ирония в том, что после получения ответа по методу, getWallUploadServer мы получили url для загрузки фотографий на сервер.
И вроде все норм, получили url, отправил, по классике, в base64 формате... и вот, получив ответ от сервера я был немного обеспокоен... ведь в поле photo:[] был пустой массив.
И тут дошло, что стоит наконец-то пойти на dev и прочесть полностью)

И так, отступление, так как я писал веб приложение, а вернее клиент, то использовал не imagePicker а пакет file_picker_cross, схожий принцип работы.
Публичная переменная file; file = await FilePickerCross.importFromStorage(); //действия при нажатии
Продолжим, с тех пор, как мы получили ссылку на сервер для загрузки фотографий, (var serverLink).
Наваял код за пару мин. var req = http.MultipartRequest("POST", Uri.parse(serverLink));//создали запрос
req.files.add(file.toMultipartFile(filename: file.fileName));//добавили файлы к запросу
var res = await req.send();//отправили
var str = await res.stream.bytesToString();//и считали результат из потока
А дальше все было просто и понятно, даже для такого альтерУмного, как я:
Map jsonRes = jsonDecode(str);
var resSaveWallPhoto = await vk.api.photos.saveWallPhoto({
"group_id": groupId, // ID группы, в которой будет наш пост
"server": jsonRes['server'], // инфа с сервера
"photo": jsonRes['photo'],// инфа с сервера
'hash': jsonRes['hash'],// инфа с сервера
});
Единственная проблема, которая у меня возникла, это то, что формат unix date в dart(flutter), был и с мл сек, отсюда вк не принимал адекватно это, вот решение) (да, дебил) DateTime.now().add(Duration(days: 1)).millisecondsSinceEpoch / 1000 //Указывайте дату, которая вам нужно, DateTime.Now() использовал как пример
И того, вот финальный запрос для публикации var fi = await vk.api.wall.post({
"owner_id": -groupId,
"attachments":
"Photo${ownId}_${mediaId},";,
"publish_date":
DateTime.now().add(Duration(days: 1)).millisecondsSinceEpoch / 1000,
"message": "test22"
});
ownId и mediaId получили в ответе на запрос saveWallPhoto;
И теперь коротко:
Получит токен пользователя (vkHost)
По токену и id группы запросить (getWallUploadServer)
В ответе получить сервер url, по которому отправить изображение
Сохранить изображения (
saveWallPhoto
)Опубликовать пост с нашим изображением по дате (если надо)