MATLAB WEB API для работы с веб-сервисами
Представляем вам фреймворк для работы с вебсервисами и соцсетями - MATLAB WEB API.
Он уже поддерживает работу с такими сервисами как Bing Maps, OpenWeatherMap, VK, порталом "Открытые данные России" и другими.
Кроме того фреймворк позволяет создавать библиотеки для работы с любыми другими веб-сервисами, в том числе с авторизацией через OAuth1.0/2.0.
Давайте подробнее разберем, зачем он нужен и как с ним работать
Полный список поддерживаемых сервисов (некоторые имеют частичную поддержку)
- Bing Maps - картографический сервис
- Data.gov.ru - открытые данные России
- Flickr - фотохостинг
- HeadHunter - сервис поиска работы
- ip-api.com - геолокация оп IP
- NetSuite - CRM-система
- OpenWeatherMap - сервис погоды
- REST Countries - информация о странах
- uinames.gotry.ml - генератор случайных имён
- VK - российская социальная сеть
Зачем это нужно?
Предположим, нам нужно провести глобальный анализ стран, но для этого нам сначала нужно получить подобную информацию обо всех странах в мире.
Для этого можно воспользоваться бесплатным веб-сервисом REST Countries. В его нехитрой документации подробно описано, как составлять запросы для получения нужных данных.
Например, чтобы получить информацию обо всех странах мира, надо выполнить GET-запрос по адресу https://restcountries.eu/rest/v2/all. Вы можете перейти по этому адресу в бразуере и увидите информацию обо всех странах и территориях в формате JSON.
Впрочем, намного эффективнее будет получить эти данные напрямую в MATLAB, поскольку он автоматически парсит JSON. Для этого можно воспользоваться стандартной функцией webread:
r1 = webread('https://restcountries.eu/rest/v2/all')
В переменную r будет записан большой массив структур из 250 элементов. Именно столько стран и территорий поддерживает сервис REST Countries.
r =
250×1 struct array with fields:
name
topLevelDomain
alpha2Code
alpha3Code
callingCodes
capital
...
На самом деле, работать с массивом структур не очень удобно, но все же можно. Например, вытащим информацию о площади для каждой страны:
area1 = [r1.area];
Интересен тот факт, что в векторе area1 получается 240 элементов (при 250 странах в исходных данных), а значит, для 10 стран информация о площади отсутствует.
Ну и построим гистограмму площадей всех стран:
histogram(area1)
Если нам нужно получить не всю информацию, а только определенные поля, мы должны передать список полей отдельным параметром запроса:
r2 = webread('https://restcountries.eu/rest/v2/all', 'fields', 'name;capital;region;population;area')
Интересно, что в этом случае мы получим на массив структур, а массив ячеек со структурами оО
r2 =
250×1 cell array
{1×1 struct}
{1×1 struct}
{1×1 struct}
{1×1 struct}
...
Вот такой формат для работы совсем не удобен. Не конец света, конечно, но чтобы вытащить данные из ячеек, надо постараться. Возможно, самым простым вариантом будет написать цикл, который проходится по массиву и извлекает данные из каждой ячейки.
И на самом деле, вот такое непостоянство формата данных, которые возвращает webread - это проблема. То структуры, то ячейки... Приходится это учитывать в алгоритмах.
Благо, все уже учтено в MATLAB WEB API, который имеет библиотеку для работы с REST Countries.
Для начала создаем объект API WEB.RESTCountries
rc = WEB.RESTCountries;
Затем обращаемся к встоенному методу all для получения информации обо всех странах.
r3 = rc.all('fields', 'name;capital;region;population;area')
В результате мы получим не ячейки и даже не массив структур, а сразу таблицу MATLAB (table), с которой работать гораздо удобнее и приятнее.
r3 =
250×5 table
name capital region population area
___________________________ _____________________ __________ __________ ________
'Afghanistan' 'Kabul' 'Asia' 2.7657e+07 6.5223e+05
'Åland Islands' 'Mariehamn' 'Europe' 28875 1580
...
И построим гистограмму по регионам, посмотрим, где больше всего стран сосредоточилось:
histogram(categorical(r3.region))
MATLAB WEB API имеет и другие функции для работы с REST Countries: byCode(), byCurrency(), byName(), byRegion().
Как видите, работать с MATLAB WEB API намного удобнее, чем с использованием стандартной функции webread.
Оценить работу с другими сервисами вы можете благодаря встроенным примерам. Подробнее об установке и использовании читайте на странице проекта.
А также обязательно посмотрите видео о выгрузке и анализе данных из соцсети ВКонтакте (VK)
P.S. Приглашаем всех энтузиастов присоединиться к разработке MATLAB WEB API. Работы предстоит еще много - от улучшения поддержки имеющихся сервисов до добавления новых. Это отличный шанс для вас попрактиковаться в программировании в MATLAB на реальной интересной задаче вместе с инженерами ЦИТМ "Экспонента".
Комментарии
Попытался подключиться к вк в matlab через web api по примеру, передавая scope=all и после разрешения приложению доступа к личной ифнормации, появилась оишбка: "vk api {"error":"invalid_request","error_description":"This application has no right to use messages"}". Как выяснилось - ВК изменила политику по отношению доступа приложениям к сообщениям.
Для избежания ошибки необходимо передавать нужные права в аргумент ф-ии или в коде vk.m удалить message, как передаваевый аргумент структуры для scope.
Также для избежания другой ошибки необходимо передать секретный ключ (защищенный ключ приложения).
Спасибо! Если вам интересно, можете обновить пример vk_example.m и сделать Pull Request на гитхабе.
Добрый день.
Интересная библиотека, работаю с ней уже продолжительное время. Тем не менее, возникают проблемы при работе с ней. На данный момент имею следующие 2 проблемы:
1. когда вызываю команду x = vk.users_getSubscriptions(id), то для конкретного id он возвращает 32 группы, хотя по факту человек имеет 93 подписки.
Связался с техподдержкой ВК - они выполнили то же самое, однако все 93 группы возвращаются. Причем в возвращаемом объекте response эти самые 32 группы содержатся в поле users, а остальные 61 группа - в поле groups. Получается, функция users_getSubscriptions пропускает поле groups объекта response.
Прошу внести изменения в функцию users_getSubscriptions, чтобы она просматривала объект response полностью.
Конкретный id могу сообщить лично.
P.S. Если в vk.users_getSubscriptions передать getAll = true, то программа в любом случае выдает ошибку (VK.m, строка 94: if getAll && (count>=1000))
текст ошибки: Operands to the logical and and or operators must be convertible to logical scalar values. Причина: в момент проверки условия count == []
2. Не могу извлечь аудиозаписи пользователя (группа и название трека) или хотя бы найти соответствующую функцию в MATLAB WEB API. Хотя в той же документации VK API сказано, что доступ к аудиозаписям пользователя закрыт с 2016 года. Так ли это и возможно создать соответствующую функцию в MATLAB WEB API?