что такое longpoll api

Простая реализация long polling механизма на PHP

Теория

Итак, что же из себя представляет Long Polling?
Выглядит это примерно следующим образом:
1) Клиент отсылает на сервер обычный ajax-запрос
2) Сервер, вместо того, чтобы быстро обработать этот запрос и отправить ответ клиенту, запускает цикл, в каждой итерации которого следит за возникновением событий (другой клиент добавил запись или удалил).
3) При возникновении события сервер генерирует ответ и отсылает его клиенту, таким образом завершая запрос.
4) Клиент, получив ответ от сервера, запускает обработчик события и параллельно отправляет очередной «длинный» запрос серверу.

То есть всё довольно просто и понятно. Однако, при реализации возникает несколько вопросов, которые нужно решить.

Шаги к практике

В первую очередь возникает вопрос о том, как скрипты будут взаимодействовать друг с другом. Ведь на каждый запрос клиента к серверу создаётся независимая копия PHP-скрипта. То есть нужна какая-то общая память для хранения данных о событиях.
Традиционный вариант — запускается демон, который оперирует событиями и держит соединение с клиентами. Использование демона естественным образом решает проблему памяти. Клиенты обращаются для получения событий не на веб-сервер, а к демону. В то же время, клиент, инициализирующий событие, также сообщает демону, что произошло событие. И таким образом всё крутится в памяти этого демона. который вообще может быть написан на чём угодно.
Но нам, в виду шила в одном месте и желания обойтись без сторонних приложений, демон на чём угодно не подойдёт. А писать демона на PHP, на мой вкус, не слишком интересно. У хостера могут быть проблемы с изменением максимального времени работы скрипта, а ещё продумывать интерфейсы взаимодействия клиентов с этим демоном… Нет, мы пойдём другим путём.
А остаётся только решить, как реализовать общую память в самом PHP. В голову приходят варианты хранения событий в файлах и БД, но хочется-то, чтобы всё было поближе — в памяти. Memcache нам, увы недоступен, а что тогда делать? А есть в php такое понятие как shared memory, точнее понятие-то не является особенностью этого языка, но нам дают возможность этим пользоваться. Механизмы этой технологии позволяют нам создать ячейку в оперативной памяти и использовать её в своих целях. Вот её я и буду использовать.

Практика

Попробуем представить интерфейс класса, который будет реализовывать нужный нам функционал.
Какие нужны методы?
1) Естественно, метод «прослушки», который будет вызываться, когда клиенты будут посылать polling-запросы, и следить за возникающими событиями. Я назвал этот метод listen.
2) Кроме того нам понадобится метод, который будет создавать событие. Этот метод носит имя push.
3) Вполне вероятно, что мы захотим обработать данные о событии, прежде чем отправить результат клиенту. Поэтому я добавил метод, который регистрирует событие и связывает с ним обработчик. Называется метод registerEvent.

В итоге получаем такой интерфейс класса:

Несколько примечаний:
1) В методе registerEvent поддерживается только по одному обработчику на событие по причине того, что возвращаемое обработчиком значение возвращается клиенту как данные события. В одном обработчике можно вызвать несколько функций и из результата их работы собрать ответ клиенту. Впрочем переделать код для поддержки нескольких обработчиков можно без особых затруднений.
2) В методе listen используется параметр lastQueryTime, который позволяет обработать события, возникшие раньше, чем поступил запрос на прослушку. Это может пригодиться когда нагрузка на сеть высока и между завершением одного polling-запроса от клиента и началом другого может пройти заметный промежуток времени, в который возникают события.
3) В приведённом коде не учитывается одновременный доступ к памяти. А вообще. для более надёжной работы желательно использовать семафоры.
4) В методе listen используется вызов функции sleep(1). Это нужно для того, чтобы уменьшить количество холостых итераций. Частоты обновления раз в секунду вполне достаточно для имитации реалтайма.

Ну и на клиенте всё также предельно просто. Нам нужен метод, который будет посылать polling-запрос серверу, ждать ответ, запускать обработчики событий и заново посылать запрос. Ну и метод, регистрирующий сами обработчики событий.

Исходники:
Описанный класс Polling на PHP.
Если кому-нибудь понадобится, приведу в порядок и выложу клиентскую часть.

Источник

Пишем чат бота для ВКонтакте на python с помощью longpoll

Сейчас боты стали обыденностью и находятся на каждом шагу, но если тебе нужен свой бот в социальной сети вконтакте, то это легко реализовать.

Ну прям совсем для новичков

Как оно работает?

Long Polling — это технология, которая позволяет получать данные о новых событиях с помощью «длинных запросов». Сервер получает запрос, но отправляет ответ на него не сразу, а лишь тогда, когда произойдёт какое-либо событие (например, придёт новое сообщение), либо истечёт заданное время ожидания.

Говоря русским языком, мы отправляем на сервер запрос, а он в свою очередь тыкает вконтакте если там произойдёт что либо, например, нам придёт сообщение он бежит и говорит об этом нам. От этого и будем плясать.

Техническая реализация

Для начала нам нужно доказать вконтакту что мы — это мы, а не кто-либо ещё. Делается это очень просто.

Замечание, ребята из ВК рекомендуют использовать в качестве логина номер телефона т.к. иначе можно нарваться на проверку антиробот, ту самую где тебя просят ввести недостающие цифры из номера телефона.

Если бот будет сидеть в группе то авторизация выглядит по другому.

— Что такое токен?
— Такая штука из циферок и буковок которую нужно получить в настройках группы. Для этого достаточно открыть раздел «Управление сообществом» («Управление страницей», если у Вас публичная страница), выбрать вкладку «Работа с API» и нажать «Создать ключ доступа».

Теперь вызовем longpool.

В сообщениях может быть не только заданный вами текст. Например:

А ещё можно прикреплять картинки.

Можно придумать ещё много всего интересного, но тут подумайте сами, а я лишь скажу что: ссылки можно делить на части. Например:

и никто не запретил нам получать ответ от пользователя на примере Википедии:

Ссылки на примеры и документацию

На этом я с вами попрощаюсь. Хорошего кодинга.

Источник

Что такое longpoll api

Документация написана для 10 версии LongPoll.

Отказ от ответственности

Автор не несет ответственности за точность, полноту или качество предоставленной информации. Используйте последующую информацию на свой страх и риск.

6.7. Создаваемые Пользователями приложения API должны использовать только опубликованные на Сайте методы API, а также ID, защищенный ключ и сервисный ключ доступа, указанные в настройках данных приложений. Использование других методов API, а также ID, защищенного ключа и сервисного ключа доступа приложений API третьих лиц, в т.ч. приложения API Администрации Сайта, строго запрещено. Пользователь обязуется регулярно проверять перечень разрешённых методов и незамедлительно вносить корректировки в функциональность своих приложений API в соответствии с изменениями перечня. За нарушение настоящего пункта Пользователь несет предусмотренную применимым законодательством, настоящими Правилами и иными документами Администрации Сайта ответственность. Администрация Сайта при этом оставляет за собой право на защиту собственных прав и законных интересов.

Подробнее про данную технологию можно прочитать здесь.

Ссылка для запроса составляется следующим образом:

В JS ссылку можно составить следующим образом:

После выполнения запроса сервер вернет ответ следующего вида:

После обработки ответа нужно повторить запрос, перед этим заменив ts и pts на новые из ответа.

Получение истории событий

Для получения истории мы будем использовать метод messages.getLongPollHistory с указанием следующих параметров:

Ответ выглядит следующим образом:

Структура этих событий выглядит так:

Подробнее про некоторые части структуры можно почитать здесь:

Структура описывает массив, ключи используются только для описания значений

В очень редких случаях может прийти урезанный вариант сообщения

Он приходит, если сообщение на момент возвращения событий уже было удалено для всех. Его следует игнорировать, потому что после него приходит событие удаления сообщения, которое удалит сообщение с вашей стороны, если оно уже было сохранено

Событие 2. Установка флагов сообщения

Событие приходит как при прослушивании собеседником вашего голосового сообщения, так и при прослушивании вами голосового сообщения собеседника.

Событие 3. Сброс флагов сообщения

В 3 и 4 случаях возвращается сообщение.

Событие 4. Новое сообщение

Данное событие возвращает новое сообщение.

Событие 5. Редактирование сообщения

Данное событие возвращает отредактированное сообщение.

Событие 6. Прочтение входящих сообщений

Событие 7. Прочтение исходящих сообщений

Событие 8. Друг появился в сети

Событие не приходит, если у друга включена невидимка хотя бы для одного пользователя.

Событие 9. Друг вышел из сети

Событие не приходит, если у друга включена невидимка хотя бы для одного пользователя.

Событие 10. Сброс флагов беседы

Все возможные флаги описаны в 12 событии

Событие 12. Установка флагов беседы

Возможные флаги беседы:

Событие 13. Удаление всех сообщений в диалоге

В беседе peerId были удалены все сообщения до messageId включительно.

Событие 18. Обновление сообщения

Приходит при следующих событиях:

Данное событие возвращает сообщение.

Событие 19. Сброс кеша сообщения

Приходит в двух случаях:

Событие 20. Закрепление и открепление беседы (изменился majorId)

Событие 21. Изменился minorId

Для 10 версии LongPoll событие приходит только в методе messages.getLongPollHistory

В версиях LongPoll выше 10 событие приходит еще в некоторых сценариях, но это будет подробно расписано только при обновлении документации на новую версию LongPoll

minorId означает id последнего сообщения в беседе, но с одним отличием. В фантомном чате последнее сообщение может исчезнуть, и чтобы диалог после этого полностью не пропал из списка, minorId сохраняет в себе id последнего даже исчезнувшего сообщения.

Событие 51. Изменение данных чата (устарело)

Событие означает, что в беседе chatId изменились какие-то данные. Более подробно все расписано в 52 событии.

Событие 52. Изменение данных чата

При изменении названия ( 1 ) и обновлении аватарки беседы ( 2 ) нужные данные можно взять из сервисного сообщения в 4 событии.

Событие 63. Статус набора сообщения

Событие 64. Статус записи голосового сообщения

Вызывается при записи голосового сообщения.
Идентичен событию 63.

Событие 65. Статус загрузки фотографии

Вызывается при загрузке фотографии.
Идентичен событию 63.

Событие 66. Статус загрузки видеозаписи

Вызывается при загрузке видеозаписи.
Идентичен событию 63.

Событие 67. Статус загрузки файла

Вызывается при загрузке файла.
Идентичен событию 63.

Событие 80. Изменение количества непрочитанных диалогов

Событие 81. Изменение состояния невидимки друга

Событие 114. Изменение настроек пуш-уведомлений в беседе

Для работы необходимо использовать в mode флаг 8 при выполнении запроса.

Событие 115. Звонок

Для работы необходимо использовать в mode флаг 8 при выполнении запроса.

Событие 119. Ответ callback-кнопки

Для работы необходимо использовать в mode флаг 8 при выполнении запроса.

Callback-кнопки работают следующим образом:

Параметры метода messages.sendMessageEvent :

Маской называют сумму некоторых флагов (степеней двойки), которую можно использовать как хорошую замену для объектов или массивов.

НазваниеОписаниеБитЗначение
unreadНепрочитанное сообщение11
outboxИсходящее сообщение12
importantВажное сообщение18
chat_vkcomОтправка сообщения в беседу через vk.com116
friendsИсходящее; входящее от друга в лс132
spamПометка сообщения как спам164
deletedУдаление сообщения локально1128
audio_listenedПрослушано голосовое сообщение14096
chatОтправка сообщения в беседу18192
cancel_spamОтмена пометки как спам132768
old_minor_idСообщение не поднимает диалог вверх165536
deleted_allУдаление сообщения для всех1131072
not_deliveredВнутренний флаг1262144
chat_inВходящее сообщение в беседе1524288
silentСообщение без уведомления11048576
reply_msgОтвет на сообщение12097152
auto_readСообщение пришло сразу прочитанным18388608
has_ttlВнутренний флаг167108864

Бесшумное сообщение можно отправить, добавив к параметрам метода messages.send ключ silent: true :

not_delivered и has_ttl приходят для бизнес-уведомлений

Пример определения наличия флага в маске:

Сервисное сообщение описывается ключом source_act и ключами с дополнительными данными в объекте additional из структуры сообщения.

Возможные значения source_act :

Пример описания сервисного сообщения:

Клавиатура для ботов

Клавиатура для ботов представляет собой объект с описанием ее типа и кнопок. Основная структура представлена ниже, остальную информацию можно узнать в документации.

Список существующих вложений

Однако названия вложений, полученных через LongPoll, могут не совпадать с теми, что приходят через API:

Вложение geo (прикрепленное местоположение) приходит в виде ключей geo и geo_provider вместо attach* (см. структуру). Также при получении сообщения через messages.getById ключ geo будет находиться не во вложениях, а в «корне» сообщения.

Работа с вложениями в LongPoll

Пример вложений, состоящих из фотографии, документа и аудиозаписи:

Обычно дополнительная информация о вложении не нужна, поэтому можно ограничиться получением названий вложений для предварительного отображения сообщения и анализа списка вложений, чтобы в случае необходимости получить сообщение через API.

Пример кода для получения массива с названиями вложений

Ответ на сообщение

Оптимизация получения вложений

При работе с вложениями можно попробовать найти необходимый элемент в документации, однако у некоторых вложений документация не обновлена или вовсе отсутствует.

Права доступа в беседах

В списке представлены все возможные параметры прав доступа с их флагом из 4 действия 52 события.

Зачем нужен random_id

Основная задача этого параметра заключается в гарантировании идемпотентности API для отправки сообщений. Это означает, что при отправке запросов с одинаковым random_id и, чаще всего, одинаковыми параметрами, сервер не будет создавать новое сообщение и вернет ID уже созданного. Про необходимость данной технологии с убедительными примерами рассказывается в данной статье.

Наверняка вы уже видели, что во всех мессенджерах ВКонтакте при отправке сообщения само сообщение отображается сразу, но около сообщения некоторое время видно иконку часов. Эта иконка означает, что запрос на сервер с новым сообщением отправлен, но сообщение еще не пришло обратно через LongPoll.

Чтобы реализовать подобную фичу, нужно определить, какое именно сообщение, приходящее из LongPoll, было только что отправлено. Для этого нужно:

Источник

Что такое longpoll api

Документация написана для 10 версии LongPoll.

Отказ от ответственности

Автор не несет ответственности за точность, полноту или качество предоставленной информации. Используйте последующую информацию на свой страх и риск.

6.7. Создаваемые Пользователями приложения API должны использовать только опубликованные на Сайте методы API, а также ID, защищенный ключ и сервисный ключ доступа, указанные в настройках данных приложений. Использование других методов API, а также ID, защищенного ключа и сервисного ключа доступа приложений API третьих лиц, в т.ч. приложения API Администрации Сайта, строго запрещено. Пользователь обязуется регулярно проверять перечень разрешённых методов и незамедлительно вносить корректировки в функциональность своих приложений API в соответствии с изменениями перечня. За нарушение настоящего пункта Пользователь несет предусмотренную применимым законодательством, настоящими Правилами и иными документами Администрации Сайта ответственность. Администрация Сайта при этом оставляет за собой право на защиту собственных прав и законных интересов.

Подробнее про данную технологию можно прочитать здесь.

Ссылка для запроса составляется следующим образом:

В JS ссылку можно составить следующим образом:

После выполнения запроса сервер вернет ответ следующего вида:

После обработки ответа нужно повторить запрос, перед этим заменив ts и pts на новые из ответа.

Получение истории событий

Для получения истории мы будем использовать метод messages.getLongPollHistory с указанием следующих параметров:

Ответ выглядит следующим образом:

Структура этих событий выглядит так:

Подробнее про некоторые части структуры можно почитать здесь:

Структура описывает массив, ключи используются только для описания значений

В очень редких случаях может прийти урезанный вариант сообщения

Он приходит, если сообщение на момент возвращения событий уже было удалено для всех. Его следует игнорировать, потому что после него приходит событие удаления сообщения, которое удалит сообщение с вашей стороны, если оно уже было сохранено

Событие 2. Установка флагов сообщения

Событие приходит как при прослушивании собеседником вашего голосового сообщения, так и при прослушивании вами голосового сообщения собеседника.

Событие 3. Сброс флагов сообщения

В 3 и 4 случаях возвращается сообщение.

Событие 4. Новое сообщение

Данное событие возвращает новое сообщение.

Событие 5. Редактирование сообщения

Данное событие возвращает отредактированное сообщение.

Событие 6. Прочтение входящих сообщений

Событие 7. Прочтение исходящих сообщений

Событие 8. Друг появился в сети

Событие не приходит, если у друга включена невидимка хотя бы для одного пользователя.

Событие 9. Друг вышел из сети

Событие не приходит, если у друга включена невидимка хотя бы для одного пользователя.

Событие 10. Сброс флагов беседы

Все возможные флаги описаны в 12 событии

Событие 12. Установка флагов беседы

Возможные флаги беседы:

Событие 13. Удаление всех сообщений в диалоге

В беседе peerId были удалены все сообщения до messageId включительно.

Событие 18. Обновление сообщения

Приходит при следующих событиях:

Данное событие возвращает сообщение.

Событие 19. Сброс кеша сообщения

Приходит в двух случаях:

Событие 20. Закрепление и открепление беседы (изменился majorId)

Событие 21. Изменился minorId

Для 10 версии LongPoll событие приходит только в методе messages.getLongPollHistory

В версиях LongPoll выше 10 событие приходит еще в некоторых сценариях, но это будет подробно расписано только при обновлении документации на новую версию LongPoll

minorId означает id последнего сообщения в беседе, но с одним отличием. В фантомном чате последнее сообщение может исчезнуть, и чтобы диалог после этого полностью не пропал из списка, minorId сохраняет в себе id последнего даже исчезнувшего сообщения.

Событие 51. Изменение данных чата (устарело)

Событие означает, что в беседе chatId изменились какие-то данные. Более подробно все расписано в 52 событии.

Событие 52. Изменение данных чата

При изменении названия ( 1 ) и обновлении аватарки беседы ( 2 ) нужные данные можно взять из сервисного сообщения в 4 событии.

Событие 63. Статус набора сообщения

Событие 64. Статус записи голосового сообщения

Вызывается при записи голосового сообщения.
Идентичен событию 63.

Событие 65. Статус загрузки фотографии

Вызывается при загрузке фотографии.
Идентичен событию 63.

Событие 66. Статус загрузки видеозаписи

Вызывается при загрузке видеозаписи.
Идентичен событию 63.

Событие 67. Статус загрузки файла

Вызывается при загрузке файла.
Идентичен событию 63.

Событие 80. Изменение количества непрочитанных диалогов

Событие 81. Изменение состояния невидимки друга

Событие 114. Изменение настроек пуш-уведомлений в беседе

Для работы необходимо использовать в mode флаг 8 при выполнении запроса.

Событие 115. Звонок

Для работы необходимо использовать в mode флаг 8 при выполнении запроса.

Событие 119. Ответ callback-кнопки

Для работы необходимо использовать в mode флаг 8 при выполнении запроса.

Callback-кнопки работают следующим образом:

Параметры метода messages.sendMessageEvent :

Маской называют сумму некоторых флагов (степеней двойки), которую можно использовать как хорошую замену для объектов или массивов.

НазваниеОписаниеБитЗначение
unreadНепрочитанное сообщение11
outboxИсходящее сообщение12
importantВажное сообщение18
chat_vkcomОтправка сообщения в беседу через vk.com116
friendsИсходящее; входящее от друга в лс132
spamПометка сообщения как спам164
deletedУдаление сообщения локально1128
audio_listenedПрослушано голосовое сообщение14096
chatОтправка сообщения в беседу18192
cancel_spamОтмена пометки как спам132768
old_minor_idСообщение не поднимает диалог вверх165536
deleted_allУдаление сообщения для всех1131072
not_deliveredВнутренний флаг1262144
chat_inВходящее сообщение в беседе1524288
silentСообщение без уведомления11048576
reply_msgОтвет на сообщение12097152
auto_readСообщение пришло сразу прочитанным18388608
has_ttlВнутренний флаг167108864

Бесшумное сообщение можно отправить, добавив к параметрам метода messages.send ключ silent: true :

not_delivered и has_ttl приходят для бизнес-уведомлений

Пример определения наличия флага в маске:

Сервисное сообщение описывается ключом source_act и ключами с дополнительными данными в объекте additional из структуры сообщения.

Возможные значения source_act :

Пример описания сервисного сообщения:

Клавиатура для ботов

Клавиатура для ботов представляет собой объект с описанием ее типа и кнопок. Основная структура представлена ниже, остальную информацию можно узнать в документации.

Список существующих вложений

Однако названия вложений, полученных через LongPoll, могут не совпадать с теми, что приходят через API:

Вложение geo (прикрепленное местоположение) приходит в виде ключей geo и geo_provider вместо attach* (см. структуру). Также при получении сообщения через messages.getById ключ geo будет находиться не во вложениях, а в «корне» сообщения.

Работа с вложениями в LongPoll

Пример вложений, состоящих из фотографии, документа и аудиозаписи:

Обычно дополнительная информация о вложении не нужна, поэтому можно ограничиться получением названий вложений для предварительного отображения сообщения и анализа списка вложений, чтобы в случае необходимости получить сообщение через API.

Пример кода для получения массива с названиями вложений

Ответ на сообщение

Оптимизация получения вложений

При работе с вложениями можно попробовать найти необходимый элемент в документации, однако у некоторых вложений документация не обновлена или вовсе отсутствует.

Права доступа в беседах

В списке представлены все возможные параметры прав доступа с их флагом из 4 действия 52 события.

Зачем нужен random_id

Основная задача этого параметра заключается в гарантировании идемпотентности API для отправки сообщений. Это означает, что при отправке запросов с одинаковым random_id и, чаще всего, одинаковыми параметрами, сервер не будет создавать новое сообщение и вернет ID уже созданного. Про необходимость данной технологии с убедительными примерами рассказывается в данной статье.

Наверняка вы уже видели, что во всех мессенджерах ВКонтакте при отправке сообщения само сообщение отображается сразу, но около сообщения некоторое время видно иконку часов. Эта иконка означает, что запрос на сервер с новым сообщением отправлен, но сообщение еще не пришло обратно через LongPoll.

Чтобы реализовать подобную фичу, нужно определить, какое именно сообщение, приходящее из LongPoll, было только что отправлено. Для этого нужно:

About

Документация для последней версии User LongPoll API

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *