Работа с Web API в Mathematica
Общее количество использованных в посте встроенных функций или символов: 140
Список имен используемых встроенных функций и символов в порядке их появления в коде:
CompoundExpression (;) | Set (=) | Function (&) | Short | Slot (#) | URLFetch | Rule (->, ->) | List ({...}) | SetDelayed (:=) | Pattern (:) | Blank (_) | String ("...") | BlankNullSequence (___) | StringJoin (<>) | StringSplit | Alternatives (|) | Part ([[…]]) | Plus (+) | ToExpression | ToString | Row | Span (;;) | StringTake | Map (/@) | DeleteCases | StringReplace | Transpose | Sort | Tally | All | Greater (>) | Panel | Pane | Rotate | BarChart | ChartLabels | Placed | Style | Bold | Axis | Times (*, ×) | Degree | ColorFunction | ColorData | ImageSize | AspectRatio | Power (^) | GridLines | None | Range | GridLinesStyle | Dashed | PlotRangePadding | PlotRange | Automatic | Ticks | Pi (π) | BarSpacing | Scrollbars | False | True | Cases | RuleDelayed (:>, :->) | Condition (/;) | Quiet | Check | If | Equal (==) | Import | Not (!, ¬) | MatchQ | ReplaceAll (/.) | Image | PopupWindow | TableForm | WindowSize | ImageDimensions | Show | ParametricPlot | Cos | Sin | Length | PlotStyle | Thick | RGBColor | Graphics | Table | Inset | Background | Black | Axes | StringCases | StringExpression (~~) | BlankSequence (__) | Floor (⌊...⌋) | Apply (@@) | Join | Partition | Flatten | And (&&, ∧) | NumericQ | FileNameJoin | NotebookDirectory | FileExistsQ | Get (<<) | Dynamic | ProgressIndicator | Pause | $Failed | DumpSave | Real | Complement | CountryData | Lighter | Gray | EdgeForm | GrayLevel | Thickness | Increment (++) | Mod | AbsolutePointSize | Point | Reverse | SphericalPlot3D | PlotPoints | Mesh | TextureCoordinateFunction | Texture | Specularity | White | Lighting | Boxed | ViewVertical | ViewPoint | Graphics3D | Darker | Tube | BoxRatios | ViewCenter | ViewAngle
Список имен используемых встроенных функций и символов в порядке их появления в коде:
CompoundExpression (;) | Set (=) | Function (&) | Short | Slot (#) | URLFetch | Rule (->, ->) | List ({...}) | SetDelayed (:=) | Pattern (:) | Blank (_) | String ("...") | BlankNullSequence (___) | StringJoin (<>) | StringSplit | Alternatives (|) | Part ([[…]]) | Plus (+) | ToExpression | ToString | Row | Span (;;) | StringTake | Map (/@) | DeleteCases | StringReplace | Transpose | Sort | Tally | All | Greater (>) | Panel | Pane | Rotate | BarChart | ChartLabels | Placed | Style | Bold | Axis | Times (*, ×) | Degree | ColorFunction | ColorData | ImageSize | AspectRatio | Power (^) | GridLines | None | Range | GridLinesStyle | Dashed | PlotRangePadding | PlotRange | Automatic | Ticks | Pi (π) | BarSpacing | Scrollbars | False | True | Cases | RuleDelayed (:>, :->) | Condition (/;) | Quiet | Check | If | Equal (==) | Import | Not (!, ¬) | MatchQ | ReplaceAll (/.) | Image | PopupWindow | TableForm | WindowSize | ImageDimensions | Show | ParametricPlot | Cos | Sin | Length | PlotStyle | Thick | RGBColor | Graphics | Table | Inset | Background | Black | Axes | StringCases | StringExpression (~~) | BlankSequence (__) | Floor (⌊...⌋) | Apply (@@) | Join | Partition | Flatten | And (&&, ∧) | NumericQ | FileNameJoin | NotebookDirectory | FileExistsQ | Get (<<) | Dynamic | ProgressIndicator | Pause | $Failed | DumpSave | Real | Complement | CountryData | Lighter | Gray | EdgeForm | GrayLevel | Thickness | Increment (++) | Mod | AbsolutePointSize | Point | Reverse | SphericalPlot3D | PlotPoints | Mesh | TextureCoordinateFunction | Texture | Specularity | White | Lighting | Boxed | ViewVertical | ViewPoint | Graphics3D | Darker | Tube | BoxRatios | ViewCenter | ViewAngle
Web API является весьма полезной вещью, позволяющей, чаще всего в формате JSON, получать информацию по запросам определенного типа от сайтов, скажем ВКонтакте или Google Maps. Само собой, эту информацию можно затем обрабатывать в самых разных направлениях, скажем выявляя закономерности в наборе данных или строя инфографику, которая может помочь проиллюстрировать факты.
В данном посте я опишу основные идеи взаимодействия с Web API в системе Mathematica на нескольких примерах, связанных со страницей сообщества Русскоязычной поддержки Wolfram Mathematica в ВКонтакте.
Первые шаги
Для работы с API ВКонтакте часто нужно иметь так называемый маркер доступа, или access_token. Для того, чтобы получить его вам потребуется создать новое Standalone-приложение, сделать это можно перейдя по ссылке:
После того, как новое приложение создано, потребуется привязать его к некоторой группе (опционально), и загрузить аватар и т. п.
Главное на данном этапе то, что вы получаете ID приложения, которое потребуется позже.
После того, как этот шаг проделан, потебуется в вашем браузере перейти по ссылке, которая устроена следующим образом:
После того, как вы перешли по этой ссылке и прошли авторизацию, вы получите в строке вашего браузера ссылку, которая будет иметь примерно следующий вид:
Самый важный фрагмент полученной ссылки это и есть маркер доступа – access_token. Остальные параметры: 86400 – время работы маркера доступа (1 сутки); 775360 – ID человека ВКонтакте, для которого работает маркер доступа.
После получения маркера доступа можно приступить к работе с API с помощью функции URLFetch.
Простейшее взаимодействие с API Вконтакте
Взаимодействие с API достаточно просто. Оно осуществляется через функцию URLFetch. Синтаксис имеет следующий вид:
Как видно, для работы с API потребуется знать названия существующих методов и их параметров. Узнать их можно на официальной странице “Описание методов API” сайта.
В качестве первого примера получим ID всех участников сообщества Русскоязычной поддержки Wolfram Mathematica. Для этой цели служит метод groups.getMembers, у него есть параметр gid соответствующий ID сообщества или его названию.
Для работы здесь и далее потребуется значение маркера доступа, присвоим переменной с соответствующим именем его значение (в целях безопасности полученный мной access_token я не приведу):
закрыть
Теперь найдем ID участников сообщества (здесь и далее для соответсвующих промежуточных результатов будет применяться функция Short, показывающая только часть очень длинного однотипного результата):
закрыть
Для укорочения дальнейшего кода, создадим функцию WMVkAPI, которая упростит обращение к API ВКонтакте:
закрыть
закрыть
Первое использование API
Теперь немного поработаем с API.
Для начала, получим ID всех участников сообщества в виде строки и присвоим соответствующей переменной ее значение (в целом, это было сделано ранее):
закрыть
закрыть
Выцепим ID первых 400 участников, для этого нам потребуется функция StringSplit, которая разделяет строку на несколько строк в тех местах, которые соответствуют некоторому шаблону.
Для начала разделим строку в месте, где встречаются квадратные скобки (они ограничивают список ID страниц пользователей):
закрыть
Выделим необходимую нам информацию:
закрыть
Теперь разделим строку в местах, где встречаются запятые:
закрыть
Мы получили список ID, правда это не числа, а строки. Преобразовывать строки в числа нам сейчас не нужно, однако, если это потребуется, осуществить это можно например так:
закрыть
Для первого примера возьмем первые 400 ID и преобразуем их в тот же самый формат, который был — строка из чисел, разделенных запятыми:
закрыть
закрыть
С помощью метода users.get (имеющего параметр uids — список ID страниц пользователей) получим строку, содержащую имена пользователей с заданными ID:
закрыть
закрыть
Аналогично показанному ранее, выделим имена пользователей вместе с ID:
закрыть
закрыть
Теперь можно, например, провести анализ имен первых 400 участников из списка:
закрыть
Получим фото пользователей, находящихся в нашем списке, чей ID больше, скажем, 100 000 000:
закрыть
Найдем ссылки на аватары пользователей с заданными выше ID с помощью метода users.get и параметров uids и fields:
закрыть
закрыть
Выцепим ссылки на аватары пользователей и импортируем их:
закрыть
Выделим только пользователей с загруженными ими аватарами:
закрыть
Создадим интерактивный коллаж:
закрыть
закрыть
После нажатия на любой из аватаров, вы увидите его увеличенное изображение с именем участника сообщества:
Решение сложной задачи через API
Теперь решим более сложную задачу — отобразим на карте все города, в которых живут участники сообщества.
Для начала установим текущие количество участников сообщества:
закрыть
Теперь импортируем ID всех участников сообщества. Так как API ВКонтакте выдает не более 1000 ID за раз, то придется импортировать информацию о ID кусками, для этого служит параметр offset метода groups.getMembers:
закрыть
закрыть
Из полученных строк с ID выцепим все имеющиеся ID:
закрыть
закрыть
Разобьем этот список на подсписки, содержащие не более 400 ID (это снова связан с ограничениями на работу API ВКонтакте), после чего преобразуем их к стандартному формату (ID разделенные запятыми в строке):
закрыть
закрыть
С помощью метода users.get подгрузим информацию о городах и странах в которых проживают участники сообщества, для этого нам потребуется параметр fields. Также структурируем информацию, подсчитав количество участников, живущих в разных городах и странах.
закрыть
К сожалению, ВКонтакте не выдает название города и страны сразу. Оно зашифровано номером. Нам же потребуются привычные названия, их можно получить применив методы places.getCountryById и places.getCityById у которых есть параметр cids — список ID городов (стран):
получение строки, содержащей названия стран:
закрыть
получение списка, содержащего названия стран из полученной выше строки:
закрыть
получение строки, содержащей названия городов:
закрыть
получение списка, содержащего названия городов из полученной выше строки (причем каждое название представлено в виде правила замены ID города на его название)
закрыть
подстановка полученных выше правил замены в список ID городов
закрыть
выцепление всех городов, которые имеют название (не все ID имеют свое название)
закрыть
Так как API ВКонтакте выдает название города на русском языке, это означает, что у нас нет возможности использовать напрямую функцию CityData, с помощью которой можно получать напрямую различную информацию о городах на основе курируемых данных Wolfram Research. Поэтому придется обратиться к API Google Maps, чтобы по названию на русском языке получить координаты соответствующего города, для того, чтобы потом использовать их. Для этого создадим специальную функцию cityInformation (она запоминает свои значения для того, чтобы не проводить их повторно), которая обращается к API Google Maps, выдавая на выходе широту и долготу точки (города):
закрыть
Теперь найдем координаты всех городов, при этом после окончания расчета сформируем дамп-файл, в который поместим все значения функции cityInformation (код устроен так, что если дамп файл уже есть, то он будет подгружен автоматически и после перезаписан, в том случае если добавились новые определения, если файл дампа Mathematica не существует — то он будет сформирован).
закрыть
закрыть
закрыть
закрыть
закрыть
Сформируем список, содержащий списки вида:
{название города, его координаты, количество участников}
закрыть
закрыть
Отобразим на карте города и страны в которых живут участники сообщества:
закрыть
закрыть
закрыть
Увеличим фрагмент карты, соответствующей Европейской части России:
закрыть
После того, как мы создали карту, ее можно преобразовать в глобус:
закрыть
Или в иную инфографику: скажем, превратить плоскую карту в трехмерную и отметить на ней столбиками количество человек, проживающих в том или ином городе.
закрыть
Блог принадлежит “Русскоязычной поддержке Wolfram Mathematica"©
При любом использовании материалов блога, ссылка на блог обязательна.
Создано с помощью Wolfram Mathematica 9
При любом использовании материалов блога, ссылка на блог обязательна.
Создано с помощью Wolfram Mathematica 9
Комментариев нет:
Отправить комментарий