Содержание статьи
Малолетним пользователям Вконтактик дарит безграничные возможности онлайн-общения. Зрелым сотрудникам специальных служб — добровольно и собственноручно созданные досье на вышеуказанную группу граждан. А что он может дать программисту? Разумеется, бесплатную инфраструктуру для его приложения! В условиях, когда своего сервера нет, а чужой предлагает только тестовый нестабильный ключ, не позволяющий запустить приложение в большое плавание, VK.com представляется просто идеальным вариантом. И никакой головной боли с надежностью сервера и оплатой хостинга ;).
Возможности родного Вконтактика
VK API позволяет многое. В группах часто публикуют новости, к одной записи на стене можно прикрепить до десяти вложений (фото, видео, аудио). Мы можем сделать приложение для чтения лент новостей. Можем хранить тут видео — считай, кинотеатр в кармане. Размещать свои MP3-коллекции, хранить фото или просто документы.
Главное — правильно замаскировать содержимое от охотников за нелицензионным контентом (шифрование файлов или их названий). Впрочем, я уверен, что ты не какой-нибудь пират и в таких мерах защиты своего контента не нуждаешься ;). Если просуммировать, то с помощью VK мы можем сделать:
- новостное приложение;
- онлайн-кинотеатр;
- онлайн MP3-плеер;
- собственный фотосервер;
- убийцу Google Docs — MyVKDoc!
Теория VK API
Описание методов VK API ты найдешь по адресу.
Методы, требующие авторизации, для нашего бэкенда не очень удобны — пользователи вообще не любят, когда их лишний раз о чем-то спрашивают. Для того чтобы быстро забрать какую-либо информацию, в VK API есть метод wall.get. Он возвращает список записей со стены пользователя или сообщества. Самое замечательное в том, что это открытый метод, не требующий access_token.
То есть, если стена открытая, читать ее может кто угодно. Это то, что нужно для клиентского приложения!
Работаем с VK API через Android
C VK API можно работать как с помощью обычных POST- и GET-запросов, так и через андроид-приложение, в чем нам, как обычно, поможет Android SDK. С его помощью можно загрузить на сервер VK файлы и делать публикации на стены (метод VKApi.wall().post).
Выдержка из официальной документации: подготовка к использованию
Перед началом работы с VK SDK необходимо создать Standalone-приложение на странице создания приложения. Сохрани ID твоего приложения и заполни поля «Название пакета для Android»,«Main Activity для Android», «Отпечаток сертификата для Android».
C ключами и Standalone-приложением все ясно, остается один нюанс: пользователь, от имени которого мы будем публиковать записи на стену, должен обладать в этой группе нужными правами. Настраивается это в разделе «Управление сообществом → Участники». Приложение при первом запуске также должно запросить права (к примеру, VKScope.WALL, VKScope.DOCS). Они указываются в методе VKSdk.login().
Если на устройстве установлено официальное приложение от VK, появится окно с запросом:
Другие статьи в выпуске:
Xakep #210. Краткий экскурс в Ethereum |
Если приложения нет, то мы увидим вот такой фрагмент, требующий ввести логин-пароль:
|
Теперь мы можем напрямую обращаться к методам Android SDK, не думая об авторизациях.
Затем нас ждет следующее препятствие — загрузить на стену группы можно не более 50 постов в день:
API errorVKError (code: 214; ; Access to adding post denied: you can only add 50 posts a day
Кроме того, если мы будем грузить очень быстро, то SDK остановит нас капчой:
У меня она вылезла после 20 загруженных подряд документов. Алгоритм появления капчи разработчики не расскажут нам ни по дружбе, ни за деньги, ни под пытками. Опытным путем я выяснил, что достаточно безопасным будет добавлять новую запись каждые 29 минут. От такой колоссальной скорости капча проснуться не должна, и в лимит в 50 загрузок в сутки мы тоже уложимся.
Новостное приложение
Обычно при публикации новостей ставят текст и картинки. Для загрузки картинок используем метод
VKApi.uploadWallPhotoRequest. После загрузки сервер вернет нам данные, нужные для метода публикации записи на стене VKApi.wall().post.
VKRequest post = VKApi.wall().post(VKParameters.from(VKApiConst.OWNER_ID, "-" + TARGET_GROUP, VKApiConst.ATTACHMENTS, attachments, VKApiConst.MESSAGE, message));
Параметр attachments получаем в ответе на VKApi.uploadWallPhotoRequest.
VKRequest request = VKApi.docs().uploadWallDocRequest(new File(file_path), TARGET_GROUP);
request.attempts = 10;
Log.d("request", "uploadWallDocRequest file_path=" + file_path);
request.executeWithListener(new VKRequest.VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
sendProgress("file", "Файл загружен на сервер " + file_path);
// sendProgress("file", "Ответ сервера: " + response.json);
Log.d("request", "onComplete response=" + response.json);
VKApiDocument photoModel = ((VKDocsArray) response.parsedModel).get(0);
new File(file_path).delete();
sendProgress("file", "Файл удален " + file_path);
makePost(new VKAttachments(photoModel), null, s);
}
@Override
public void onError(VKError error) {
Log.d("request", "onError error=" + error);
// Ошибка. Сообщаем пользователю об error
}
@Override
public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
Log.d("request", "attemptFailed=" + request.toString());
// Неудачная попытка. В аргументах появится номер попытки и общее их количество
}
});
Текст новости нужно передать в строку message, ее ключ VKApiConst.MESSAGE.
Одна публикация может иметь до десяти вложений — картинок, видео, аудио, документов.
Обнаруженная особенность: если мы загружаем GIF-файлы как картинки, то на стене будет опубликован обычный JPEG без анимации. Поэтому нам нужно грузить GIF как документ. Документы доступны в группах и недоступны в публичных страницах. Публичную страницу можно быстро перевести в группу.
Онлайн-кинотеатр
Для загрузки видео существует метод VKApi.video().save(); он также вернет адрес сервера (необходимый для загрузки) и данные видеозаписи. Дальше уже нужно выполнить POST-запрос на полученный адрес. Поле video_file
должно содержать видеофайл в формате AVI, MP4, 3GP, MPEG, MOV, MP3, FLV или WMV. В ответ приложение получает размер загруженного файла и идентификатор ролика либо сообщение об ошибке в формате JSON:
{"size":1234,"video_id":1234567}
или
{"error":описание ошибки}
После загрузки видеозапись проходит обработку и в списке видеозаписей может появиться спустя некоторое время.
Онлайн MP3-плеер
Тут нам поможет метод VKApi.audio().getUploadServer() — с его помощью мы получим сервер для загрузки. Потом, как и с видео, нужно загрузить файл POST-запросом, поле file должно содержать файл в формате MP3. В ответ приложение получает данные server, audio и hash в виде JSON:
{"server": "1234", "audio": "1234", "hash": "12345abcde"}
С помощью метода VKApi.audio().save() приложение передает серверу полученные данные (server, audio и hash) и получает данные о загруженной аудиозаписи.
Собственный фотосервер
Картинки можно загружать без POST-запросов простыми методами VKApi.uploadWallPhotoRequest и VKApi.uploadAlbumPhotoRequest. Названия говорят сами за себя. Для собственного «инстаграма» VKApi.uploadAlbumPhotoRequest более предпочтителен, так как фотографии нужно размещать по альбомам, а не скидывать их на стену в живописном хаосе.
VKRequest request = VKApi.uploadWallPhotoRequest(VKUploadImage image, int user_id, int group_id);
VKRequest request = VKApi.uploadAlbumPhotoRequest(VKUploadImage image, int album_id, int group_id);
VKRequest request = VKApi.uploadWallPhotoRequest(File image, int user_id, int group_id);
VKRequest request = VKApi.uploadAlbumPhotoRequest(File image, int album_id, int group_id);
При загрузке фото на свою стену или стену группы user_id == 0, иначе — id пользователя, на стену которого будем загружать фото.
При загрузке фото на стену или в альбом группы group_id == id целевой группы, иначе group_id == 0 (например, загрузка фото в свой альбом). В album_id, соответственно, — идентификатор фотоальбома.
MyVKDoc
Для загрузки документов нам понадобятся VKApi.docs().uploadDocRequest() или VKApi.docs().uploadWallDocRequest для «настенной» документации. Ну а дальше, как обычно, выполняем VKApi.wall().post с параметрами, пришедшими от VKApi.docs().uploadWallDocRequest.
Заключение
Как видно, VK API дает нам большой простор для творчества. Совершенно бесплатное хранилище данных — не об этом ли мечтает каждый мобильный программист? 🙂 В следующей статье на примере Android-клиента для группы мы подробно рассмотрим, как можно забирать данные с открытой стены.