Pull to refresh

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings