Доброго времени суток, уважаемые жители Хабра!
Начну я с того, что, в моем понимании, Хабр — это чудовищное по своей мощности оружие. Не в смысле того, что им можно кого-то убить. Конечно, нет. Просто он дает самым обычным разработчикам возможность поделиться своими мыслями с потрясающе широкой аудиторией. Причем не имеет особого значения, о чем идет речь. Будь то бережно создаваемый в последние полгода “на коленке” собственный проект или новость о новинках от Google и Apple — все равно. Вас услышат, потому что здесь все равны перед кармой и рейтингом, у каждого есть право слова и голоса. Демократия во всей ее красоте да и только. Но, как и любым оружием, Хабром нужно пользоваться крайне аккуратно. Иначе отдача замучает =)
Я долго подбирал тему, достойную того, чтобы испытать всю силу хабравлияния, и вот, кажется, нашел. Давайте поговорим об API всем известной социальной сети ВКонтакте и о том, что в нем мне кажется нелогичным или, быть может, слегка рудиментарным, подлежащим пересмотру и изменению? Ниже я обязательно расскажу, как и почему пришел к такой мысли.
Внимание! Желающие обсудить последние события из жизни Павла Дурова, ФСБ или знакомых школьников! Прошу вас, ради всего ценного, что есть в вашей жизни, не нажимайте на ссылку “Читать далее”! Я бы очень хотел, чтобы этот пост достиг своей цели, а скандальность — последнее, что для этого нужно.
Социальные сети. Понятие, вошедшее в нашу жизнь так же плотно, как смартфон или компьютер. Миллионы пользователей. Гигабайты информации. Неисчислимое множество моделей применения. Социальные сети особенно ценны тем, что позволяют разработчикам постучаться к своим пользователям прямо в дверь: «Эй, привет! Посмотри какое классное приложение! Оно изменит твою жизнь к лучшему. Я обещаю!». Это потрясающе! В конце концов мы ведь именно для этого пишем программы? Чтобы делать мир лучше? Нет, конечно, нам нравится и то, что за нашу работу неплохо платят. Но душу греют не суммы на счету, а цифры на счетчике посещений.
Когда я впервые познакомился с API Вконтакте, мне показалось, что лучшей находки в моей карьере еще не было. Сколько невероятных идей пришло ко мне в голову с первых же строчек документации! Конечно, они не идут ни в какое сравнение по своей креативности, например, с вот этой. Но все же =) Тогда я сделал то, что сделал бы любой из вас на моем месте: начал увлеченно программировать. Однако будущее оказалось не таким безоблачным, как мне бы хотелось. За простым и изящным REST-интерфейсом крылись суровые и далеко не всегда мне понятные правила и ограничения.
Все методы API Вконтакте делятся на два больших класса: обычные и расширенные. Раньше это было видно прямо из документации: описания методов из разных классов находились в разных разделах, — но в результате последнего обновления различие визуально сгладилось. Теперь у тех методов, что раньше назывались расширенными, просто указано в описании, что они доступны исключительно для standalone-приложений: мобильных или десктопных. А если вы решили написать глубоко завязанное на ВК веб-приложение, которому требуется работать, скажем, со стеной или сообщениями пользователя? Тут вас поджидает разочарование.
Для работы с большинством методов VK API приложению потребуется токен. В общем случае процесс его получения выглядит так:
- Приложение отправлят пользователя на AUTHORIZE_URL, в параметрах указав CALLBACK_URL;
- Вконтакте переадресует пользователя на страницу, где он подтверждает права доступа приложения;
- Вконтакте переадресует пользователя на CALLBACK_URL, в параметрах передавая токен и срок его жизни;
- Приложение, получив запрос на CALLBACK_URL, понимает, что это от ВК, вытаскивает токен и запоминает его.
Однако, для того, чтобы получить токен, обеспечивающий доступ к расширенным методам, в качестве callback-адреса вам придется указать https://oauth.vk.com/blank.html. Таково требование API. Поскольку мобильные/декстопные приложения, по задумке авторов, используют для получения токена встроенный браузер (имеется в виду, например, компонент webkit), то у них проблем нет: отловил редирект, извлек информацию о пользователе и токен, сохранил все это дело и радуйся. У веб-приложений так, очевидно, не получится.
У меня возникает логичный вопрос: зачем? Почему было введено такое ограничение и почему оно существует до сих пор? Могу предположить, что доступность вызова произвольных методов с десктопов и мобильников имеет под собой простое обоснование: это толкает разработчиков на создание альтернативных клиентов и всевозможных мессенджеров. Так почему бы не убрать этот запрет для веба? К чему ставить лишние палки в колеса фантазии разработчиков? Отнюдь не все удобные и хорошие идеи можно и нужно поставлять как standalone, согласитесь? На волне повсеместного «ухода в облака» и создания веб-приложений, обладающих потрясающе широкой функциональностью и удобным UI на HTML5, это ограничение выглядит как-то… неудобно.
С вопросом: «А нельзя ли как-то все таки получить токен с нужными привелегиями, если я честный парень и клятвенно обещаю не рассылать спам, не создавать ботов и молиться правильным богам?», — я и обратился в службу поддержки Вконтакте. И мне, — тут барабанная дробь и виртуальный плюсик в карму ВК, — ответили, причем довольно быстро и вежливо.
Содержание ответа
Добрый день!
Мне очень жаль, но исключений мы не делаем.
Доступ к личным сообщениям с внешнего сайта нельзя получить ни при каких условиях.
Часть методов для работы с фотографиями в веб вполне работает, постить записи на стену можно с использованием окна подтверждения.
С уважением,
Команда поддержки ВКонтакте.
Мне очень жаль, но исключений мы не делаем.
Доступ к личным сообщениям с внешнего сайта нельзя получить ни при каких условиях.
Часть методов для работы с фотографиями в веб вполне работает, постить записи на стену можно с использованием окна подтверждения.
С уважением,
Команда поддержки ВКонтакте.
Тут бы, казалось, мне пойти курить и думать, какой бы хак посуровее вкрутить, чтобы таки заполучить нужный мне токен. Так бы и сделал, но неожиданно на меня снизошел дзен. Я решил попытаться что-то изменить. Проблема состоит в том, что API — это прежде всего интерфейс, предназначенный для сторонних разработчиков. Им пользуюсь не только я, но и тысячи других программистов, ежедневно клепающих всякие хаки и применяющих грязные трюки, чтобы решить очень простую и логичную задачу, принеся счастье и улыбки в дом конечного пользователя. Логично предположить, что эти самые разработчики должны иметь возможность как-то влиять на эволюцию инструмента, которым им предлагается пользоваться. Имеющееся сейчас разграничение на обычные и расширенные методы создает ощущение… ну… как от кофейного автомата, который почему-то не умеет выдавать сдачу: вроде кофе и можно купить, но придется всем отделом мелочь собирать.
Надеюсь, что мой скромный пост сподвигнет ВК как минимум к диалогу с разработчиками, а, в идеальном случае, и к снятию ограничений с веб-приложений. Ребята, искусственное ограничение возможностей — это и правда очень и очень неудобно.
UPD. Народ, кто считает, что все ок и так и должно быть или ставит минусы статье, отпишитесь в комментариях — почему? Правда интересно. Это ведь порядком ограничивает вашу свободу при разработке.
Only registered users can participate in poll. Log in, please.
А вам бы хотелось, чтобы веб-приложения имели равные с Desktop/Mobile права на вызов произвольных методов VK API?
38.87% Да, у меня куча идей, которым это ограничение мешает978
18.4% Нет, все правильно и пусть остается как есть463
42.73% Да мне как-то все равно, если честно1075
2516 users voted. 756 users abstained.