Как стать автором
Поиск
Написать публикацию
Обновить

Flutter и VK API

Данная статья рассказывает о моем опыте и о моих ошибках при работе с VK API на flutter, для вас она может быть бесполезной.

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

И так, первое, что я захотел сделать, это само собой зайти на платформу https://vk.com/dev
и узнав информацию, что для начала надо создать приложение, я, как настоящий дебил воин интернета, пошел создавать приложение, и тут же вылезла первая проблема, поскольку у меня очень старый акк вк, то пришлось ждать 7 дней для смены номера, а после уже продолжать работу.

7 гребенных дней спустя,
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;

И теперь коротко:

  1. Получит токен пользователя (vkHost)

  2. По токену и id группы запросить (getWallUploadServer)

  3. В ответе получить сервер url, по которому отправить изображение

  4. Сохранить изображения (saveWallPhoto)

  5. Опубликовать пост с нашим изображением по дате (если надо)

  6. ПРОФИТ

    https://codeshare.io/21lB83

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.